Big re-organization of repository [W.I.P]

This commit is contained in:
Yehonal
2016-08-11 20:25:27 +02:00
parent c62a72c0a8
commit 0f85ce1c54
3016 changed files with 1271 additions and 1 deletions

View File

@@ -1,427 +0,0 @@
/*
REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
*/
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "halls_of_lightning.h"
#include "ScriptedEscortAI.h"
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,
// 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
// 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,
// NPCs
NPC_STORMFORGED_LIEUTENANT = 29240,
// Models
EQUIP_SWORD = 37871,
EQUIP_SHIELD = 35642,
EQUIP_MACE = 43623,
};
enum BjarngrimEvents
{
EVENT_BJARNGRIM_CHANGE_STANCE = 1,
// 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,
// BATTLE STANCE
EVENT_BJARNGRIM_INTERCEPT = 31,
EVENT_BJARNGRIM_CLEAVE = 32,
EVENT_BJARNGRIM_SLAM = 33,
// STORMFORGED LIEUTENANT
EVENT_ARC_WELD = 41,
EVENT_RENEW_STEEL = 42,
};
enum Yells
{
SAY_AGGRO = 0,
SAY_DEFENSIVE_STANCE = 1,
SAY_BATTLE_STANCE = 2,
SAY_BERSERKER_STANCE = 3,
SAY_SLAY = 4,
SAY_DEATH = 5,
EMOTE_DEFENSIVE_STANCE = 6,
EMOTE_BATTLE_STANCE = 7,
EMOTE_BERSEKER_STANCE = 8,
};
class boss_bjarngrim : public CreatureScript
{
public:
boss_bjarngrim() : CreatureScript("boss_bjarngrim") { }
CreatureAI* GetAI(Creature* creature) const
{
return new boss_bjarngrimAI (creature);
}
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);
}
InstanceScript* m_pInstance;
EventMap events;
SummonList summons;
uint8 m_uiStance;
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);
}
me->RemoveAllAuras();
me->CastSpell(me, SPELL_TEMPORARY_ELECTRICAL_CHARGE, true);
RollStance(0, STANCE_DEFENSIVE);
if (m_pInstance)
m_pInstance->SetData(TYPE_BJARNGRIM, NOT_STARTED);
}
void EnterCombat(Unit*)
{
me->SetInCombatWithZone();
Talk(SAY_AGGRO);
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);
// 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);
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;
Talk(SAY_SLAY);
}
void JustDied(Unit*)
{
Talk(SAY_DEATH);
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 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);
me->CastSpell(me, SPELL_DEFENSIVE_STANCE, true);
me->CastSpell(me, SPELL_DEFENSIVE_AURA, true);
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);
me->CastSpell(me, SPELL_BERSERKER_STANCE, true);
me->CastSpell(me, SPELL_BERSERKER_AURA, true);
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);
me->CastSpell(me, SPELL_BATTLE_STANCE, true);
me->CastSpell(me, SPELL_BATTLE_AURA, true);
events.DelayEvents(20000, STANCE_BERSERKER);
events.DelayEvents(20000, STANCE_DEFENSIVE);
SetEquipmentSlots(false, EQUIP_MACE, EQUIP_UNEQUIP, EQUIP_NO_CHANGE);
break;
}
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 UpdateEscortAI(uint32 diff)
{
if (!me->IsInCombat())
return;
// Return since we have no target
if (!UpdateVictim())
{
Reset();
return;
}
events.Update(diff);
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;
///////////////////////////////////////////////////////
///// 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);
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();
}
};
};
class npc_stormforged_lieutenant : public CreatureScript
{
public:
npc_stormforged_lieutenant() : CreatureScript("npc_stormforged_lieutenant") { }
CreatureAI* GetAI(Creature* creature) const
{
return new npc_stormforged_lieutenantAI (creature);
}
struct npc_stormforged_lieutenantAI : public ScriptedAI
{
npc_stormforged_lieutenantAI(Creature* creature) : ScriptedAI(creature) { }
EventMap events;
uint64 BjarngrimGUID;
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 UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
events.Update(diff);
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);
events.RepeatEvent(10000 + rand()%4000);
break;
}
DoMeleeAttackIfReady();
}
};
};
void AddSC_boss_bjarngrim()
{
new boss_bjarngrim();
new npc_stormforged_lieutenant();
}

View File

@@ -1,271 +0,0 @@
/*
REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
*/
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "halls_of_lightning.h"
#include "SpellInfo.h"
#include "Player.h"
enum IonarSpells
{
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,
//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,
// Actions
ACTION_CALLBACK = 1,
ACTION_SPARK_DESPAWN = 2,
};
enum Yells
{
SAY_AGGRO = 0,
SAY_SPLIT = 1,
SAY_SLAY = 2,
SAY_DEATH = 3
};
enum IonarEvents
{
EVENT_BALL_LIGHTNING = 1,
EVENT_STATIC_OVERLOAD = 2,
EVENT_CHECK_HEALTH = 3,
EVENT_CALL_SPARKS = 4,
EVENT_RESTORE = 5,
};
class boss_ionar : public CreatureScript
{
public:
boss_ionar() : CreatureScript("boss_ionar") { }
CreatureAI* GetAI(Creature* creature) const
{
return new boss_ionarAI (creature);
}
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;
void Reset()
{
HealthCheck = 50;
events.Reset();
summons.DespawnAll();
me->SetVisible(true);
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);
}
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);
}
void EnterCombat(Unit*)
{
me->SetInCombatWithZone();
Talk(SAY_AGGRO);
if (m_pInstance)
m_pInstance->SetData(TYPE_IONAR, IN_PROGRESS);
ScheduleEvents(false);
}
void JustDied(Unit*)
{
Talk(SAY_DEATH);
summons.DespawnAll();
if (m_pInstance)
m_pInstance->SetData(TYPE_IONAR, DONE);
}
void KilledUnit(Unit* victim)
{
if (victim->GetTypeId() != TYPEID_PLAYER)
return;
Talk(SAY_SLAY);
}
void SpellHit(Unit* /*caster*/, const SpellInfo* spell)
{
if (spell->Id == SPELL_DISPERSE)
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);
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);
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
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);
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();
me->SetVisible(true);
me->SetControlled(false, UNIT_STATE_STUNNED);
ScheduleEvents(true);
return;
}
DoMeleeAttackIfReady();
}
};
};
class npc_spark_of_ionar : public CreatureScript
{
public:
npc_spark_of_ionar() : CreatureScript("npc_spark_of_ionar") { }
CreatureAI* GetAI(Creature* creature) const
{
return new npc_spark_of_ionarAI (creature);
}
struct npc_spark_of_ionarAI : public ScriptedAI
{
npc_spark_of_ionarAI(Creature* creature) : ScriptedAI(creature) { }
bool returning;
void MoveInLineOfSight(Unit*) { }
void UpdateAI(uint32) { }
void AttackStart(Unit* who) { }
void Reset() { returning = false; }
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();
me->RemoveAllAuras();
me->CastSpell(me, SPELL_SPARK_DESPAWN, true);
me->DespawnOrUnsummon(1000);
}
}
};
};
void AddSC_boss_ionar()
{
new boss_ionar();
new npc_spark_of_ionar();
}

View File

@@ -1,274 +0,0 @@
/*
REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
*/
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellScript.h"
#include "halls_of_lightning.h"
#include "Player.h"
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_PULSING_SHOCKWAVE_N = 52961,
SPELL_PULSING_SHOCKWAVE_H = 59836,
// Achievement
ACHIEVEMENT_TIMELY_DEATH = 20384
};
enum Yells
{
SAY_INTRO_1 = 0,
SAY_INTRO_2 = 1,
SAY_AGGRO = 2,
SAY_NOVA = 3,
SAY_SLAY = 4,
SAY_75HEALTH = 5,
SAY_50HEALTH = 6,
SAY_25HEALTH = 7,
SAY_DEATH = 8,
EMOTE_NOVA = 9
};
enum LokenEvents
{
EVENT_LIGHTNING_NOVA = 1,
EVENT_SHOCKWAVE = 2,
EVENT_ARC_LIGHTNING = 3,
EVENT_CHECK_HEALTH = 4,
EVENT_AURA_REMOVE = 5
};
class boss_loken : public CreatureScript
{
public:
boss_loken() : CreatureScript("boss_loken") { }
CreatureAI* GetAI(Creature* creature) const
{
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);
}
InstanceScript* m_pInstance;
EventMap events;
bool isActive;
uint32 IntroTimer;
uint8 HealthCheck;
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);
}
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);
}
}
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);
if (m_pInstance)
{
m_pInstance->SetData(TYPE_LOKEN, IN_PROGRESS);
if (me->GetMap()->IsHeroic())
m_pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_TIMELY_DEATH);
}
}
void JustDied(Unit*)
{
Talk(SAY_DEATH);
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 KilledUnit(Unit* victim)
{
if (victim->GetTypeId() != TYPEID_PLAYER)
return;
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;
}
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);
}
return;
}
//Return since we have no target
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
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.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);
events.RepeatEvent(12000);
break;
case EVENT_AURA_REMOVE:
me->RemoveAura(SPELL_LIGHTNING_NOVA_THUNDERS);
events.PopEvent();
break;
}
DoMeleeAttackIfReady();
}
};
};
class spell_loken_pulsing_shockwave : public SpellScriptLoader
{
public:
spell_loken_pulsing_shockwave() : SpellScriptLoader("spell_loken_pulsing_shockwave") { }
class spell_loken_pulsing_shockwave_SpellScript : public SpellScript
{
PrepareSpellScript(spell_loken_pulsing_shockwave_SpellScript);
void CalculateDamage(SpellEffIndex /*effIndex*/)
{
if (!GetHitUnit())
return;
float distance = GetCaster()->GetDistance2d(GetHitUnit());
if (distance > 1.0f)
SetHitDamage(int32(GetHitDamage() * distance));
}
void Register()
{
OnEffectHitTarget += SpellEffectFn(spell_loken_pulsing_shockwave_SpellScript::CalculateDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
}
};
SpellScript* GetSpellScript() const
{
return new spell_loken_pulsing_shockwave_SpellScript();
}
};
void AddSC_boss_loken()
{
new boss_loken();
new spell_loken_pulsing_shockwave();
}

View File

@@ -1,572 +0,0 @@
/*
REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
*/
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "halls_of_lightning.h"
#include "SpellInfo.h"
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,
//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,
// Misc
ACTION_SHATTER = 1,
ACTION_DESTROYED = 2,
// 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,
// Molten Golem
EVENT_BLAST = 11,
EVENT_IMMOLATION = 12,
};
enum Yells
{
SAY_AGGRO = 0,
SAY_FORGE = 1,
SAY_STOMP = 2,
SAY_SLAY = 3,
SAY_DEATH = 4,
EMOTE_TO_ANVIL = 5,
EMOTE_SHATTER = 6,
};
class boss_volkhan : public CreatureScript
{
public:
boss_volkhan() : CreatureScript("boss_volkhan") { }
CreatureAI* GetAI(Creature* creature) const
{
return new boss_volkhanAI (creature);
}
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;
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);
}
}
void EnterCombat(Unit*)
{
me->SetInCombatWithZone();
Talk(SAY_AGGRO);
if (m_pInstance)
m_pInstance->SetData(TYPE_VOLKHAN, IN_PROGRESS);
ScheduleEvents(false);
}
void JustDied(Unit*)
{
Talk(SAY_DEATH);
summons.DespawnAll();
if (m_pInstance)
m_pInstance->SetData(TYPE_VOLKHAN, DONE);
}
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 = -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;
}
}
void KilledUnit(Unit* victim)
{
if (victim->GetTypeId() != TYPEID_PLAYER)
return;
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 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);
}
}
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;
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);
// 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 GoToAnvil()
{
events.SetPhase(2);
HealthCheck -= 20;
me->SetSpeed(MOVE_RUN, 4.0f,true);
me->SetReactState(REACT_PASSIVE);
Talk(SAY_FORGE);
if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE)
me->GetMotionMaster()->MovementExpired();
events.ScheduleEvent(EVENT_MOVE_TO_ANVIL, 0, 0, 2);
}
void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
events.Update(diff);
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();
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
{
public:
npc_molten_golem() : CreatureScript("npc_molten_golem") { }
CreatureAI* GetAI(Creature* creature) const
{
return new npc_molten_golemAI (creature);
}
struct npc_molten_golemAI : public ScriptedAI
{
npc_molten_golemAI(Creature* creature) : ScriptedAI(creature)
{
m_pInstance = creature->GetInstanceScript();
}
EventMap events;
InstanceScript* m_pInstance;
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;
}
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);
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);
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;
events.Update(diff);
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;
}
DoMeleeAttackIfReady();
}
};
};
enum monumentSpells
{
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_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_DEADLY_THROW = 11,
EVENT_DEFLECTION = 12,
EVENT_THROW = 13,
EVENT_UNFREEZE = 20,
};
class npc_hol_monument : public CreatureScript
{
public:
npc_hol_monument() : CreatureScript("npc_hol_monument") {}
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);
}
EventMap events;
bool _isActive;
uint64 _attackGUID;
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 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 UpdateAI(uint32 diff)
{
if (!_isActive && !_attackGUID)
return;
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;
}
//Return since we have no target or if we are disabled from fight
if (!UpdateVictim())
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;
}
DoMeleeAttackIfReady();
}
};
};
void AddSC_boss_volkhan()
{
new boss_volkhan();
new npc_molten_golem();
new npc_hol_monument();
}

View File

@@ -1,39 +0,0 @@
/*
REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
*/
#ifndef DEF_HALLS_OF_LIGHTNING_H
#define DEF_HALLS_OF_LIGHTNING_H
enum HoLEvents
{
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,
};
enum HoLNPCs
{
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,
};
#endif

View File

@@ -1,245 +0,0 @@
/*
REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
*/
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "halls_of_lightning.h"
class instance_halls_of_lightning : public InstanceMapScript
{
public:
instance_halls_of_lightning() : InstanceMapScript("instance_halls_of_lightning", 602) { }
InstanceScript* GetInstanceScript(InstanceMap* pMap) const
{
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(); };
uint32 m_auiEncounter[MAX_ENCOUNTER];
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;
bool volkhanAchievement;
bool bjarngrimAchievement;
void Initialize()
{
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
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;
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;
}
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);
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_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;
}
}
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();
// Achievements
if (uiType == DATA_BJARNGRIM_ACHIEVEMENT)
bjarngrimAchievement = (bool)uiData;
else if (uiType == DATA_VOLKHAN_ACHIEVEMENT)
volkhanAchievement = (bool)uiData;
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);
break;
}
SaveToDB();
}
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];
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
char dataHead1, dataHead2;
uint32 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;
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;
}
else
OUT_LOAD_INST_DATA_FAIL;
}
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;
}
};
};
void AddSC_instance_halls_of_lightning()
{
new instance_halls_of_lightning();
}

View File

@@ -1,241 +0,0 @@
/* Xinef
*/
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellScript.h"
#include "halls_of_stone.h"
#include "Player.h"
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,
};
enum events
{
EVENT_NONE,
EVENT_BOULDER,
EVENT_STOMP,
EVENT_GROUND_SLAM,
EVENT_GROUND_SPIKE,
EVENT_SHATTER,
EVENT_REMOVE_STONED,
};
enum Yells
{
SAY_AGGRO = 0,
SAY_KILL = 1,
SAY_DEATH = 2,
SAY_SHATTER = 3
};
class boss_krystallus : public CreatureScript
{
public:
boss_krystallus() : CreatureScript("boss_krystallus") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return new boss_krystallusAI (pCreature);
}
struct boss_krystallusAI : public ScriptedAI
{
boss_krystallusAI(Creature *c) : ScriptedAI(c)
{
pInstance = me->GetInstanceScript();
}
EventMap events;
InstanceScript* pInstance;
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);
if (pInstance)
pInstance->SetData(BOSS_KRYSTALLUS, IN_PROGRESS);
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 UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
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);
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();
}
void JustDied(Unit* killer)
{
Talk(SAY_DEATH);
if (pInstance)
pInstance->SetData(BOSS_KRYSTALLUS, DONE);
}
void KilledUnit(Unit *victim)
{
Talk(SAY_KILL);
}
};
};
class spell_krystallus_shatter : public SpellScriptLoader
{
public:
spell_krystallus_shatter() : SpellScriptLoader("spell_krystallus_shatter") { }
class spell_krystallus_shatter_SpellScript : public SpellScript
{
PrepareSpellScript(spell_krystallus_shatter_SpellScript);
void HandleScript(SpellEffIndex /*effIndex*/)
{
if (Unit* target = GetHitUnit())
{
target->RemoveAurasDueToSpell(GROUND_SLAM_STONED_EFFECT);
target->CastSpell((Unit*)NULL, SPELL_SHATTER_EFFECT, true);
}
}
void Register()
{
OnEffectHitTarget += SpellEffectFn(spell_krystallus_shatter_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
SpellScript* GetSpellScript() const
{
return new spell_krystallus_shatter_SpellScript();
}
};
class spell_krystallus_shatter_effect : public SpellScriptLoader
{
public:
spell_krystallus_shatter_effect() : SpellScriptLoader("spell_krystallus_shatter_effect") { }
class spell_krystallus_shatter_effect_SpellScript : public SpellScript
{
PrepareSpellScript(spell_krystallus_shatter_effect_SpellScript);
void CalculateDamage()
{
if (!GetHitUnit())
return;
float radius = GetSpellInfo()->Effects[EFFECT_0].CalcRadius(GetCaster());
if (!radius)
return;
float distance = GetCaster()->GetDistance2d(GetHitUnit());
if (distance > 1.0f)
SetHitDamage(int32(GetHitDamage() * ((radius - distance) / radius)));
}
void Register()
{
OnHit += SpellHitFn(spell_krystallus_shatter_effect_SpellScript::CalculateDamage);
}
};
SpellScript* GetSpellScript() const
{
return new spell_krystallus_shatter_effect_SpellScript();
}
};
void AddSC_boss_krystallus()
{
new boss_krystallus();
new spell_krystallus_shatter();
new spell_krystallus_shatter_effect();
}

View File

@@ -1,148 +0,0 @@
/* MAIDEN OF GRIEF BY SILVANII (mmorcin@wp.pl), Some cleanups by Xinef */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#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,
ACHIEVEMENT_GOOD_GRIEF = 20383,
};
enum maidenEvents
{
EVENT_NONE,
EVENT_STORM,
EVENT_SHOCK,
EVENT_PILLAR,
EVENT_PARTING,
};
enum Yells
{
SAY_AGGRO = 0,
SAY_SLAY = 1,
SAY_DEATH = 2,
SAY_STUN = 3
};
class boss_maiden_of_grief : public CreatureScript
{
public:
boss_maiden_of_grief() : CreatureScript("boss_maiden_of_grief") { }
CreatureAI* GetAI(Creature* pCreature) const
{
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();
}
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 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);
}
}
void UpdateAI(uint32 diff)
{
if(!UpdateVictim())
return;
events.Update(diff);
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);
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();
}
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;
Talk(SAY_SLAY);
}
};
};
void AddSC_boss_maiden_of_grief()
{
new boss_maiden_of_grief();
}

View File

@@ -1,515 +0,0 @@
/*
REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
*/
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "halls_of_stone.h"
#include "Player.h"
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,
// 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 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,
};
enum Yells
{
SAY_AGGRO = 0,
SAY_SLAY = 1,
SAY_DEATH = 2
};
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,
// 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,
// ACTIONS
ACTION_SLUG_KILLED = 1,
};
enum SummonPhases
{
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},
};
class boss_sjonnir : public CreatureScript
{
public:
boss_sjonnir() : CreatureScript("boss_sjonnir") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return new boss_sjonnirAI (pCreature);
}
struct boss_sjonnirAI : public ScriptedAI
{
boss_sjonnirAI(Creature *c) : ScriptedAI(c), summons(me)
{
pInstance = c->GetInstanceScript();
}
InstanceScript* pInstance;
EventMap events;
SummonList summons;
uint8 SummonPhase;
uint8 SlugeCount;
void Reset()
{
events.Reset();
summons.DespawnAll();
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 (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);
}
}
}
}
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 (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 UpdateAI(uint32 diff)
{
if (!UpdateVictim())
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);
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);
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(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.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);
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);
}
}
void KilledUnit(Unit *victim)
{
if (urand(0,1))
return;
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 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);
}
}
}
}
};
};
class boss_sjonnir_dwarf : public CreatureScript
{
public:
boss_sjonnir_dwarf() : CreatureScript("boss_sjonnir_dwarf") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return new boss_sjonnir_dwarfAI (pCreature);
}
struct boss_sjonnir_dwarfAI : public ScriptedAI
{
boss_sjonnir_dwarfAI(Creature *c) : ScriptedAI(c) { }
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));
}
};
};
class boss_sjonnir_iron_sludge : public CreatureScript
{
public:
boss_sjonnir_iron_sludge() : CreatureScript("boss_sjonnir_iron_sludge") { }
CreatureAI* GetAI(Creature* pCreature) const
{
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();
}
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;
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();
}
};
};
//OOZE
class boss_sjonnir_malformed_ooze : public CreatureScript
{
public:
boss_sjonnir_malformed_ooze() : CreatureScript("boss_sjonnir_malformed_ooze") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return new boss_sjonnir_malformed_oozeAI (pCreature);
}
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);
}
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;
}
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();
}

View File

@@ -1,859 +0,0 @@
/*
REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
*/
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
#include "halls_of_stone.h"
#include "ScriptedEscortAI.h"
#include "SpellScript.h"
#include "Player.h"
#define GOSSIP_ITEM_1 "Brann, it would be our honor!"
#define GOSSIP_ITEM_2 "Let's move Brann, enough of the history lessons!"
#define GOSSIP_ITEM_3 "We dont have time for this right now, we have to keep going."
#define TEXT_ID_START 13100
#define YELL_AGGRO "You be dead soon enough!"
enum NPCs
{
NPC_DARK_RUNE_PROTECTOR = 27983,
NPC_DARK_RUNE_STORMCALLER = 27984,
NPC_IRON_GOLEM_CUSTODIAN = 27985,
NPC_DARK_MATTER_TRIGGER = 28237,
NPC_SEARING_GAZE_TRIGGER = 28265,
};
enum Misc
{
// BRANN EVENT
SPELL_GLARE_OF_THE_TRIBUNAL = 50988,
SPELL_GLARE_OF_THE_TRIBUNAL_H = 59870,
SPELL_DARK_MATTER_VISUAL = 51001,
SPELL_DARK_MATTER = 51012,
SPELL_DARK_MATTER_H = 59868,
SPELL_SEARING_GAZE = 51136,
SPELL_SEARING_GAZE_H = 59867,
// DARK RUNE PROTECTOR
SPELL_DRP_CHARGE = 22120,
SPELL_DRP_CLEAVE = 42724,
// DARK RUNE STORMCALLER
SPELL_DRS_LIGHTING_BOLT = 12167,
SPELL_DRS_LIGHTING_BOLT_H = 59863,
SPELL_DRS_SHADOW_WORD_PAIN = 15654,
SPELL_DRS_SHADOW_WORD_PAIN_H = 59864,
// IRON GOLEM CUSTODIAN
SPELL_IGC_CRUSH_ARMOR = 33661,
SPELL_IGC_GROUND_SMASH = 12734,
SPELL_IGC_GROUND_SMASH_H = 59865,
// ACTIONS
ACTION_START_EVENT = 0,
ACTION_START_TRIBUNAL = 1,
ACTION_GO_TO_SJONNIR = 2,
ACTION_START_SJONNIR_FIGHT = 3,
ACTION_SJONNIR_DEAD = 4,
ACTION_ENTEREVADEMODE = 5,
ACTION_WIPE_START = 6,
// QUESTS
QUEST_HALLS_OF_STONE = 13207,
};
enum events
{
// BRANN
EVENT_KADDRAK_HEAD = 1,
EVENT_MARNAK_HEAD = 2,
EVENT_ABEDNEUM_HEAD = 3,
EVENT_SUMMON_MONSTERS = 4,
EVENT_TRIBUNAL_END = 5,
EVENT_GO_TO_SJONNIR = 6,
EVENT_END = 7,
EVENT_KADDRAK_VISUAL = 8,
EVENT_MARNAK_VISUAL = 9,
EVENT_ABEDNEUM_VISUAL = 10,
EVENT_KADDRAK_SWITCH_EYE = 11,
// DARK RUNE PROTECTOR
EVENT_DRP_CHARGE = 15,
EVENT_DRP_CLEAVE = 16,
// DARK RUNE STORMCALLER
EVENT_DRS_LIGHTNING_BOLD = 20,
EVENT_DRS_SHADOW_WORD_PAIN = 21,
// IRON GOLEM CUSTODIAN
EVENT_IGC_CRUSH = 30,
EVENT_IGC_GROUND_SMASH = 31,
};
struct Yells
{
uint32 sound;
const char* text;
uint32 creature, timer;
};
static Yells Conversation[]=
{
{14259, "Time to get some answers! Let's get this show on the road!", NPC_BRANN, 0},
{14247, "Take a moment and relish this with me. Soon... all will be revealed. Okay then, let's do this!", NPC_BRANN, 5000},
{14248, "Now keep an eye out! I'll have this licked in two shakes of a--", NPC_BRANN, 17000},
{13765, "Warning: life form pattern not recognized. Archival processing terminated. Continued interference will result in targeted response.", NPC_ABEDNEUM, 20500},
{14249, "Oh, that doesn't sound good. We might have a complication or two...", NPC_BRANN, 32000},
{13756, "Security breach in progress. Analysis of historical archives transferred to lower-priority queue. Countermeasures engaged.", NPC_KADDRAK, 37000},
{14250, "Ah, you want to play hardball, eh? That's just my game!", NPC_BRANN, 49000},
{14251, "Couple more minutes and I'll--", NPC_BRANN, 100000},
{13761, "Threat index threshold exceeded. Celestial archive aborted. Security level heightened.", NPC_MARNAK, 105000},
{14252, "Heightened? What's the good news?", NPC_BRANN, 116000},
{14253, "So that was the problem? Now I'm makin' progress...", NPC_BRANN, 195000},
{13767, "Critical threat index. Void analysis diverted. Initiating sanitization protocol.", NPC_ABEDNEUM, 205000},
{14254, "Hang on! Nobody's gonna' be sanitized as long as I have a say in it!", NPC_BRANN, 215000},
{14255, "Ha! The old magic fingers finally won through! Now let's get down to--", NPC_BRANN, 295000},
{13768, "Alert: security fail-safes deactivated. Beginning memory purge and... ", NPC_ABEDNEUM, 303000},
//The fight is completed at this point.
{14256, "Purge? No no no no no.. where did I-- Aha, this should do the trick...", NPC_BRANN, 310000},
{13769, "System online. Life form pattern recognized. Welcome, Branbronzan. Query?", NPC_ABEDNEUM, 321000},
{14263, "Query? What do you think I'm here for, tea and biscuits? Spill the beans already!", NPC_BRANN, 329000},
{14264, "Tell me how the dwarves came to be, and start at the beginning!", NPC_BRANN, 336000},
{13770, "Accessing prehistoric data... retrieved. In the beginning the earthen were created to--", NPC_ABEDNEUM, 342000},
{14265, "Right, right... I know the earthen were made from stone to shape the deep regions o' the world. But what about the anomalies? Matrix non-stabilizin' and what-not?", NPC_BRANN, 348000},
{13771, "Accessing... In the early stages of it's development cycle, Azeroth suffered infection by parasitic necrophotic symbiotes.", NPC_ABEDNEUM, 360000},
{14266, "Necrowhatinthe-- Speak bloody Common, will ye?", NPC_BRANN, 373500},
{13772, "Designation: Old Gods. Old Gods rendered all systems, including earthen, defenseless in order to facilitate assimilation. This matrix destabilization has been termed the Curse of Flesh. Effects of destabilization increased over time.", NPC_ABEDNEUM, 380000},
{14267, "Old Gods, huh? So they zapped the earthen with this Curse of Flesh... and then what?", NPC_BRANN, 399500},
{13757, "Accessing... Creators arrived to extirpate symbiotic infection. Assessment revealed that Old God infestation had grown malignant. Excising parasites would result in loss of host--", NPC_KADDRAK, 406000},
{14268, "If they killed the Old Gods, Azeroth would've been destroyed...", NPC_BRANN, 424000},
{13758, "Correct. Creators neutralized parasitic threat and contained it within the host. Forge of Wills and other systems were instituted to create new earthen. Safeguards were implemented, and protectors were appointed.", NPC_KADDRAK, 429000},
{14269, "What protectors?", NPC_BRANN, 449000},
{13759, "Designations: Aesir and Vanir. Or in the common nomenclature, storm and earth giants. Sentinel Loken designated supreme. Dragon Aspects appointed to monitor evolution on Azeroth.", NPC_KADDRAK, 452000},
{14270, "Aesir and Vanir... Okay, so the Forge o' Wills started makin' new earthen... but what happened to the old ones?", NPC_BRANN, 471000},
{13762, "Additional background is relevant to your query: following global combat between Aesir and Vanir--", NPC_MARNAK, 482000},
{14271, "Hold everything! The Aesir and Vanir went to war? Why?", NPC_BRANN, 489000},
{13763, "Unknown. Data suggests that impetus for global combat originated with prime designate Loken, who neutralized all remaining Aesir and Vanir, affecting termination of conflict. Prime designate Loken then initiated stasis of several seed races, including earthen, giants and vrykul, at designated holding facilities.", NPC_MARNAK, 494000},
{14272, "This Loken sounds like a nasty character. Glad we don't have to worry about the likes o' him anymore. So... if I'm understandin' ye right, the original earthen eventually woke up from this stasis, and by that time the destabili-whatever had turned 'em into proper dwarves. Or at least... dwarf ancestors.", NPC_BRANN, 519000},
{13764, "Essentially that is correct.", NPC_MARNAK, 543000},
{14273, "Well, now... that's a lot to digest. I'm gonna need some time to take all this in. Thank ye.", NPC_BRANN, 549000},
{13773, "Acknowledged, Branbronzan. Session terminated.", NPC_ABEDNEUM, 559000},
{0, "I think it's time to see what's behind the door near the entrance. I'm going to sneak over there, nice and quiet. Meet me at the door and I'll get us in.", NPC_BRANN, 574000},
};
class brann_bronzebeard : public CreatureScript
{
public:
brann_bronzebeard() : CreatureScript("brann_bronzebeard") { }
bool OnGossipHello(Player *player, Creature *pCreature)
{
InstanceScript* pInstance = (pCreature->GetInstanceScript());
player->TalkedToCreature(pCreature->GetEntry(), pCreature->GetGUID());
player->PrepareGossipMenu(pCreature, 0, true);
if (pInstance)
{
uint32 brann = pInstance->GetData(BRANN_BRONZEBEARD);
switch (brann)
{
case 1:
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
break;
case 2:
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
break;
case 3:
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3);
break;
case 4:
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4);
break;
default: break;
}
}
player->SEND_GOSSIP_MENU(TEXT_ID_START, pCreature->GetGUID());
return true;
}
bool OnGossipSelect(Player *player, Creature *pCreature, uint32 sender, uint32 action )
{
if (action)
{
switch (action)
{
case GOSSIP_ACTION_INFO_DEF+1:
pCreature->AI()->DoAction(ACTION_START_EVENT);
player->CLOSE_GOSSIP_MENU();
break;
case GOSSIP_ACTION_INFO_DEF+2:
pCreature->AI()->DoAction(ACTION_START_TRIBUNAL);
player->CLOSE_GOSSIP_MENU();
break;
case GOSSIP_ACTION_INFO_DEF+3:
pCreature->AI()->DoAction(ACTION_GO_TO_SJONNIR);
player->CLOSE_GOSSIP_MENU();
break;
case GOSSIP_ACTION_INFO_DEF+4:
pCreature->AI()->DoAction(ACTION_WIPE_START);
player->CLOSE_GOSSIP_MENU();
break;
}
}
return true;
}
CreatureAI* GetAI(Creature* pCreature) const
{
return new brann_bronzebeardAI (pCreature);
}
struct brann_bronzebeardAI : public npc_escortAI
{
brann_bronzebeardAI(Creature *c) : npc_escortAI(c), summons(me)
{
AbedneumGUID = MarnakGUID = KaddrakGUID = 0;
pInstance = c->GetInstanceScript();
}
InstanceScript* pInstance;
EventMap events;
SummonList summons;
uint64 AbedneumGUID;
uint64 MarnakGUID;
uint64 KaddrakGUID;
uint8 WaveNum;
bool TalkEvent;
uint32 SpeechCount, SpeechPause;
void DespawnHeads()
{
Creature *cr;
if (cr = GetAbedneum()) cr->DespawnOrUnsummon();
if (cr = GetMarnak()) cr->DespawnOrUnsummon();
if (cr = GetKaddrak()) cr->DespawnOrUnsummon();
SwitchHeadVisaul(0x7, false);
}
void SwitchHeadVisaul(uint8 headMask, bool activate)
{
if (!pInstance)
return;
GameObject *go = NULL;
if (headMask & 0x1) // Kaddrak
if (go = me->GetMap()->GetGameObject(pInstance->GetData64(GO_KADDRAK)))
activate ? go->SendCustomAnim(0) : go->SetGoState(GO_STATE_READY);
if (headMask & 0x2) // Marnak
if (go = me->GetMap()->GetGameObject(pInstance->GetData64(GO_MARNAK)))
activate ? go->SendCustomAnim(0) : go->SetGoState(GO_STATE_READY);
if (headMask & 0x4) // Abedneum
if (go = me->GetMap()->GetGameObject(pInstance->GetData64(GO_ABEDNEUM)))
activate ? go->SendCustomAnim(0) : go->SetGoState(GO_STATE_READY);
}
void ResetEvent()
{
if (GameObject *tribunal = ObjectAccessor::GetGameObject(*me, pInstance->GetData64(GO_TRIBUNAL_CONSOLE)))
tribunal->SetGoState(GO_STATE_READY);
events.Reset();
summons.DespawnAll();
DespawnHeads();
WaveNum = 0;
SpeechCount = 0;
SpeechPause = 0;
TalkEvent = false;
}
void WaypointReached(uint32 id);
void InitializeEvent();
Creature* GetAbedneum() { return ObjectAccessor::GetCreature(*me, AbedneumGUID); }
Creature* GetMarnak() { return ObjectAccessor::GetCreature(*me, MarnakGUID); }
Creature* GetKaddrak() { return ObjectAccessor::GetCreature(*me, KaddrakGUID); }
void MoveInLineOfSight(Unit* pWho) { }
void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask)
{
if (damage && pInstance)
pInstance->SetData(DATA_BRANN_ACHIEVEMENT, false);
}
void Reset()
{
RemoveEscortState(0x7); // all states
SetDespawnAtFar(false);
SetDespawnAtEnd(false);
ResetEvent();
me->setFaction(35);
me->SetReactState(REACT_PASSIVE);
me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER);
if(pInstance)
{
pInstance->SetData(BRANN_BRONZEBEARD, 1);
pInstance->SetData(DATA_BRANN_ACHIEVEMENT, true);
if (pInstance->GetData(BOSS_TRIBUNAL_OF_AGES) == DONE)
pInstance->SetData(BRANN_BRONZEBEARD, (pInstance->GetData(BOSS_SJONNIR) == DONE) ? 5 : 4);
}
}
void DoAction(int32 action)
{
switch (action)
{
case ACTION_START_EVENT:
Start(false, true, 0, 0, true, false);
break;
case ACTION_START_TRIBUNAL:
{
Map::PlayerList const &PlayerList = me->GetMap()->GetPlayers();
if (!PlayerList.isEmpty())
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
{
me->setFaction(i->GetSource()->getFaction());
break;
}
SetEscortPaused(false);
InitializeEvent();
me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE);
break;
}
case ACTION_GO_TO_SJONNIR:
SetEscortPaused(false);
ResetEvent();
me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE);
break;
case ACTION_START_SJONNIR_FIGHT:
me->setFaction(35);
me->MonsterYell("Don't worry! Ol' Brann's got yer back! Keep that metal monstrosity busy, and I'll see if I can't sweet talk this machine into helping ye!", LANG_UNIVERSAL, 0);
me->PlayDirectSound(14274);
SetEscortPaused(false);
break;
case ACTION_SJONNIR_DEAD:
me->MonsterYell("Loken? That's downright bothersome... We might've neutralized the iron dwarves, but I'd lay odds there's another machine somewhere else churnin' out a whole mess o' these iron vrykul!", LANG_UNIVERSAL, 0);
me->PlayDirectSound(14278);
events.ScheduleEvent(EVENT_END, 14000);
break;
case ACTION_ENTEREVADEMODE:
RemoveEscortState(0x7); // all states
me->SetHomePosition(1077.41f, 474.16f, 207.8f, 2.70526f);
me->UpdatePosition(1077.41f, 474.16f, 207.9f, 2.70526f, true);
me->StopMovingOnCurrentPos();
Reset();
break;
case ACTION_WIPE_START:
Start(false, true, 0, 0, true, false);
SetNextWaypoint(20, false);
ResetEvent();
me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE);
break;
}
}
void JustSummoned(Creature* cr)
{
if (cr->GetEntry() == NPC_ABEDNEUM || cr->GetEntry() == NPC_KADDRAK || cr->GetEntry() == NPC_MARNAK)
cr->SetCanFly(true);
else
summons.Summon(cr);
}
void UpdateEscortAI(uint32 diff)
{
events.Update(diff);
switch (events.GetEvent())
{
case EVENT_KADDRAK_VISUAL:
{
SwitchHeadVisaul(0x1, true);
events.PopEvent();
break;
}
case EVENT_MARNAK_VISUAL:
{
SwitchHeadVisaul(0x2, true);
events.PopEvent();
break;
}
case EVENT_ABEDNEUM_VISUAL:
{
SwitchHeadVisaul(0x4, true);
events.PopEvent();
break;
}
case EVENT_KADDRAK_HEAD: // First
{
if (Creature *kaddrak = GetKaddrak())
{
if (Player *plr = SelectTargetFromPlayerList(100.0f))
kaddrak->CastSpell(plr, DUNGEON_MODE(SPELL_GLARE_OF_THE_TRIBUNAL, SPELL_GLARE_OF_THE_TRIBUNAL_H), true);
}
events.RescheduleEvent(EVENT_KADDRAK_SWITCH_EYE, 1500);
events.RepeatEvent(2000+urand(0,2000));
break;
}
case EVENT_KADDRAK_SWITCH_EYE:
{
if (Creature *kaddrak = GetKaddrak())
{
if (urand(0,1))
kaddrak->UpdatePosition(927.9f, 330.9f, 219.4f, 2.4f, true);
else
kaddrak->UpdatePosition(923.7f, 326.9f, 219.5f, 2.1f, true);
kaddrak->StopMovingOnCurrentPos();
}
events.PopEvent();
break;
}
case EVENT_MARNAK_HEAD: // Second
{
if (Creature *marnak = GetMarnak())
{
if (Creature *cr = me->SummonCreature(NPC_DARK_MATTER_TRIGGER, marnak->GetPositionX(), marnak->GetPositionY(), marnak->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 7000))
{
cr->CastSpell(cr, SPELL_DARK_MATTER_VISUAL, true);
if (Player *plr = SelectTargetFromPlayerList(100.0f))
{
float speed = me->GetDistance(plr->GetPositionX(), plr->GetPositionY(), plr->GetPositionZ()) / (4000.0f * 0.001f);
cr->MonsterMoveWithSpeed(plr->GetPositionX(), plr->GetPositionY(), plr->GetPositionZ(), speed);
}
}
}
events.RepeatEvent(20000);
break;
}
case EVENT_ABEDNEUM_HEAD: // Third
{
if (Creature *abedneum = GetAbedneum())
{
Player *plr = SelectTargetFromPlayerList(100.0f);
if (!plr)
break;
if (Creature *cr = me->SummonCreature(NPC_SEARING_GAZE_TRIGGER, plr->GetPositionX(), plr->GetPositionY(), plr->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 10000))
{
// summon another abedneum to create double beam, despawn just after trigger despawn
me->SummonCreature(NPC_ABEDNEUM, 897.0f, 326.9f, 223.5f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 12000);
cr->CastSpell(cr, DUNGEON_MODE(SPELL_SEARING_GAZE, SPELL_SEARING_GAZE_H), true);
}
}
events.RepeatEvent(30000);
break;
}
case EVENT_SUMMON_MONSTERS:
{
uint32 Time = 45000 - (2500*WaveNum);
SummonCreatures(NPC_DARK_RUNE_PROTECTOR, 3);
if (WaveNum > 2)
SummonCreatures(NPC_DARK_RUNE_STORMCALLER, 2);
if (WaveNum > 5)
SummonCreatures(NPC_IRON_GOLEM_CUSTODIAN, 1);
WaveNum++;
events.RepeatEvent(Time);
break;
}
case EVENT_TRIBUNAL_END:
{
// Has to be here!
events.Reset();
//DespawnHeads();
summons.DespawnAll();
if (pInstance)
{
pInstance->SetData(BOSS_TRIBUNAL_OF_AGES, DONE);
pInstance->SetData(BRANN_BRONZEBEARD, 3);
me->CastSpell(me, 59046, true); // credit
}
me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER);
// Spawn Chest and quest credit
if (Player *plr = SelectTargetFromPlayerList(200.0f))
{
if (GameObject* go = plr->SummonGameObject((IsHeroic() ? GO_TRIBUNAL_CHEST_H : GO_TRIBUNAL_CHEST), 880.406f, 345.164f, 203.706f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0))
{
plr->RemoveGameObject(go, false);
go->SetLootMode(1);
go->SetUInt32Value(GAMEOBJECT_FLAGS, 0);
}
plr->GroupEventHappens(QUEST_HALLS_OF_STONE, me);
}
events.ScheduleEvent(EVENT_GO_TO_SJONNIR, 279000);
break;
}
case EVENT_GO_TO_SJONNIR:
{
SetEscortPaused(false);
ResetEvent();
me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE);
break;
}
case EVENT_END:
{
events.Reset();
if (pInstance)
pInstance->SetData(BRANN_BRONZEBEARD, 6);
me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER);
me->MonsterYell("I'll use the forge to make batches o' earthen to stand guard... But our greatest challenge still remains: find and stop Loken!", LANG_UNIVERSAL, 0);
me->PlayDirectSound(14279);
break;
}
}
if (TalkEvent)
{
SpeechPause += diff;
if (SpeechPause >= Conversation[SpeechCount].timer)
{
Creature* cs = NULL;
switch (Conversation[SpeechCount].creature)
{
case NPC_BRANN: cs = me; break;
case NPC_ABEDNEUM: cs = GetAbedneum(); break;
case NPC_KADDRAK: cs = GetKaddrak(); break;
case NPC_MARNAK: cs = GetMarnak(); break;
}
if (cs)
{
cs->MonsterYell(Conversation[SpeechCount].text, LANG_UNIVERSAL, 0);
cs->PlayDirectSound(Conversation[SpeechCount].sound);
}
if (SpeechCount < 38)
SpeechPause = Conversation[SpeechCount++].timer;
else
TalkEvent = false;
}
}
}
void SummonCreatures(uint32 entry, uint8 count)
{
for (int i = 0; i < count; ++i)
{
Creature* cr = me->SummonCreature(entry, 946.5971f+urand(0,6), 383.5330f+urand(0,6), 205.9943f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN,20000);
if(cr)
{
cr->AI()->AttackStart(me);
cr->AddThreat(me, 100.0f);
cr->SetInCombatWithZone();
}
}
}
void JustDied(Unit* killer)
{
ResetEvent();
if(pInstance)
{
if (pInstance->GetData(BOSS_TRIBUNAL_OF_AGES) != DONE)
pInstance->SetData(BOSS_TRIBUNAL_OF_AGES, NOT_STARTED);
}
}
};
};
void brann_bronzebeard::brann_bronzebeardAI::InitializeEvent()
{
Creature* cr = NULL;
if (cr = me->SummonCreature(NPC_KADDRAK, 923.7f, 326.9f, 219.5f, 2.1f, TEMPSUMMON_TIMED_DESPAWN, 580000))
{
cr->SetInCombatWithZone();
KaddrakGUID = cr->GetGUID();
}
if (cr = me->SummonCreature(NPC_MARNAK, 895.974f, 363.571f, 219.337f, 5.5f, TEMPSUMMON_TIMED_DESPAWN, 580000))
{
cr->SetInCombatWithZone();
MarnakGUID = cr->GetGUID();
}
if (cr = me->SummonCreature(NPC_ABEDNEUM, 892.25f, 331.25f, 223.86f, 0.6f, TEMPSUMMON_TIMED_DESPAWN, 580000))
{
cr->SetInCombatWithZone();
AbedneumGUID = cr->GetGUID();
}
TalkEvent = true;
events.Reset();
events.ScheduleEvent(EVENT_SUMMON_MONSTERS, 21000);
events.ScheduleEvent(EVENT_KADDRAK_HEAD, 20000);
events.ScheduleEvent(EVENT_MARNAK_HEAD, 105000);
events.ScheduleEvent(EVENT_ABEDNEUM_HEAD, 205000);
events.ScheduleEvent(EVENT_TRIBUNAL_END, 315000);
// Viusals
events.ScheduleEvent(EVENT_KADDRAK_VISUAL, 20000);
events.ScheduleEvent(EVENT_MARNAK_VISUAL, 105000);
events.ScheduleEvent(EVENT_ABEDNEUM_VISUAL, 205000);
}
void brann_bronzebeard::brann_bronzebeardAI::WaypointReached(uint32 id)
{
switch (id)
{
// Stop before stairs and ask to start
case 9:
SetEscortPaused(true);
me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER);
if (pInstance)
pInstance->SetData(BRANN_BRONZEBEARD, 2);
break;
// In front of Console
case 11:
SetEscortPaused(true);
if(pInstance)
{
pInstance->SetData(BOSS_TRIBUNAL_OF_AGES, IN_PROGRESS);
if (GameObject *tribunal = ObjectAccessor::GetGameObject(*me, pInstance->GetData64(GO_TRIBUNAL_CONSOLE)))
tribunal->SetGoState(GO_STATE_ACTIVE);
}
break;
// Before Sjonnir's door
case 27:
if(pInstance)
{
if (GameObject *door = ObjectAccessor::GetGameObject(*me, pInstance->GetData64(GO_SJONNIR_DOOR)))
door->SetGoState(GO_STATE_ACTIVE);
if (Creature *cr = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_SJONNIR)))
cr->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
}
break;
case 28:
SetEscortPaused(true);
break;
case 29:
SetEscortPaused(true);
if (pInstance)
if (GameObject *console = ObjectAccessor::GetGameObject(*me, pInstance->GetData64(GO_SJONNIR_CONSOLE)))
console->SetGoState(GO_STATE_ACTIVE);
break;
}
}
class dark_rune_protectors : public CreatureScript
{
public:
dark_rune_protectors() : CreatureScript("dark_rune_protectors") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return new dark_rune_protectorsAI (pCreature);
}
struct dark_rune_protectorsAI : public ScriptedAI
{
dark_rune_protectorsAI(Creature *c) : ScriptedAI(c) { }
EventMap events;
void Reset()
{
events.Reset();
}
void EnterCombat(Unit *)
{
events.ScheduleEvent(EVENT_DRP_CHARGE, 10000);
events.ScheduleEvent(EVENT_DRP_CLEAVE, 7000);
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.GetEvent())
{
case EVENT_DRP_CHARGE:
{
if (Unit *tgt = SelectTarget(SELECT_TARGET_RANDOM, 0))
me->CastSpell(tgt, SPELL_DRP_CHARGE, false);
events.RepeatEvent(10000);
break;
}
case EVENT_DRP_CLEAVE:
{
me->CastSpell(me->GetVictim(), SPELL_DRP_CLEAVE, false);
events.RepeatEvent(7000);
break;
}
}
DoMeleeAttackIfReady();
}
};
};
class dark_rune_stormcaller : public CreatureScript
{
public:
dark_rune_stormcaller() : CreatureScript("dark_rune_stormcaller") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return new dark_rune_stormcallerAI (pCreature);
}
struct dark_rune_stormcallerAI : public ScriptedAI
{
dark_rune_stormcallerAI(Creature *c) : ScriptedAI(c) { }
EventMap events;
void Reset()
{
events.Reset();
}
void EnterCombat(Unit *)
{
events.ScheduleEvent(EVENT_DRS_LIGHTNING_BOLD, 5000);
events.ScheduleEvent(EVENT_DRS_SHADOW_WORD_PAIN, 12000);
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.GetEvent())
{
case EVENT_DRS_LIGHTNING_BOLD:
{
me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_DRS_LIGHTING_BOLT_H : SPELL_DRS_LIGHTING_BOLT, false);
events.RepeatEvent(5000);
break;
}
case EVENT_DRS_SHADOW_WORD_PAIN:
{
me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_DRS_SHADOW_WORD_PAIN_H : SPELL_DRS_SHADOW_WORD_PAIN, false);
events.RepeatEvent(12000);
break;
}
}
DoMeleeAttackIfReady();
}
};
};
class iron_golem_custodian : public CreatureScript
{
public:
iron_golem_custodian() : CreatureScript("iron_golem_custodian") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return new iron_golem_custodianAI (pCreature);
}
struct iron_golem_custodianAI : public ScriptedAI
{
iron_golem_custodianAI(Creature *c) : ScriptedAI(c) { }
EventMap events;
void Reset()
{
events.Reset();
}
void EnterCombat(Unit *)
{
events.ScheduleEvent(EVENT_IGC_CRUSH, 6000);
events.ScheduleEvent(EVENT_IGC_GROUND_SMASH, 4000);
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.GetEvent())
{
case EVENT_IGC_CRUSH:
{
me->CastSpell(me->GetVictim(), SPELL_IGC_CRUSH_ARMOR, false);
events.RepeatEvent(6000);
break;
}
case EVENT_IGC_GROUND_SMASH:
{
me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_IGC_GROUND_SMASH_H : SPELL_IGC_GROUND_SMASH, false);
events.RepeatEvent(5000);
break;
}
}
DoMeleeAttackIfReady();
}
};
};
class spell_hos_dark_matter : public SpellScriptLoader
{
public:
spell_hos_dark_matter() : SpellScriptLoader("spell_hos_dark_matter") { }
class spell_hos_dark_matter_AuraScript : public AuraScript
{
PrepareAuraScript(spell_hos_dark_matter_AuraScript);
void HandleEffectRemove(AuraEffect const * /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (Unit *caster = GetCaster())
caster->CastSpell(caster, caster->GetMap()->IsHeroic() ? SPELL_DARK_MATTER_H : SPELL_DARK_MATTER, true);
}
void Register()
{
OnEffectRemove += AuraEffectRemoveFn(spell_hos_dark_matter_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
}
};
AuraScript *GetAuraScript() const
{
return new spell_hos_dark_matter_AuraScript();
}
};
void AddSC_brann_bronzebeard()
{
new brann_bronzebeard();
new dark_rune_protectors();
new dark_rune_stormcaller();
new iron_golem_custodian();
new spell_hos_dark_matter();
}

View File

@@ -1,45 +0,0 @@
/*
REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
*/
#ifndef DEF_HALLS_OF_STONE_H
#define DEF_HALLS_OF_STONE_H
enum Encounter
{
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,
};
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,
};
enum npcs
{
NPC_KADDRAK = 30898,
NPC_MARNAK = 30897,
NPC_ABEDNEUM = 30899,
NPC_SJONNIR = 27978,
NPC_BRANN = 28070,
};
#endif

View File

@@ -1,253 +0,0 @@
/*
REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
*/
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "halls_of_stone.h"
class instance_halls_of_stone : public InstanceMapScript
{
public:
instance_halls_of_stone() : InstanceMapScript("instance_halls_of_stone", 599) { }
InstanceScript* GetInstanceScript(InstanceMap* pMap) const
{
return new instance_halls_of_stone_InstanceMapScript(pMap);
}
struct instance_halls_of_stone_InstanceMapScript : public InstanceScript
{
instance_halls_of_stone_InstanceMapScript(Map* map) : InstanceScript(map){ Initialize(); }
uint32 Encounter[MAX_ENCOUNTER];
uint64 goKaddrakGUID;
uint64 goMarnakGUID;
uint64 goAbedneumGUID;
uint64 goTribunalConsoleGUID;
uint64 goSkyRoomFloorGUID;
uint64 goSjonnirConsoleGUID;
uint64 goSjonnirDoorGUID;
uint64 goLeftPipeGUID;
uint64 goRightPipeGUID;
uint64 SjonnirGUID;
uint64 BrannGUID;
bool brannAchievement;
bool sjonnirAchievement;
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;
SjonnirGUID = 0;
BrannGUID = 0;
brannAchievement = false;
sjonnirAchievement = 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 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;
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;
}
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;
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);
}
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::ostringstream saveStream;
saveStream << "H O S " << Encounter[0] << ' ' << Encounter[1] << ' ' << Encounter[2] << ' ' << Encounter[3] << ' ' << Encounter[4];
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
}
void Load(const char* strIn)
{
if (!strIn)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(strIn);
char 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;
}
};
};
void AddSC_instance_halls_of_stone()
{
new instance_halls_of_stone();
}

View File

@@ -1,504 +0,0 @@
/*
REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
*/
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellScript.h"
#include "ulduar.h"
#include "SpellAuraEffects.h"
#include "Player.h"
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,
// 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,
};
#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,
};
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_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,
};
enum Misc
{
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,
};
class boss_auriaya : public CreatureScript
{
public:
boss_auriaya() : CreatureScript("boss_auriaya") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return new boss_auriayaAI (pCreature);
}
struct boss_auriayaAI : public ScriptedAI
{
boss_auriayaAI(Creature* pCreature) : ScriptedAI(pCreature), summons(pCreature)
{
m_pInstance = pCreature->GetInstanceScript();
}
InstanceScript* m_pInstance;
EventMap events;
SummonList summons;
bool _feralDied;
bool _nineLives;
void Reset()
{
_feralDied = false;
_nineLives = false;
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);
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;
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();
summons.Summon(cr);
}
void SummonedCreatureDies(Creature* cr, Unit*)
{
if (cr->GetEntry() == NPC_SANCTUM_SENTRY)
_feralDied = true;
}
void JustReachedHome() { me->setActive(false); }
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);
summons.DoZoneInCombat(NPC_SANCTUM_SENTRY);
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;
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);
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 UpdateAI(uint32 diff)
{
if (!UpdateVictim())
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;
}
DoMeleeAttackIfReady();
}
};
};
class npc_auriaya_sanctum_sentry : public CreatureScript
{
public:
npc_auriaya_sanctum_sentry() : CreatureScript("npc_auriaya_sanctum_sentry") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return new npc_auriaya_sanctum_sentryAI (pCreature);
}
struct npc_auriaya_sanctum_sentryAI : public ScriptedAI
{
npc_auriaya_sanctum_sentryAI(Creature* pCreature) : ScriptedAI(pCreature) { }
uint32 _savagePounceTimer;
uint32 _ripFleshTimer;
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;
me->CastSpell(me, SPELL_STRENGTH_OF_THE_PACK, true);
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
_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;
}
DoMeleeAttackIfReady();
}
};
};
class npc_auriaya_feral_defender : public CreatureScript
{
public:
npc_auriaya_feral_defender() : CreatureScript("npc_auriaya_feral_defender") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return new npc_auriaya_feral_defenderAI (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;
void Reset()
{
summons.DespawnAll();
_feralRushTimer = 3000;
_feralPounceTimer = 0;
_feralEssenceStack = 8;
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);
if (_feralEssenceStack)
{
if (Creature *cr = me->SummonCreature(NPC_SEEPING_FERAL_ESSENCE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f))
summons.Summon(cr);
--_feralEssenceStack;
}
}
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 (_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;
_feralRushTimer += diff;
_feralPounceTimer += diff;
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;
}
DoMeleeAttackIfReady();
}
};
};
class spell_auriaya_sentinel_blast : public SpellScriptLoader
{
public:
spell_auriaya_sentinel_blast() : SpellScriptLoader("spell_auriaya_sentinel_blast") { }
class spell_auriaya_sentinel_blast_SpellScript : public SpellScript
{
PrepareSpellScript(spell_auriaya_sentinel_blast_SpellScript);
void FilterTargets(std::list<WorldObject*>& unitList)
{
unitList.remove_if(PlayerOrPetCheck());
}
void Register()
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_auriaya_sentinel_blast_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY);
}
};
SpellScript* GetSpellScript() const
{
return new spell_auriaya_sentinel_blast_SpellScript();
}
};
class achievement_auriaya_crazy_cat_lady : public AchievementCriteriaScript
{
public:
achievement_auriaya_crazy_cat_lady() : AchievementCriteriaScript("achievement_auriaya_crazy_cat_lady") {}
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;
}
};
class achievement_auriaya_nine_lives : public AchievementCriteriaScript
{
public:
achievement_auriaya_nine_lives() : AchievementCriteriaScript("achievement_auriaya_nine_lives") {}
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;
}
};
void AddSC_boss_auriaya()
{
new boss_auriaya();
new npc_auriaya_sanctum_sentry();
new npc_auriaya_feral_defender();
new spell_auriaya_sentinel_blast();
new achievement_auriaya_crazy_cat_lady();
new achievement_auriaya_nine_lives();
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,709 +0,0 @@
/*
REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
*/
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellScript.h"
#include "ulduar.h"
#include "AccountMgr.h"
#include "PassiveAI.h"
#include "Player.h"
#include "WorldSession.h"
enum VezaxSpellData
{
SPELL_VEZAX_BERSERK = 26662,
SPELL_VEZAX_SHADOW_CRASH = 62660,
SPELL_VEZAX_SHADOW_CRASH_DMG = 62659,
SPELL_VEZAX_SHADOW_CRASH_AREA_AURA = 63277,
SPELL_VEZAX_SHADOW_CRASH_AURA = 65269,
SPELL_SEARING_FLAMES = 62661,
SPELL_SURGE_OF_DARKNESS = 62662,
SPELL_MARK_OF_THE_FACELESS_AURA = 63276,
SPELL_MARK_OF_THE_FACELESS_EFFECT = 63278,
SPELL_AURA_OF_DESPAIR_1 = 62692,
SPELL_AURA_OF_DESPAIR_2 = 64848,
SPELL_CORRUPTED_RAGE = 68415,
SPELL_CORRUPTED_WISDOM = 64646,
SPELL_SHAMANISTIC_RAGE = 30823,
SPELL_JUDGEMENTS_OF_THE_WISDOM_RANK_1 = 31876,
SPELL_SUMMON_SARONITE_VAPORS = 63081,
NPC_SARONITE_VAPORS = 33488,
SPELL_SARONITE_VAPORS_DMG = 63338,
SPELL_SARONITE_VAPORS_ENERGIZE = 63337,
SPELL_SARONITE_VAPORS_AURA = 63323,
SPELL_SARONITE_VAPORS_DUMMYAURA = 63322,
SPELL_SARONITE_ANIMUS_FORMATION_VISUAL = 63319,
SPELL_SUMMON_SARONITE_ANIMUS = 63145,
SPELL_SARONITE_BARRIER = 63364,
SPELL_PROFOUND_DARKNESS = 63420,
};
enum VezaxNpcs
{
// NPC_VEZAX = 33271,
NPC_VEZAX_BUNNY = 33500,
NPC_SARONITE_ANIMUS = 33524,
};
enum VezaxGOs
{
// GO_VEZAX_DOOR = 194750,
};
enum VezaxSounds
{
SOUND_VEZAX_AGGRO = 15542,
SOUND_VEZAX_SLAIN_1 = 15543,
SOUND_VEZAX_SLAIN_2 = 15544,
SOUND_VEZAX_SURGE = 15545,
SOUND_VEZAX_DEATH = 15546,
SOUND_VEZAX_BERSERK = 15547,
SOUND_VEZAX_HARDMODE = 15548,
};
enum VezaxEvents
{
EVENT_SPELL_VEZAX_SHADOW_CRASH = 1,
EVENT_SPELL_SEARING_FLAMES = 2,
EVENT_SPELL_SURGE_OF_DARKNESS = 3,
EVENT_SPELL_MARK_OF_THE_FACELESS = 4,
EVENT_SPELL_SUMMON_SARONITE_VAPORS = 5,
EVENT_SARONITE_VAPORS_SWIRL = 6,
EVENT_SPELL_SUMMON_SARONITE_ANIMUS = 7,
EVENT_DESPAWN_SARONITE_VAPORS = 8,
EVENT_SPELL_PROFOUND_DARKNESS = 9,
EVENT_BERSERK = 10,
EVENT_RESTORE_TARGET = 11,
};
#define TEXT_VEZAX_AGGRO "Your destruction will herald a new age of suffering!"
#define TEXT_VEZAX_SLAIN_1 "You thought to stand before the legions of death... and survive?"
#define TEXT_VEZAX_SLAIN_2 "Defiance... a flaw of mortality."
#define TEXT_VEZAX_SURGE "The black blood of Yogg-Saron courses through me! I. AM. UNSTOPPABLE!"
#define TEXT_VEZAX_BERSERK "Your defeat was inevitable!"
#define TEXT_VEZAX_DEATH "Oh, what horrors await...."
#define TEXT_VEZAX_HARDMODE "Behold, now! Terror, absolute!"
class boss_vezax : public CreatureScript
{
public:
boss_vezax() : CreatureScript("boss_vezax") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return new boss_vezaxAI (pCreature);
}
struct boss_vezaxAI : public ScriptedAI
{
boss_vezaxAI(Creature *pCreature) : ScriptedAI(pCreature), summons(me)
{
pInstance = pCreature->GetInstanceScript();
}
EventMap events;
SummonList summons;
uint8 vaporsCount;
bool hardmodeAvailable;
bool berserk;
bool bAchievShadowdodger;
InstanceScript* pInstance;
void Reset()
{
vaporsCount = 0;
hardmodeAvailable = true;
berserk = false;
bAchievShadowdodger = true;
events.Reset();
summons.DespawnAll();
me->SetLootMode(1);
if (pInstance)
pInstance->SetData(TYPE_VEZAX, NOT_STARTED);
}
void JustReachedHome()
{
me->setActive(false);
}
void EnterCombat(Unit* pWho)
{
me->setActive(true);
me->SetInCombatWithZone();
events.Reset();
events.RescheduleEvent(EVENT_SPELL_VEZAX_SHADOW_CRASH, 13000);
events.RescheduleEvent(EVENT_SPELL_SEARING_FLAMES, 10000, 1);
events.RescheduleEvent(EVENT_SPELL_SURGE_OF_DARKNESS, 63000);
events.RescheduleEvent(EVENT_SPELL_MARK_OF_THE_FACELESS, 20000);
events.RescheduleEvent(EVENT_SPELL_SUMMON_SARONITE_VAPORS, 30000);
events.RescheduleEvent(EVENT_BERSERK, 600000);
me->MonsterYell(TEXT_VEZAX_AGGRO, LANG_UNIVERSAL, 0);
me->PlayDirectSound(SOUND_VEZAX_AGGRO, 0);
if (pInstance)
pInstance->SetData(TYPE_VEZAX, IN_PROGRESS);
me->CastSpell(me, SPELL_AURA_OF_DESPAIR_1, true);
}
void DoAction(int32 param)
{
switch( param )
{
case 1:
hardmodeAvailable = false;
break;
case 2:
me->RemoveAura(SPELL_SARONITE_BARRIER);
me->SetLootMode(3);
break;
}
}
uint32 GetData(uint32 id) const
{
switch (id)
{
case 1: return (me->GetLootMode() == 3 ? 1 : 0);
case 2: return (bAchievShadowdodger == true ? 1 : 0);
}
return 0;
}
void SpellHitTarget(Unit* target, const SpellInfo* spell)
{
if (target && spell && target->GetTypeId() == TYPEID_PLAYER && spell->Id == SPELL_VEZAX_SHADOW_CRASH_DMG)
bAchievShadowdodger = false;
}
void UpdateAI(uint32 diff)
{
if( !UpdateVictim() )
return;
if( !berserk && (me->GetPositionX() < 1720.0f || me->GetPositionX() > 1940.0f || me->GetPositionY() < 20.0f || me->GetPositionY() > 210.0f) )
events.RescheduleEvent(EVENT_BERSERK, 1);
events.Update(diff);
if( me->HasUnitState(UNIT_STATE_CASTING) )
return;
switch( events.GetEvent() )
{
case 0:
break;
case EVENT_BERSERK:
berserk = true;
me->CastSpell(me, SPELL_VEZAX_BERSERK, true);
me->MonsterYell(TEXT_VEZAX_BERSERK, LANG_UNIVERSAL, 0);
me->PlayDirectSound(SOUND_VEZAX_BERSERK, 0);
events.PopEvent();
break;
case EVENT_SPELL_VEZAX_SHADOW_CRASH:
{
events.RepeatEvent(10000);
std::vector<Player*> players;
Map::PlayerList const& pl = me->GetMap()->GetPlayers();
for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr )
{
Player* temp = itr->GetSource();
if( temp->IsAlive() && temp->GetDistance(me) > 15.0f )
players.push_back(temp);
}
if (!players.empty())
{
me->setAttackTimer(BASE_ATTACK, 2000);
Player* target = players.at(urand(0, players.size()-1));
me->SetUInt64Value(UNIT_FIELD_TARGET, target->GetGUID());
me->CastSpell(target, SPELL_VEZAX_SHADOW_CRASH, false);
events.ScheduleEvent(EVENT_RESTORE_TARGET, 750);
}
}
break;
case EVENT_RESTORE_TARGET:
if (me->GetVictim())
me->SetUInt64Value(UNIT_FIELD_TARGET, me->GetVictim()->GetGUID());
events.PopEvent();
break;
case EVENT_SPELL_SEARING_FLAMES:
if(!me->HasAura(SPELL_SARONITE_BARRIER))
me->CastSpell(me->GetVictim(), SPELL_SEARING_FLAMES, false);
events.RepeatEvent( me->GetMap()->Is25ManRaid() ? 8000 : 15000 );
break;
case EVENT_SPELL_SURGE_OF_DARKNESS:
me->MonsterYell(TEXT_VEZAX_SURGE, LANG_UNIVERSAL, 0);
me->PlayDirectSound(SOUND_VEZAX_SURGE, 0);
me->CastSpell(me, SPELL_SURGE_OF_DARKNESS, false);
events.RepeatEvent(63000);
events.DelayEvents(10000, 1);
break;
case EVENT_SPELL_MARK_OF_THE_FACELESS:
{
std::vector<Player*> outside;
std::vector<Player*> inside;
Map::PlayerList const &pl = me->GetMap()->GetPlayers();
for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr )
if( Player* tmp = itr->GetSource() )
if( tmp->IsAlive() )
{
if( tmp->GetDistance(me) > 15.0f )
outside.push_back(tmp);
else
inside.push_back(tmp);
}
Player* t = NULL;
if( outside.size() >= uint8(me->GetMap()->Is25ManRaid() ? 9 : 4) )
t = outside.at(urand(0, outside.size()-1));
else if( !inside.empty() )
t = inside.at(urand(0, inside.size()-1));
if (t)
me->CastSpell(t, SPELL_MARK_OF_THE_FACELESS_AURA, false);
events.RepeatEvent(40000);
}
break;
case EVENT_SPELL_SUMMON_SARONITE_VAPORS:
{
vaporsCount++;
me->CastSpell(me, SPELL_SUMMON_SARONITE_VAPORS, false);
me->MonsterTextEmote("A cloud of saronite vapors coalesces nearby!", 0, true);
if( vaporsCount < 6 || !hardmodeAvailable )
events.RepeatEvent(30000);
else
{
for( std::list<uint64>::iterator itr = summons.begin(); itr != summons.end(); ++itr )
if( Creature* sv = ObjectAccessor::GetCreature(*me, *itr) )
{
sv->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
sv->GetMotionMaster()->MoveIdle();
sv->GetMotionMaster()->MoveCharge(1852.78f, 81.38f, 342.461f, 28.0f);
}
events.PopEvent();
events.DelayEvents(12000, 0);
events.DelayEvents(12000, 1);
events.ScheduleEvent(EVENT_SARONITE_VAPORS_SWIRL, 6000);
}
}
break;
case EVENT_SARONITE_VAPORS_SWIRL:
if (summons.size())
{
me->MonsterTextEmote("The saronite vapors mass and swirl violently, merging into a monstrous form!", 0, true);
if( Creature* sv = ObjectAccessor::GetCreature(*me, *(summons.begin())) )
sv->CastSpell(sv, SPELL_SARONITE_ANIMUS_FORMATION_VISUAL, true);
events.PopEvent();
events.ScheduleEvent(EVENT_SPELL_SUMMON_SARONITE_ANIMUS, 2000);
break;
}
events.PopEvent();
break;
case EVENT_SPELL_SUMMON_SARONITE_ANIMUS:
if (summons.size())
{
me->MonsterTextEmote("A saronite barrier appears around General Vezax!", 0, true);
me->MonsterYell(TEXT_VEZAX_HARDMODE, LANG_UNIVERSAL, 0);
me->PlayDirectSound(SOUND_VEZAX_HARDMODE, 0);
me->CastSpell(me, SPELL_SARONITE_BARRIER, true);
if( Creature* sv = ObjectAccessor::GetCreature(*me, *(summons.begin())) )
sv->CastSpell(sv, SPELL_SUMMON_SARONITE_ANIMUS, true);
events.PopEvent();
events.ScheduleEvent(EVENT_DESPAWN_SARONITE_VAPORS, 2500);
break;
}
events.PopEvent();
break;
case EVENT_DESPAWN_SARONITE_VAPORS:
summons.DespawnEntry(NPC_SARONITE_VAPORS);
events.PopEvent();
break;
}
DoMeleeAttackIfReady();
}
void JustDied(Unit* killer)
{
summons.DespawnAll();
if (pInstance)
pInstance->SetData(TYPE_VEZAX, DONE);
me->MonsterYell(TEXT_VEZAX_DEATH, LANG_UNIVERSAL, 0);
me->PlayDirectSound(SOUND_VEZAX_DEATH, 0);
if( GameObject* door = me->FindNearestGameObject(GO_VEZAX_DOOR, 500.0f) )
if( door->GetGoState() != GO_STATE_ACTIVE )
{
door->SetLootState(GO_READY);
door->UseDoorOrButton(0, false);
}
}
void KilledUnit(Unit* who)
{
if( who->GetTypeId() == TYPEID_PLAYER )
{
if( urand(0,1) )
{
me->MonsterYell(TEXT_VEZAX_SLAIN_1, LANG_UNIVERSAL, 0);
me->PlayDirectSound(SOUND_VEZAX_SLAIN_1, 0);
}
else
{
me->MonsterYell(TEXT_VEZAX_SLAIN_2, LANG_UNIVERSAL, 0);
me->PlayDirectSound(SOUND_VEZAX_SLAIN_2, 0);
}
}
}
void MoveInLineOfSight(Unit* who) {}
void JustSummoned(Creature* summon)
{
summons.Summon(summon);
}
void SummonedCreatureDespawn(Creature* s)
{
summons.Despawn(s);
}
};
};
class npc_ulduar_saronite_vapors : public CreatureScript
{
public:
npc_ulduar_saronite_vapors() : CreatureScript("npc_ulduar_saronite_vapors") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return new npc_ulduar_saronite_vaporsAI (pCreature);
}
struct npc_ulduar_saronite_vaporsAI : public NullCreatureAI
{
npc_ulduar_saronite_vaporsAI(Creature *pCreature) : NullCreatureAI(pCreature)
{
pInstance = pCreature->GetInstanceScript();
me->GetMotionMaster()->MoveRandom(4.0f);
}
InstanceScript* pInstance;
void JustDied(Unit* killer)
{
me->CastSpell(me, SPELL_SARONITE_VAPORS_AURA, true);
// killed saronite vapors, hard mode unavailable
if( pInstance )
if( Creature* vezax = ObjectAccessor::GetCreature(*me, pInstance->GetData64(TYPE_VEZAX)) )
vezax->AI()->DoAction(1);
}
};
};
class npc_ulduar_saronite_animus : public CreatureScript
{
public:
npc_ulduar_saronite_animus() : CreatureScript("npc_ulduar_saronite_animus") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return new npc_ulduar_saronite_animusAI (pCreature);
}
struct npc_ulduar_saronite_animusAI : public ScriptedAI
{
npc_ulduar_saronite_animusAI(Creature *pCreature) : ScriptedAI(pCreature)
{
pInstance = pCreature->GetInstanceScript();
if( pInstance )
if( Creature* vezax = ObjectAccessor::GetCreature(*me, pInstance->GetData64(TYPE_VEZAX)) )
vezax->AI()->JustSummoned(me);
timer = 0;
me->SetInCombatWithZone();
}
InstanceScript* pInstance;
uint16 timer;
void JustDied(Unit* killer)
{
me->DespawnOrUnsummon(3000);
if( pInstance )
if( Creature* vezax = ObjectAccessor::GetCreature(*me, pInstance->GetData64(TYPE_VEZAX)) )
vezax->AI()->DoAction(2);
}
void UpdateAI(uint32 diff)
{
UpdateVictim();
timer += diff;
if (timer >= 2000)
{
me->CastSpell(me, SPELL_PROFOUND_DARKNESS, true);
timer -= 2000;
}
DoMeleeAttackIfReady();
}
};
};
class spell_aura_of_despair : public SpellScriptLoader
{
public:
spell_aura_of_despair() : SpellScriptLoader("spell_aura_of_despair") { }
class spell_aura_of_despair_AuraScript : public AuraScript
{
PrepareAuraScript(spell_aura_of_despair_AuraScript)
void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes mode)
{
if (Unit* caster = GetCaster())
if (Unit* target = GetTarget())
{
if (target->GetTypeId() != TYPEID_PLAYER)
return;
target->CastSpell(target, SPELL_AURA_OF_DESPAIR_2, true);
if( target->HasSpell(SPELL_SHAMANISTIC_RAGE) )
caster->CastSpell(target, SPELL_CORRUPTED_RAGE, true);
else if( target->HasSpell(SPELL_JUDGEMENTS_OF_THE_WISDOM_RANK_1) || target->HasSpell(SPELL_JUDGEMENTS_OF_THE_WISDOM_RANK_1+1) || target->HasSpell(SPELL_JUDGEMENTS_OF_THE_WISDOM_RANK_1+2) )
caster->CastSpell(target, SPELL_CORRUPTED_WISDOM, true);
}
}
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (Unit* target = GetTarget())
{
target->RemoveAurasDueToSpell(SPELL_AURA_OF_DESPAIR_2);
target->RemoveAurasDueToSpell(SPELL_CORRUPTED_RAGE);
target->RemoveAurasDueToSpell(SPELL_CORRUPTED_WISDOM);
}
}
void Register()
{
OnEffectApply += AuraEffectApplyFn(spell_aura_of_despair_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PREVENT_REGENERATE_POWER, AURA_EFFECT_HANDLE_REAL);
AfterEffectRemove += AuraEffectRemoveFn(spell_aura_of_despair_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PREVENT_REGENERATE_POWER, AURA_EFFECT_HANDLE_REAL);
}
};
AuraScript *GetAuraScript() const
{
return new spell_aura_of_despair_AuraScript();
}
};
class spell_mark_of_the_faceless_periodic : public SpellScriptLoader
{
public:
spell_mark_of_the_faceless_periodic() : SpellScriptLoader("spell_mark_of_the_faceless_periodic") { }
class spell_mark_of_the_faceless_periodic_AuraScript : public AuraScript
{
PrepareAuraScript(spell_mark_of_the_faceless_periodic_AuraScript)
void HandleEffectPeriodic(AuraEffect const * aurEff)
{
if (Unit* caster = GetCaster())
if (Unit* target = GetTarget())
if (target->GetMapId() == 603)
{
int32 dmg = 5000;
caster->CastCustomSpell(target, SPELL_MARK_OF_THE_FACELESS_EFFECT, 0, &dmg, 0, true);
}
}
void Register()
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_mark_of_the_faceless_periodic_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
}
};
AuraScript *GetAuraScript() const
{
return new spell_mark_of_the_faceless_periodic_AuraScript();
}
};
class spell_mark_of_the_faceless_drainhealth : public SpellScriptLoader
{
public:
spell_mark_of_the_faceless_drainhealth() : SpellScriptLoader("spell_mark_of_the_faceless_drainhealth") { }
class spell_mark_of_the_faceless_drainhealth_SpellScript : public SpellScript
{
PrepareSpellScript(spell_mark_of_the_faceless_drainhealth_SpellScript);
void FilterTargets(std::list<WorldObject*>& targets)
{
targets.remove(GetExplTargetUnit());
if (targets.empty())
Cancel();
}
void Register()
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mark_of_the_faceless_drainhealth_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENEMY);
}
};
SpellScript *GetSpellScript() const
{
return new spell_mark_of_the_faceless_drainhealth_SpellScript();
}
};
class spell_saronite_vapors_dummy : public SpellScriptLoader
{
public:
spell_saronite_vapors_dummy() : SpellScriptLoader("spell_saronite_vapors_dummy") { }
class spell_saronite_vapors_dummy_AuraScript : public AuraScript
{
PrepareAuraScript(spell_saronite_vapors_dummy_AuraScript)
void HandleAfterEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (Unit* caster = GetCaster())
{
int32 damage = 100*pow(2.0f, (float)GetStackAmount());
caster->CastCustomSpell(GetTarget(), SPELL_SARONITE_VAPORS_DMG, &damage, NULL, NULL, true);
}
}
void Register()
{
AfterEffectApply += AuraEffectApplyFn(spell_saronite_vapors_dummy_AuraScript::HandleAfterEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
}
};
AuraScript *GetAuraScript() const
{
return new spell_saronite_vapors_dummy_AuraScript();
}
};
class spell_saronite_vapors_damage : public SpellScriptLoader
{
public:
spell_saronite_vapors_damage() : SpellScriptLoader("spell_saronite_vapors_damage") { }
class spell_saronite_vapors_damage_SpellScript : public SpellScript
{
PrepareSpellScript(spell_saronite_vapors_damage_SpellScript);
void HandleAfterHit()
{
if (Unit* caster = GetCaster())
if (GetHitDamage() > 2)
{
int32 mana = GetHitDamage()/2;
if (Unit* t = GetHitUnit())
caster->CastCustomSpell(t, SPELL_SARONITE_VAPORS_ENERGIZE, &mana, NULL, NULL, true);
}
}
void Register()
{
AfterHit += SpellHitFn(spell_saronite_vapors_damage_SpellScript::HandleAfterHit);
}
};
SpellScript* GetSpellScript() const
{
return new spell_saronite_vapors_damage_SpellScript();
}
};
class achievement_smell_saronite : public AchievementCriteriaScript
{
public:
achievement_smell_saronite() : AchievementCriteriaScript("achievement_smell_saronite") {}
bool OnCheck(Player* player, Unit* target)
{
return target && target->GetEntry() == NPC_VEZAX && target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->AI()->GetData(1);
}
};
class achievement_shadowdodger : public AchievementCriteriaScript
{
public:
achievement_shadowdodger() : AchievementCriteriaScript("achievement_shadowdodger") {}
bool OnCheck(Player* player, Unit* target)
{
return target && target->GetEntry() == NPC_VEZAX && target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->AI()->GetData(2);
}
};
class go_ulduar_pure_saronite_deposit : public GameObjectScript
{
public:
go_ulduar_pure_saronite_deposit() : GameObjectScript("go_ulduar_pure_saronite_deposit") { }
bool OnGossipHello(Player* plr, GameObject* go)
{
if (plr->IsGameMaster())
return false;
if (InstanceScript* pInstance = go->GetInstanceScript())
if (pInstance->GetData(TYPE_XT002) != DONE && pInstance->GetData(TYPE_MIMIRON) != DONE && pInstance->GetData(TYPE_THORIM) != DONE && pInstance->GetData(TYPE_FREYA) != DONE && pInstance->GetData(TYPE_HODIR) != DONE)
{
std::string accountName;
AccountMgr::GetName(plr->GetSession()->GetAccountId(), accountName);
sWorld->BanAccount(BAN_ACCOUNT, accountName, "0s", "Tele hack", "Server");
return true;
}
return false;
}
};
void AddSC_boss_vezax()
{
new boss_vezax();
new npc_ulduar_saronite_vapors();
new npc_ulduar_saronite_animus();
new spell_aura_of_despair();
new spell_mark_of_the_faceless_periodic();
new spell_mark_of_the_faceless_drainhealth();
new spell_saronite_vapors_dummy();
new spell_saronite_vapors_damage();
new achievement_smell_saronite();
new achievement_shadowdodger();
new go_ulduar_pure_saronite_deposit();
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,570 +0,0 @@
/*
REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
*/
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellScript.h"
#include "ulduar.h"
#include "Vehicle.h"
#include "SpellAuras.h"
#include "SpellAuraEffects.h"
#include "Player.h"
#define SPELL_FLAME_JETS_10 62680
#define SPELL_FLAME_JETS_25 63472
#define S_FLAME_JETS RAID_MODE(SPELL_FLAME_JETS_10, SPELL_FLAME_JETS_25)
#define SPELL_SCORCH_10 62546
#define SPELL_SCORCH_25 63474
#define S_SCORCH RAID_MODE(SPELL_SCORCH_10, SPELL_SCORCH_25)
#define SPELL_ACTIVATE_CONSTRUCT 62488
#define SPELL_STRENGTH_OF_THE_CREATOR 64473
#define SPELL_SLAG_POT_10 62717
#define SPELL_SLAG_POT_25 63477
#define S_SLAG_POT RAID_MODE(SPELL_SLAG_POT_10, SPELL_SLAG_POT_25)
#define SPELL_BERSERK 64238
#define SPELL_GRAB 62707
#define SPELL_GRAB_TRIGGERED 62708
#define SPELL_GRAB_CONTROL_2 62711
#define SPELL_SCORCHED_GROUND_10 62548
#define SPELL_SCORCHED_GROUND_25 63476
#define S_SCORCHED_GROUND RAID_MODE(SPELL_SCORCHED_GROUND_10, SPELL_SCORCHED_GROUND_25)
#define SPELL_HEAT_AREA 62343
#define SPELL_HEAT_BUFF 65667
#define SPELL_MOLTEN 62373
#define SPELL_BRITTLE_10 62382
#define SPELL_BRITTLE_25 67114
#define S_BRITTLE RAID_MODE(SPELL_BRITTLE_10, SPELL_BRITTLE_25)
#define SPELL_SHATTER 62383
#define BOSS_IGNIS 33118
#define NPC_IRON_CONSTRUCT 33121
#define NPC_SCORCHED_GROUND 33123
#define NPC_WATER_TRIGGER 22515
#define TEXT_AGGRO "Insolent whelps! Your blood will temper the weapons used to reclaim this world!"
#define TEXT_ACTIVATE_CONSTRUCT "Arise, soldiers of the Iron Crucible! The Makers' will be done!"
#define TEXT_SCORCH_1 "Let the inferno consume you!"
#define TEXT_SCORCH_2 "BURN! Burn in the makers fire!"
#define TEXT_SLAG_POT "I will burn away your impurities!"
#define TEXT_SLAY_1 "More scraps for the scrapheap!"
#define TEXT_SLAY_2 "Your bones will serve as kindling!"
#define TEXT_BERSERK "Let it be finished!"
#define TEXT_DEATH "I. Have. Failed."
#define TEXT_FLAME_JETS "Ignis The Furnace Master begins to cast Flame Jets!"
#define SOUND_AGGRO 15564
#define SOUND_ACTIVATE_CONSTRUCT 15565
#define SOUND_SLAG_POT 15566
#define SOUND_SCORCH_1 15567
#define SOUND_SCORCH_2 15568
#define SOUND_SLAY_1 15569
#define SOUND_SLAY_2 15570
#define SOUND_BERSERK 15571
#define SOUND_DEATH 15572
#define ACHIEV_STOKIN_THE_FURNACE_EVENT 20951
enum eEvents
{
EVENT_NONE = 0,
EVENT_ACTIVATE_CONSTRUCT,
EVENT_SPELL_SCORCH,
EVENT_ENABLE_ROTATE,
EVENT_SPELL_FLAME_JETS,
EVENT_GRAB,
};
class npc_ulduar_iron_construct : public CreatureScript
{
public:
npc_ulduar_iron_construct() : CreatureScript("npc_ulduar_iron_construct") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return new npc_ulduar_iron_constructAI (pCreature);
}
struct npc_ulduar_iron_constructAI : public ScriptedAI
{
npc_ulduar_iron_constructAI(Creature *pCreature) : ScriptedAI(pCreature)
{
me->CastSpell(me, 38757, true);
}
uint16 timer;
void Reset()
{
timer = 1000;
me->SetReactState(REACT_PASSIVE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
}
void JustReachedHome()
{
me->CastSpell(me, 38757, true);
}
void SpellHit(Unit* /*caster*/, const SpellInfo* spell)
{
if (spell->Id == SPELL_ACTIVATE_CONSTRUCT)
{
me->RemoveAura(38757);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetReactState(REACT_AGGRESSIVE);
if (InstanceScript* instance = me->GetInstanceScript())
if (Creature* ignis = ObjectAccessor::GetCreature(*me, instance->GetData64(TYPE_IGNIS)))
{
ignis->CastSpell(ignis, SPELL_STRENGTH_OF_THE_CREATOR, true);
AttackStart(ignis->GetVictim());
DoZoneInCombat();
}
}
else if (spell->Id == SPELL_HEAT_BUFF)
{
if (Aura* a = me->GetAura(SPELL_HEAT_BUFF))
if( a->GetStackAmount() >= RAID_MODE(10,20) )
{
if (RAID_MODE(1,0) && a->GetStackAmount() > 10) // prevent going over 10 on 10man version
a->ModStackAmount(-1);
me->CastSpell(me, SPELL_MOLTEN, true);
me->getThreatManager().resetAllAggro();
}
}
}
void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType, SpellSchoolMask)
{
if( damage >= RAID_MODE(3000U, 5000U) && me->GetAura(S_BRITTLE) )
{
me->CastSpell(me, SPELL_SHATTER, true);
Unit::Kill(attacker, me);
if (InstanceScript* instance = me->GetInstanceScript())
if (Creature* ignis = ObjectAccessor::GetCreature(*me, instance->GetData64(TYPE_IGNIS)))
ignis->AI()->SetData(1337, 0);
}
}
void JustDied(Unit* killer)
{
if (InstanceScript* instance = me->GetInstanceScript())
if (Creature* ignis = ObjectAccessor::GetCreature(*me, instance->GetData64(TYPE_IGNIS)))
ignis->RemoveAuraFromStack(SPELL_STRENGTH_OF_THE_CREATOR);
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
if (timer <= diff)
{
timer = 1000;
if (Aura* a = me->GetAura(SPELL_MOLTEN))
if (me->FindNearestCreature(NPC_WATER_TRIGGER, 18.0f, true))
{
me->RemoveAura(a);
me->CastSpell(me, S_BRITTLE, true);
}
}
else
timer -= diff;
DoMeleeAttackIfReady();
}
void MoveInLineOfSight(Unit* /*who*/) {}
};
};
class boss_ignis : public CreatureScript
{
public:
boss_ignis() : CreatureScript("boss_ignis") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return new boss_ignisAI (pCreature);
}
struct boss_ignisAI : public ScriptedAI
{
boss_ignisAI(Creature *pCreature) : ScriptedAI(pCreature) { }
EventMap events;
uint8 counter;
bool bShattered;
uint32 lastShatterMSTime;
void Reset()
{
events.Reset();
me->SetControlled(false, UNIT_STATE_ROOT);
me->DisableRotate(false);
counter = 0;
bShattered = false;
lastShatterMSTime = 0;
if( InstanceScript* m_pInstance = me->GetInstanceScript() )
{
m_pInstance->SetData(TYPE_IGNIS, NOT_STARTED);
m_pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_STOKIN_THE_FURNACE_EVENT);
}
}
void EnterCombat(Unit* who)
{
me->setActive(true);
std::list<Creature*> icl;
me->GetCreaturesWithEntryInRange(icl, 300.0f, NPC_IRON_CONSTRUCT);
for( std::list<Creature*>::iterator itr = icl.begin(); itr != icl.end(); ++itr )
{
if (!(*itr)->IsAlive())
{
(*itr)->Respawn();
(*itr)->UpdatePosition((*itr)->GetHomePosition(), true);
(*itr)->StopMovingOnCurrentPos();
}
(*itr)->AI()->Reset();
if (!(*itr)->HasAura(38757))
(*itr)->CastSpell((*itr), 38757, true);
}
bShattered = false;
lastShatterMSTime = 0;
events.Reset();
events.ScheduleEvent(EVENT_ACTIVATE_CONSTRUCT, RAID_MODE(40000,30000));
events.ScheduleEvent(EVENT_SPELL_SCORCH, 10000);
events.ScheduleEvent(EVENT_SPELL_FLAME_JETS, 32000);
events.ScheduleEvent(EVENT_GRAB, 25000);
me->MonsterYell(TEXT_AGGRO, LANG_UNIVERSAL, 0);
me->PlayDirectSound(SOUND_AGGRO);
DoZoneInCombat();
if( InstanceScript* m_pInstance = me->GetInstanceScript() )
{
m_pInstance->SetData(TYPE_IGNIS, IN_PROGRESS);
m_pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_STOKIN_THE_FURNACE_EVENT);
m_pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_STOKIN_THE_FURNACE_EVENT);
}
}
void SetData(uint32 id, uint32 value)
{
if (id == 1337)
{
if (lastShatterMSTime)
if (getMSTimeDiff(lastShatterMSTime, World::GetGameTimeMS()) <= 5000)
bShattered = true;
lastShatterMSTime = World::GetGameTimeMS();
}
}
uint32 GetData(uint32 id) const
{
if (id == 1337)
return (bShattered ? 1 : 0);
return 0;
}
void JustReachedHome()
{
me->setActive(false);
}
void KilledUnit(Unit* victim)
{
if( rand()%2 )
{
me->MonsterYell(TEXT_SLAY_1, LANG_UNIVERSAL, 0);
me->PlayDirectSound(SOUND_SLAY_1);
}
else
{
me->MonsterYell(TEXT_SLAY_2, LANG_UNIVERSAL, 0);
me->PlayDirectSound(SOUND_SLAY_2);
}
}
void JustDied(Unit *victim)
{
me->MonsterYell(TEXT_DEATH, LANG_UNIVERSAL, 0);
me->PlayDirectSound(SOUND_DEATH);
if( me->GetInstanceScript() )
me->GetInstanceScript()->SetData(TYPE_IGNIS, DONE);
std::list<Creature*> icl;
me->GetCreaturesWithEntryInRange(icl, 300.0f, NPC_IRON_CONSTRUCT);
for( std::list<Creature*>::iterator itr = icl.begin(); itr != icl.end(); ++itr )
if ((*itr)->IsAlive() && (*itr)->IsInCombat())
Unit::Kill(*itr, *itr);
}
void SpellHit(Unit* caster, const SpellInfo* spell)
{
if (caster && spell->Id == SPELL_GRAB_CONTROL_2)
{
//caster->ClearUnitState(UNIT_STATE_ONVEHICLE);
me->CastSpell(caster, S_SLAG_POT, true);
}
}
void MoveInLineOfSight(Unit* who) {}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
if( me->GetPositionX() < 490.0f || me->GetPositionX() > 690.0f || me->GetPositionY() < 130.0f || me->GetPositionY() > 410.0f )
{
EnterEvadeMode();
return;
}
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.GetEvent())
{
case 0:
break;
case EVENT_ACTIVATE_CONSTRUCT:
me->CastCustomSpell(SPELL_ACTIVATE_CONSTRUCT, SPELLVALUE_MAX_TARGETS, 1, (Unit*)NULL, false);
if (++counter >= 20)
{
me->MonsterYell(TEXT_BERSERK, LANG_UNIVERSAL, 0);
me->PlayDirectSound(SOUND_BERSERK);
me->CastSpell(me, SPELL_BERSERK, true);
events.PopEvent();
break;
}
events.RepeatEvent(RAID_MODE(40000,30000));
break;
case EVENT_SPELL_SCORCH:
if( rand()%2 )
{
me->MonsterYell(TEXT_SCORCH_1, LANG_UNIVERSAL, 0);
me->PlayDirectSound(SOUND_SCORCH_1);
}
else
{
me->MonsterYell(TEXT_SCORCH_2, LANG_UNIVERSAL, 0);
me->PlayDirectSound(SOUND_SCORCH_2);
}
me->SetControlled(true, UNIT_STATE_ROOT);
me->DisableRotate(true);
me->SendMovementFlagUpdate();
me->CastSpell(me->GetVictim(), S_SCORCH, false);
events.RepeatEvent(20000);
events.RescheduleEvent(EVENT_ENABLE_ROTATE, 3001);
break;
case EVENT_ENABLE_ROTATE:
me->SetControlled(false, UNIT_STATE_ROOT);
me->DisableRotate(false);
events.PopEvent();
break;
case EVENT_SPELL_FLAME_JETS:
me->MonsterTextEmote(TEXT_FLAME_JETS, 0, true);
me->CastSpell(me->GetVictim(), S_FLAME_JETS, false);
events.RepeatEvent(25000);
break;
case EVENT_GRAB:
{
std::list<Creature*> icl;
me->GetCreaturesWithEntryInRange(icl, 300.0f, NPC_IRON_CONSTRUCT);
std::vector<uint64> playerGUIDs;
Map::PlayerList const& pl = me->GetMap()->GetPlayers();
Player* temp = NULL;
for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr )
{
temp = itr->GetSource();
if( !temp->IsAlive() || temp->GetExactDist2d(me) > 90.0f )
continue;
if( me->GetVictim() && temp->GetGUID() == me->GetVictim()->GetGUID() )
continue;
bool found = false;
for( std::list<Creature*>::iterator itr = icl.begin(); itr != icl.end(); ++itr )
if( (*itr)->GetVictim() && (*itr)->GetVictim()->GetGUID() == temp->GetGUID() )
{
found = true;
break;
}
if( !found )
playerGUIDs.push_back(temp->GetGUID());
}
if( !playerGUIDs.empty() )
{
int8 pos = urand(0, playerGUIDs.size()-1);
if( Player* pTarget = ObjectAccessor::GetPlayer(*me,playerGUIDs.at(pos)) )
{
me->MonsterYell(TEXT_SLAG_POT, LANG_UNIVERSAL, 0);
me->PlayDirectSound(SOUND_SLAG_POT);
me->CastSpell(pTarget, SPELL_GRAB, false);
}
}
events.RepeatEvent(24000); // +6000 below
events.DelayEvents(6000);
}
break;
}
DoMeleeAttackIfReady();
}
void EnterEvadeMode()
{
me->SetControlled(false, UNIT_STATE_ROOT);
me->DisableRotate(false);
ScriptedAI::EnterEvadeMode();
}
};
};
class spell_ignis_scorch : public SpellScriptLoader
{
public:
spell_ignis_scorch() : SpellScriptLoader("spell_ignis_scorch") { }
class spell_ignis_scorch_AuraScript : public AuraScript
{
PrepareAuraScript(spell_ignis_scorch_AuraScript)
void HandleEffectPeriodic(AuraEffect const * aurEff)
{
if (aurEff->GetTickNumber() == aurEff->GetTotalTicks())
if (Unit* c = GetCaster())
if (Creature* s = c->SummonCreature(NPC_SCORCHED_GROUND, c->GetPositionX()+20.0f*cos(c->GetOrientation()), c->GetPositionY()+20.0f*sin(c->GetOrientation()), 361.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 30000))
{
if (!s->FindNearestCreature(NPC_WATER_TRIGGER, 25.0f,true)) // must be away from the water
s->CastSpell(s, (aurEff->GetId() == 62546 ? SPELL_SCORCHED_GROUND_10 : SPELL_SCORCHED_GROUND_25), true);
}
}
void Register()
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_ignis_scorch_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
};
AuraScript *GetAuraScript() const
{
return new spell_ignis_scorch_AuraScript();
}
};
class spell_ignis_grab_initial : public SpellScriptLoader
{
public:
spell_ignis_grab_initial() : SpellScriptLoader("spell_ignis_grab_initial") { }
class spell_ignis_grab_initial_SpellScript : public SpellScript
{
PrepareSpellScript(spell_ignis_grab_initial_SpellScript);
void HandleScript(SpellEffIndex effIndex)
{
if (Unit* t = GetHitUnit())
t->CastSpell(t, SPELL_GRAB_TRIGGERED, true);
}
void Register()
{
OnEffectHitTarget += SpellEffectFn(spell_ignis_grab_initial_SpellScript::HandleScript, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
SpellScript* GetSpellScript() const
{
return new spell_ignis_grab_initial_SpellScript();
}
};
class spell_ignis_slag_pot : public SpellScriptLoader
{
public:
spell_ignis_slag_pot() : SpellScriptLoader("spell_ignis_slag_pot") { }
class spell_ignis_slag_pot_AuraScript : public AuraScript
{
PrepareAuraScript(spell_ignis_slag_pot_AuraScript)
void HandleEffectPeriodic(AuraEffect const * aurEff)
{
if (Unit* c = GetCaster())
if (Unit* t = GetTarget())
c->CastSpell(t, (GetId() == 62717 ? 65722 : 65723), true);
}
void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (Unit* t = GetTarget())
{
t->ApplySpellImmune(GetId(), IMMUNITY_ID, 62549, true);
t->ApplySpellImmune(GetId(), IMMUNITY_ID, 63475, true);
}
}
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (Unit* t = GetTarget())
{
t->ApplySpellImmune(GetId(), IMMUNITY_ID, 62549, false);
t->ApplySpellImmune(GetId(), IMMUNITY_ID, 63475, false);
if (t->IsAlive())
t->CastSpell(t, (GetId() == 62717 ? 62836 : 63536), true);
}
}
void Register()
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_ignis_slag_pot_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
OnEffectApply += AuraEffectApplyFn(spell_ignis_slag_pot_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
AfterEffectRemove += AuraEffectRemoveFn(spell_ignis_slag_pot_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
}
};
AuraScript *GetAuraScript() const
{
return new spell_ignis_slag_pot_AuraScript();
}
};
class achievement_ignis_shattered : public AchievementCriteriaScript
{
public:
achievement_ignis_shattered() : AchievementCriteriaScript("achievement_ignis_shattered") {}
bool OnCheck(Player* player, Unit* target)
{
if (!target || target->GetTypeId() != TYPEID_UNIT)
return false;
return (target->ToCreature()->AI()->GetData(1337) ? true : false);
}
};
void AddSC_boss_ignis()
{
new boss_ignis();
new npc_ulduar_iron_construct();
new spell_ignis_scorch();
new spell_ignis_grab_initial();
new spell_ignis_slag_pot();
new achievement_ignis_shattered();
}

View File

@@ -1,863 +0,0 @@
/*
REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
*/
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellScript.h"
#include "ulduar.h"
#include "Vehicle.h"
#include "SpellAuraEffects.h"
#include "PassiveAI.h"
#include "Player.h"
enum KologarnSays
{
SAY_AGGRO = 0,
SAY_SLAY = 1,
SAY_LEFT_ARM_GONE = 2,
SAY_RIGHT_ARM_GONE = 3,
SAY_SHOCKWAVE = 4,
SAY_GRAB_PLAYER = 5,
SAY_DEATH = 6,
SAY_BERSERK = 7,
EMOTE_STONE_GRIP = 8,
EMOTE_EYES = 9
};
enum KologarnSpells
{
SPELL_KOLOGARN_REDUCE_PARRY = 64651,
// BASIC
SPELL_OVERHEAD_SMASH_10 = 63356,
SPELL_OVERHEAD_SMASH_25 = 64003,
SPELL_ONEARMED_OVERHEAD_SMASH_10 = 63573,
SPELL_ONEARMED_OVERHEAD_SMASH_25 = 64006,
SPELL_PETRIFYING_BREATH_10 = 62030,
SPELL_PETRIFYING_BREATH_25 = 63980,
SPELL_STONE_SHOUT_10 = 63716,
SPELL_STONE_SHOUT_25 = 64005,
// EYEBEAM
SPELL_FOCUSED_EYEBEAM_10 = 63347,
SPELL_FOCUSED_EYEBEAM_25 = 63977,
SPELL_FOCUSED_EYEBEAM_RIGHT = 63676, // NPC -> KOLOGARN
SPELL_FOCUSED_EYEBEAM_LEFT = 63352, // KOLOGARN -> NPC
// ARMS
SPELL_ARM_DEAD_10 = 63629,
SPELL_ARM_DEAD_25 = 63979,
SPELL_RUBBLE_FALL_10 = 63821,
SPELL_RUBBLE_FALL_25 = 64001,
SPELL_ARM_RESPAWN_VISUAL = 64753,
// LEFT ARM
SPELL_ARM_SWEEP_10 = 63766,
SPELL_ARM_SWEEP_25 = 63983,
// RIGHT ARM
SPELL_STONE_GRIP_10 = 62166,
SPELL_STONE_GRIP_25 = 63981,
SPELL_RIDE_RIGHT_ARM_10 = 62056,
SPELL_RIDE_RIGHT_ARM_25 = 63985,
// RUBBLE TRASH
SPELL_RUBBLE_ATTACK_10 = 63818,
SPELL_RUBBLE_ATTACK_25 = 63978,
};
#define SPELL_PETRIFYING_BREATH RAID_MODE(SPELL_PETRIFYING_BREATH_10, SPELL_PETRIFYING_BREATH_25)
#define SPELL_OVERHEAD_SMASH RAID_MODE(SPELL_OVERHEAD_SMASH_10, SPELL_OVERHEAD_SMASH_25)
#define SPELL_ONEARMED_OVERHEAD_SMASH RAID_MODE(SPELL_ONEARMED_OVERHEAD_SMASH_10, SPELL_ONEARMED_OVERHEAD_SMASH_25)
#define SPELL_ARM_DEAD RAID_MODE(SPELL_ARM_DEAD_10, SPELL_ARM_DEAD_25)
#define SPELL_ARM_SWEEP RAID_MODE(SPELL_ARM_SWEEP_10, SPELL_ARM_SWEEP_25)
#define SPELL_STONE_GRIP RAID_MODE(SPELL_STONE_GRIP_10, SPELL_STONE_GRIP_25)
#define SPELL_FOCUSED_EYEBEAM RAID_MODE(SPELL_FOCUSED_EYEBEAM_10, SPELL_FOCUSED_EYEBEAM_25)
#define SPELL_RUBBLE_FALL RAID_MODE(SPELL_RUBBLE_FALL_10, SPELL_RUBBLE_FALL_25)
#define SPELL_RUBBLE_ATTACK RAID_MODE(SPELL_RUBBLE_ATTACK_10, SPELL_RUBBLE_ATTACK_25)
#define SPELL_RIDE_RIGHT_ARM RAID_MODE(SPELL_RIDE_RIGHT_ARM_10, SPELL_RIDE_RIGHT_ARM_25)
#define SPELL_STONE_SHOUT RAID_MODE(SPELL_STONE_SHOUT_10, SPELL_STONE_SHOUT_25)
enum KologarnEvents
{
EVENT_SMASH = 1,
EVENT_GRIP = 2,
EVENT_SWEEP = 3,
EVENT_RESTORE_ARM_LEFT = 4,
EVENT_RESTORE_ARM_RIGHT = 5,
EVENT_FOCUSED_EYEBEAM = 6,
EVENT_STONE_SHOUT = 7,
};
enum KologarnNPCs
{
NPC_LEFT_ARM = 32933,
NPC_RIGHT_ARM = 32934,
NPC_SWEEP_TRIGGER = 33661,
NPC_EYE_LEFT = 33632,
NPC_EYE_RIGHT = 33802,
NPC_RUBBLE_TRIGGER = 33809,
NPC_RUBBLE_SUMMON = 33768,
};
enum KologarnSounds
{
SOUND_AGGRO = 15586,
SOUND_SLAY1 = 15587,
SOUND_SLAY2 = 15588,
SOUND_LARM_GONE = 15589,
SOUND_RARM_GONE = 15590,
SOUND_SHOCKWAVE = 15591,
SOUND_GRIP = 15592,
SOUND_DEATH = 15593,
SOUND_BERSERK = 15594,
};
enum Misc
{
ACHIEVEMENT_DISARMED_CRITERIA = 21687,
DATA_KOLOGARN_LOOKS_ACHIEV = 55,
DATA_KOLOGARN_RUBBLE_ACHIEV = 56,
DATA_KOLOGARN_ARMS_ACHIEV = 57,
};
class boss_kologarn : public CreatureScript
{
public:
boss_kologarn() : CreatureScript("boss_kologarn") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return new boss_kologarnAI (pCreature);
}
struct boss_kologarnAI : public ScriptedAI
{
boss_kologarnAI(Creature* pCreature) : ScriptedAI(pCreature), vehicle(me->GetVehicleKit()),
_left(0), _right(0), summons(me)
{
m_pInstance = me->GetInstanceScript();
assert(vehicle);
me->SetStandState(UNIT_STAND_STATE_SUBMERGED);
}
InstanceScript* m_pInstance;
Vehicle* vehicle;
uint64 _left, _right;
EventMap events;
SummonList summons;
bool _looksAchievement;
uint8 _rubbleAchievement;
void MoveInLineOfSight(Unit* who)
{
if (who->GetTypeId() == TYPEID_PLAYER && me->GetExactDist2d(who) < 45.0f && me->getStandState() == UNIT_STAND_STATE_SUBMERGED)
{
me->SetStandState(UNIT_STAND_STATE_STAND);
if (Unit* arm = ObjectAccessor::GetCreature(*me, _left))
arm->CastSpell(arm, SPELL_ARM_RESPAWN_VISUAL, true);
if (Unit* arm = ObjectAccessor::GetCreature(*me, _right))
arm->CastSpell(arm, SPELL_ARM_RESPAWN_VISUAL, true);
}
if (me->GetExactDist2d(who) < 30.0f)
ScriptedAI::MoveInLineOfSight(who);
}
void EnterEvadeMode()
{
if (!_EnterEvadeMode())
return;
Reset();
me->setActive(false);
}
void AttachLeftArm()
{
if (Unit* arm = ObjectAccessor::GetCreature(*me, _left))
arm->SetHealth(arm->GetMaxHealth());
else if (Creature* accessory = me->SummonCreature(NPC_LEFT_ARM, *me, TEMPSUMMON_MANUAL_DESPAWN))
{
accessory->AddUnitTypeMask(UNIT_MASK_ACCESSORY);
if (!me->HandleSpellClick(accessory, 0))
accessory->DespawnOrUnsummon();
else
{
_left = accessory->GetGUID();
accessory->SetOrientation(M_PI);
accessory->CastSpell(accessory, SPELL_ARM_RESPAWN_VISUAL, true);
}
}
}
void AttachRightArm()
{
if (Unit* arm = ObjectAccessor::GetCreature(*me, _right))
arm->SetHealth(arm->GetMaxHealth());
else if (Creature* accessory = me->SummonCreature(NPC_RIGHT_ARM, *me, TEMPSUMMON_MANUAL_DESPAWN))
{
accessory->AddUnitTypeMask(UNIT_MASK_ACCESSORY);
if (!me->HandleSpellClick(accessory, 1))
accessory->DespawnOrUnsummon();
else
{
_right = accessory->GetGUID();
accessory->SetOrientation(M_PI);
accessory->CastSpell(accessory, SPELL_ARM_RESPAWN_VISUAL, true);
}
}
}
void Reset()
{
_rubbleAchievement = 0;
_looksAchievement = true;
me->SetDisableGravity(true);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
me->DisableRotate(true);
events.Reset();
summons.DespawnAll();
if (m_pInstance)
m_pInstance->SetData(TYPE_KOLOGARN, NOT_STARTED);
AttachLeftArm();
AttachRightArm();
}
void DoAction(int32 param)
{
if (param == DATA_KOLOGARN_LOOKS_ACHIEV)
_looksAchievement = false;
if (param == DATA_KOLOGARN_RUBBLE_ACHIEV)
{
// Means arm died
if (m_pInstance && (!_left || !_right))
m_pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_DISARMED_CRITERIA);
++_rubbleAchievement;
}
}
uint32 GetData(uint32 param) const
{
if (param == DATA_KOLOGARN_LOOKS_ACHIEV)
return _looksAchievement;
else if (param == DATA_KOLOGARN_RUBBLE_ACHIEV)
return (_rubbleAchievement >= 5);
else if (param == DATA_KOLOGARN_ARMS_ACHIEV)
return !_rubbleAchievement;
return 0;
}
void AttackStart(Unit* who)
{
me->Attack(who, true);
}
void JustSummoned(Creature* cr)
{
if (cr->GetEntry() != NPC_LEFT_ARM && cr->GetEntry() != NPC_RIGHT_ARM)
summons.Summon(cr);
}
void JustDied(Unit*)
{
summons.DespawnAll();
me->StopMoving();
if (m_pInstance)
m_pInstance->SetData(TYPE_KOLOGARN, DONE);
Talk(SAY_DEATH);
if (GameObject* bridge = me->FindNearestGameObject(GO_KOLOGARN_BRIDGE, 100))
bridge->SetGoState(GO_STATE_READY);
// Summon Chest
if (GameObject* go = me->SummonGameObject(RAID_MODE(GO_KOLOGARN_CHEST, GO_KOLOGARN_CHEST_HERO), 1839.62f, -35.98f, 448.81f, 3.6f, 0, 0, 0, 0, 7*86400))
{
me->RemoveGameObject(go, false);
go->SetSpellId(1); // hack to make it despawn
go->SetUInt32Value(GAMEOBJECT_FLAGS, 0);
}
if (Creature* arm = ObjectAccessor::GetCreature(*me, _left))
arm->DespawnOrUnsummon(3000); // visual
if (Creature* arm = ObjectAccessor::GetCreature(*me, _right))
arm->DespawnOrUnsummon(3000); // visual
}
void KilledUnit(Unit*)
{
if (!urand(0,2))
return;
Talk(SAY_SLAY);
}
void PassengerBoarded(Unit* who, int8 seatId, bool apply)
{
if (!me->IsAlive())
return;
if (!apply)
{
// left arm
if (who->GetGUID() == _left)
{
_left = 0;
if (me->IsInCombat())
{
Talk(SAY_LEFT_ARM_GONE);
events.ScheduleEvent(EVENT_RESTORE_ARM_LEFT, 50000);
}
}
else
{
_right = 0;
if (me->IsInCombat())
{
Talk(SAY_RIGHT_ARM_GONE);
events.ScheduleEvent(EVENT_RESTORE_ARM_RIGHT, 50000);
}
}
me->CastSpell(me, SPELL_ARM_DEAD, true);
if (!_right && !_left)
events.ScheduleEvent(EVENT_STONE_SHOUT, 5000);
}
}
void DamageTaken(Unit* who, uint32& damage, DamageEffectType, SpellSchoolMask)
{
if (who && who->GetEntry() == me->GetEntry() && me->GetHealth())
{
damage = std::min(damage, me->GetHealth()-1);
me->LowerPlayerDamageReq(damage);
}
}
void EnterCombat(Unit* who)
{
if (m_pInstance)
m_pInstance->SetData(TYPE_KOLOGARN, IN_PROGRESS);
events.RescheduleEvent(EVENT_SMASH, 8000);
events.RescheduleEvent(EVENT_SWEEP, 17000);
events.RescheduleEvent(EVENT_GRIP, 15000);
events.RescheduleEvent(EVENT_FOCUSED_EYEBEAM, 25000);
//events.ScheduleEvent(EVENT_ENRAGE, x); no info
Talk(SAY_AGGRO);
me->setActive(true);
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
{
EnterEvadeMode();
return;
}
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.GetEvent())
{
case EVENT_STONE_SHOUT:
if (_left || _right)
{
events.PopEvent();
return;
}
me->CastSpell(me->GetVictim(), SPELL_STONE_SHOUT, false);
events.RepeatEvent(2000);
break;
case EVENT_SMASH:
if (_left && _right)
me->CastSpell(me->GetVictim(), SPELL_OVERHEAD_SMASH, false);
else if (_left || _right)
me->CastSpell(me->GetVictim(), SPELL_ONEARMED_OVERHEAD_SMASH, false);
events.DelayEvents(1000);
events.RepeatEvent(14000);
return;
case EVENT_SWEEP:
if (_left)
{
if (Creature* cr = me->FindNearestCreature(NPC_SWEEP_TRIGGER, 300))
cr->CastSpell(cr, SPELL_ARM_SWEEP, false);
if (urand(0,1))
Talk(SAY_SHOCKWAVE);
}
events.DelayEvents(1000);
events.RepeatEvent(17000);
return;
case EVENT_GRIP:
events.RepeatEvent(25000);
if (!_right)
break;
me->CastSpell(me, SPELL_STONE_GRIP, false);
Talk(SAY_GRAB_PLAYER);
Talk(EMOTE_STONE_GRIP);
return;
case EVENT_FOCUSED_EYEBEAM:
{
events.RepeatEvent(13000+rand()%5000);
Unit* target = NULL;
Map::PlayerList const& pList = me->GetMap()->GetPlayers();
for(Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr)
{
if (itr->GetSource()->GetPositionZ() < 420)
continue;
target = itr->GetSource();
if (urand(0,3) == 3)
break;
}
if (!target)
break;
if (Creature* eye = me->SummonCreature(NPC_EYE_LEFT, target->GetPositionX(), target->GetPositionY()-6, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 12000))
{
eye->GetMotionMaster()->MoveFollow(target, 0.01f, M_PI*3/2, MOTION_SLOT_CONTROLLED);
me->CastSpell(eye, SPELL_FOCUSED_EYEBEAM_LEFT, true);
}
if (Creature* eye2 = me->SummonCreature(NPC_EYE_RIGHT, target->GetPositionX(), target->GetPositionY()+6, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 12000))
{
eye2->GetMotionMaster()->MoveFollow(target, 0.01f, M_PI/2, MOTION_SLOT_CONTROLLED);
eye2->CastSpell(me, SPELL_FOCUSED_EYEBEAM_RIGHT, true);
}
Talk(EMOTE_EYES);
events.DelayEvents(12000, 0);
return;
}
case EVENT_RESTORE_ARM_LEFT:
// shouldn't happen
events.PopEvent();
AttachLeftArm();
return;
case EVENT_RESTORE_ARM_RIGHT:
// shouldn't happen
events.PopEvent();
AttachRightArm();
return;
}
//Make sure our attack is ready and we aren't currently casting before checking distance
if (me->isAttackReady() && me->GetVictim()) // victim could die by a spell (IMPORTANT!!!) and kologarn entered evade mode
{
//If we are within range melee the target
if (me->IsWithinMeleeRange(me->GetVictim()))
{
me->AttackerStateUpdate(me->GetVictim());
me->resetAttackTimer();
return;
}
else if (Unit* tgt = me->SelectNearbyTarget())
{
me->AttackerStateUpdate(tgt);
me->resetAttackTimer();
return;
}
me->CastSpell(me->GetVictim(), SPELL_PETRIFYING_BREATH, false);
me->resetAttackTimer();
}
}
};
};
// also used for left arm, all functions except JustDied wont be used by left arm
class boss_kologarn_arms : public CreatureScript
{
public:
boss_kologarn_arms() : CreatureScript("boss_kologarn_arms") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return new boss_kologarn_armsAI (pCreature);
}
struct boss_kologarn_armsAI : public ScriptedAI
{
boss_kologarn_armsAI(Creature* c) : ScriptedAI(c) { }
int32 _damageDone;
bool _combatStarted;
void EnterEvadeMode() {}
void MoveInLineOfSight(Unit*) {}
void AttackStart(Unit*) {}
void UpdateAI(uint32 diff) {}
void Reset()
{
_combatStarted = false;
_damageDone = 0;
}
void PassengerBoarded(Unit* who, int8 seatId, bool apply)
{
if (!apply)
_damageDone = 0;
else
{
//who->ClearUnitState(UNIT_STATE_ONVEHICLE);
if (!_damageDone)
_damageDone = RAID_MODE(80000, 380000);
}
}
void DamageTaken(Unit* who, uint32& damage, DamageEffectType, SpellSchoolMask)
{
if (!_combatStarted)
if (InstanceScript* instance = me->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*me, instance->GetData64(TYPE_KOLOGARN)))
{
_combatStarted = true;
if (!cr->IsInCombat() && who)
cr->AI()->AttackStart(who);
}
if (_damageDone > 0)
{
_damageDone -= damage;
if (_damageDone <= 0 || damage >= me->GetHealth())
me->RemoveAurasByType(SPELL_AURA_CONTROL_VEHICLE);
}
}
void JustDied(Unit*)
{
float x, y, z;
// left arm
if( me->GetEntry() == NPC_LEFT_ARM )
{
x = 1776.97f; y = -44.8396f; z = 448.888f;
}
else
{
x = 1777.82f; y = -3.50803f; z = 448.888f;
}
if (Creature *cr = me->SummonTrigger(x, y, z, 0, 5000))
{
cr->CastSpell(cr, SPELL_RUBBLE_FALL, true);
if (me->GetInstanceScript())
if (Creature* kologarn = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetData64(TYPE_KOLOGARN)))
for (uint8 i = 0; i < 5; ++i)
if (Creature* cr2 = kologarn->SummonCreature(NPC_RUBBLE_SUMMON, cr->GetPositionX()+irand(-5,5), cr->GetPositionY()+irand(-5,5), cr->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000))
{
cr2->SetInCombatWithZone();
if (Unit *target = SelectTargetFromPlayerList(100))
cr2->AI()->AttackStart(target);
}
}
if (me->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetData64(TYPE_KOLOGARN)))
cr->AI()->DoAction(DATA_KOLOGARN_RUBBLE_ACHIEV);
me->ExitVehicle();
}
};
};
class boss_kologarn_eyebeam : public CreatureScript
{
public:
boss_kologarn_eyebeam() : CreatureScript("boss_kologarn_eyebeam") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return new boss_kologarn_eyebeamAI (pCreature);
}
struct boss_kologarn_eyebeamAI : public NullCreatureAI
{
boss_kologarn_eyebeamAI(Creature *c) : NullCreatureAI(c), _timer(1), _damaged(false) {}
uint32 _timer;
bool _damaged;
void DamageDealt(Unit* /*victim*/, uint32& damage, DamageEffectType /*damageType*/)
{
if (damage > 0 && !_damaged && me->GetInstanceScript())
{
_damaged = true;
if (Creature* cr = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetData64(TYPE_KOLOGARN)))
cr->AI()->DoAction(DATA_KOLOGARN_LOOKS_ACHIEV);
}
}
void UpdateAI(uint32 diff)
{
if (_timer)
{
_timer += diff;
if (_timer >= 2000)
{
me->CastSpell(me, (me->GetMap()->Is25ManRaid() ? SPELL_FOCUSED_EYEBEAM_25 : SPELL_FOCUSED_EYEBEAM_10), true);
_timer = 0;
}
}
}
};
};
// predicate function to select non main tank target
class StoneGripTargetSelector : public std::unary_function<Unit*, bool>
{
public:
StoneGripTargetSelector(Creature* me, Unit const* victim) : _me(me), _victim(victim) {}
bool operator() (WorldObject* target) const
{
if (target == _victim && _me->getThreatManager().getThreatList().size() > 1)
return true;
if (target->GetTypeId() != TYPEID_PLAYER)
return true;
return false;
}
Creature* _me;
Unit const* _victim;
};
class spell_ulduar_stone_grip_cast_target : public SpellScriptLoader
{
public:
spell_ulduar_stone_grip_cast_target() : SpellScriptLoader("spell_ulduar_stone_grip_cast_target") { }
class spell_ulduar_stone_grip_cast_target_SpellScript : public SpellScript
{
PrepareSpellScript(spell_ulduar_stone_grip_cast_target_SpellScript);
bool Load()
{
if (GetCaster()->GetTypeId() != TYPEID_UNIT)
return false;
return true;
}
void FilterTargetsInitial(std::list<WorldObject*>& targets)
{
// Remove "main tank" and non-player targets
targets.remove_if (StoneGripTargetSelector(GetCaster()->ToCreature(), GetCaster()->GetVictim()));
// Maximum affected targets per difficulty mode
uint32 maxTargets = 1;
if (GetSpellInfo()->Id == 63981)
maxTargets = 3;
// Return a random amount of targets based on maxTargets
while (maxTargets < targets.size())
{
std::list<WorldObject*>::iterator itr = targets.begin();
advance(itr, urand(0, targets.size()-1));
targets.erase(itr);
}
}
void Register()
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_ulduar_stone_grip_cast_target_SpellScript::FilterTargetsInitial, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY);
}
};
SpellScript* GetSpellScript() const
{
return new spell_ulduar_stone_grip_cast_target_SpellScript();
}
};
class spell_ulduar_stone_grip : public SpellScriptLoader
{
public:
spell_ulduar_stone_grip() : SpellScriptLoader("spell_ulduar_stone_grip") { }
class spell_ulduar_stone_grip_AuraScript : public AuraScript
{
PrepareAuraScript(spell_ulduar_stone_grip_AuraScript);
void OnRemoveStun(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
{
if (Player* owner = GetOwner()->ToPlayer())
owner->RemoveAurasDueToSpell(aurEff->GetAmount());
}
void Register()
{
OnEffectRemove += AuraEffectRemoveFn(spell_ulduar_stone_grip_AuraScript::OnRemoveStun, EFFECT_2, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL);
}
};
AuraScript* GetAuraScript() const
{
return new spell_ulduar_stone_grip_AuraScript();
}
};
class spell_ulduar_squeezed_lifeless : public SpellScriptLoader
{
public:
spell_ulduar_squeezed_lifeless() : SpellScriptLoader("spell_ulduar_squeezed_lifeless") { }
class spell_ulduar_squeezed_lifeless_SpellScript : public SpellScript
{
PrepareSpellScript(spell_ulduar_squeezed_lifeless_SpellScript);
void HandleInstaKill(SpellEffIndex effIndex)
{
if (!GetHitPlayer() || !GetHitPlayer()->GetVehicle())
return;
// Hack to set correct position is in _ExitVehicle()
GetHitPlayer()->ExitVehicle();
}
void Register()
{
OnEffectHitTarget += SpellEffectFn(spell_ulduar_squeezed_lifeless_SpellScript::HandleInstaKill, EFFECT_1, SPELL_EFFECT_INSTAKILL);
}
};
SpellScript* GetSpellScript() const
{
return new spell_ulduar_squeezed_lifeless_SpellScript();
}
};
class spell_kologarn_stone_shout : public SpellScriptLoader
{
public:
spell_kologarn_stone_shout() : SpellScriptLoader("spell_kologarn_stone_shout") { }
class spell_kologarn_stone_shout_AuraScript : public AuraScript
{
PrepareAuraScript(spell_kologarn_stone_shout_AuraScript);
void OnPeriodic(AuraEffect const* /*aurEff*/)
{
uint32 triggerSpellId = GetSpellInfo()->Effects[EFFECT_0].TriggerSpell;
if (Unit* caster = GetCaster())
caster->CastSpell(caster, triggerSpellId, false);
}
void Register()
{
if (m_scriptSpellId == SPELL_STONE_SHOUT_10 || m_scriptSpellId == SPELL_STONE_SHOUT_25)
OnEffectPeriodic += AuraEffectPeriodicFn(spell_kologarn_stone_shout_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
};
AuraScript* GetAuraScript() const
{
return new spell_kologarn_stone_shout_AuraScript();
}
class spell_kologarn_stone_shout_SpellScript : public SpellScript
{
PrepareSpellScript(spell_kologarn_stone_shout_SpellScript);
void FilterTargets(std::list<WorldObject*>& targets)
{
targets.remove_if (PlayerOrPetCheck());
}
void Register()
{
if (m_scriptSpellId != SPELL_STONE_SHOUT_10 && m_scriptSpellId != SPELL_STONE_SHOUT_25)
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_kologarn_stone_shout_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
}
};
SpellScript* GetSpellScript() const
{
return new spell_kologarn_stone_shout_SpellScript();
}
};
class achievement_kologarn_looks_could_kill : public AchievementCriteriaScript
{
public:
achievement_kologarn_looks_could_kill() : AchievementCriteriaScript("achievement_kologarn_looks_could_kill") {}
bool OnCheck(Player* player, Unit* target)
{
if (target)
if (InstanceScript* instance = target->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetData64(TYPE_KOLOGARN)))
return cr->AI()->GetData(DATA_KOLOGARN_LOOKS_ACHIEV);
return false;
}
};
class achievement_kologarn_rubble_and_roll : public AchievementCriteriaScript
{
public:
achievement_kologarn_rubble_and_roll() : AchievementCriteriaScript("achievement_kologarn_rubble_and_roll") {}
bool OnCheck(Player* player, Unit* target)
{
if (target)
if (InstanceScript* instance = target->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetData64(TYPE_KOLOGARN)))
return cr->AI()->GetData(DATA_KOLOGARN_RUBBLE_ACHIEV);
return false;
}
};
class achievement_kologarn_with_open_arms : public AchievementCriteriaScript
{
public:
achievement_kologarn_with_open_arms() : AchievementCriteriaScript("achievement_kologarn_with_open_arms") {}
bool OnCheck(Player* player, Unit* target)
{
if (target)
if (InstanceScript* instance = target->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetData64(TYPE_KOLOGARN)))
return cr->AI()->GetData(DATA_KOLOGARN_ARMS_ACHIEV);
return false;
}
};
void AddSC_boss_kologarn()
{
// Npcs
new boss_kologarn();
new boss_kologarn_arms();
new boss_kologarn_eyebeam();
// Spells
new spell_ulduar_stone_grip_cast_target();
new spell_ulduar_stone_grip();
new spell_ulduar_squeezed_lifeless();
new spell_kologarn_stone_shout();
// Achievements
new achievement_kologarn_looks_could_kill();
new achievement_kologarn_rubble_and_roll();
new achievement_kologarn_with_open_arms();
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,519 +0,0 @@
/*
REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
*/
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
#include "ulduar.h"
#include "SpellScript.h"
#include "SpellAuraEffects.h"
#include "Player.h"
#define BASE_CAMP 200
#define GROUNDS 201
#define FORGE 202
#define SCRAPYARD 203
#define ANTECHAMBER 204
#define WALKWAY 205
#define CONSERVATORY 206
#define MADNESS 207
#define SPARK 208
class go_ulduar_teleporter : public GameObjectScript
{
public:
go_ulduar_teleporter() : GameObjectScript("ulduar_teleporter") { }
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->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;
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;
}
};
class npc_ulduar_keeper : public CreatureScript
{
public:
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 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);
}
return true;
}
};
class spell_ulduar_energy_sap : public SpellScriptLoader
{
public:
spell_ulduar_energy_sap() : SpellScriptLoader("spell_ulduar_energy_sap") { }
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 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();
}
};
class npc_ulduar_snow_mound : public CreatureScript
{
public:
npc_ulduar_snow_mound() : CreatureScript("npc_ulduar_snow_mound") { }
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);
}
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 UpdateAI(uint32 diff) {}
};
};
class npc_ulduar_storm_tempered_keeper : public CreatureScript
{
public:
npc_ulduar_storm_tempered_keeper() : CreatureScript("npc_ulduar_storm_tempered_keeper") { }
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;
}
EventMap events;
uint64 otherGUID;
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 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 UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
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;
}
DoMeleeAttackIfReady();
}
};
};
class npc_ulduar_arachnopod_destroyer : public CreatureScript
{
public:
npc_ulduar_arachnopod_destroyer() : CreatureScript("npc_ulduar_arachnopod_destroyer") { }
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
}
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 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 AttackStart(Unit* who)
{
if (me->getFaction() == 16)
ScriptedAI::AttackStart(who);
}
void EnterEvadeMode()
{
if (me->getFaction() == 16)
ScriptedAI::EnterEvadeMode();
}
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;
events.Update(diff);
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;
}
DoMeleeAttackIfReady();
}
}
};
};
class spell_ulduar_arachnopod_damaged : public SpellScriptLoader
{
public:
spell_ulduar_arachnopod_damaged() : SpellScriptLoader("spell_ulduar_arachnopod_damaged") { }
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 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();
}
};
class AreaTrigger_at_celestial_planetarium_enterance : public AreaTriggerScript
{
public:
AreaTrigger_at_celestial_planetarium_enterance()
: AreaTriggerScript("at_celestial_planetarium_enterance")
{
}
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);
return false;
}
};
class go_call_tram : public GameObjectScript
{
public:
go_call_tram() : GameObjectScript("go_call_tram") { }
bool OnGossipHello(Player* /*pPlayer*/, GameObject* pGo)
{
InstanceScript* pInstance = pGo->GetInstanceScript();
if (!pInstance)
return false;
switch(pGo->GetEntry())
{
case 194914:
case 194438:
pInstance->SetData(DATA_CALL_TRAM, 0);
break;
case 194912:
case 194437:
pInstance->SetData(DATA_CALL_TRAM, 1);
break;
}
return true;
}
};
void AddSC_ulduar()
{
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 AreaTrigger_at_celestial_planetarium_enterance();
new go_call_tram();
}

View File

@@ -1,269 +0,0 @@
/*
REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
*/
#ifndef DEF_ULDUAR_H
#define DEF_ULDUAR_H
enum UlduarEncounters
{
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,
};
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,
// 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 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,
// 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,
// Achievements
DATA_DWARFAGEDDON = 700,
// 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,
// Razorscale
NPC_HARPOON_FIRE_STATE = 33282,
// 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,
// 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,
// 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,
};
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,
// 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,
// 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,
// 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,
// 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,
};
enum UlduarMisc
{
// 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,
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,
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,
KEEPER_FREYA = 0,
KEEPER_HODIR = 1,
KEEPER_MIMIRON = 2,
KEEPER_THORIM = 3,
// Achievement
SPELL_DWARFAGEDDON = 65387, // not exists in dbc
};
Position const AlgalonSummonPos = {1632.531f, -304.8516f, 450.1123f, 1.530165f};
Position const AlgalonLandPos = {1632.668f, -302.7656f, 417.3211f, 1.530165f};
#endif