Scripts/BlackRockSpire: Cleanup boss scripts. add instance script and header
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
* Copyright (C) 2008-2011 TrinityCore <http://www.trinitycore.org/>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef DEF_BLACKROCK_SPIRE_H
|
||||
#define DEF_BLACKROCK_SPIRE_H
|
||||
|
||||
uint32 const MAX_ENCOUNTER = 14;
|
||||
|
||||
enum Data
|
||||
{
|
||||
DATA_OMOKK,
|
||||
DATA_SHADOW_HUNTER_VOSHGAJIN,
|
||||
DATA_WARMASTER_VOONE,
|
||||
DATA_MOTHER_SMOLDERWEB,
|
||||
DATA_UROK_DOOMHOWL, // not scripted
|
||||
DATA_QUARTERMASTER_ZIGRIS,
|
||||
DATA_GIZRUL_THE_SLAVENER, // not scripted
|
||||
DATA_HALYCON ,
|
||||
DATA_OVERLORD_WYRMTHALAK,
|
||||
DATA_PYROGAURD_EMBERSEER,
|
||||
DATA_WARCHIEF_REND_BLACKHAND,
|
||||
DATA_GYTH,
|
||||
DATA_THE_BEAST,
|
||||
DATA_GENERAL_DRAKKISATH
|
||||
};
|
||||
|
||||
enum Npc
|
||||
{
|
||||
NPC_OMOKK = 9196,
|
||||
NPC_SHADOW_HUNTER_VOSHGAJIN = 9236,
|
||||
NPC_WARMASTER_VOONE = 9237,
|
||||
NPC_MOTHER_SMOLDERWEB = 10596,
|
||||
NPC_UROK_DOOMHOWL = 10584,
|
||||
NPC_QUARTERMASTER_ZIGRIS = 9736,
|
||||
NPC_GIZRUL_THE_SLAVENER = 10268,
|
||||
NPC_HALYCON = 10220,
|
||||
NPC_OVERLORD_WYRMTHALAK = 9568,
|
||||
NPC_PYROGAURD_EMBERSEER = 9816,
|
||||
NPC_WARCHIEF_REND_BLACKHAND = 10429,
|
||||
NPC_GYTH = 10339,
|
||||
NPC_THE_BEAST = 10430,
|
||||
NPC_GENERAL_DRAKKISATH = 10363,
|
||||
};
|
||||
|
||||
enum AchievementCriteriaIds
|
||||
{
|
||||
CRITERIA_LEEROY = 7622,
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -15,90 +15,92 @@
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "blackrock_spire.h"
|
||||
|
||||
/* ScriptData
|
||||
SDName: Boss_Drakkisath
|
||||
SD%Complete: 100
|
||||
SDComment:
|
||||
SDCategory: Blackrock Spire
|
||||
EndScriptData */
|
||||
enum Spells
|
||||
{
|
||||
SPELL_FIRENOVA = 23462,
|
||||
SPELL_CLEAVE = 20691,
|
||||
SPELL_CONFLIGURATION = 16805,
|
||||
SPELL_THUNDERCLAP = 15548, //Not sure if right ID. 23931 would be a harder possibility.
|
||||
};
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
|
||||
#define SPELL_FIRENOVA 23462
|
||||
#define SPELL_CLEAVE 20691
|
||||
#define SPELL_CONFLIGURATION 16805
|
||||
#define SPELL_THUNDERCLAP 15548 //Not sure if right ID. 23931 would be a harder possibility.
|
||||
enum Events
|
||||
{
|
||||
EVENT_FIRE_NOVA = 1,
|
||||
EVENT_CLEAVE = 2,
|
||||
EVENT_CONFLIGURATION = 3,
|
||||
EVENT_THUNDERCLAP = 4,
|
||||
};
|
||||
|
||||
class boss_drakkisath : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_drakkisath() : CreatureScript("boss_drakkisath") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_drakkisathAI (pCreature);
|
||||
return new boss_drakkisathAI(creature);
|
||||
}
|
||||
|
||||
struct boss_drakkisathAI : public ScriptedAI
|
||||
struct boss_drakkisathAI : public BossAI
|
||||
{
|
||||
boss_drakkisathAI(Creature *c) : ScriptedAI(c) {}
|
||||
|
||||
uint32 FireNova_Timer;
|
||||
uint32 Cleave_Timer;
|
||||
uint32 Confliguration_Timer;
|
||||
uint32 Thunderclap_Timer;
|
||||
boss_drakkisathAI(Creature* creature) : BossAI(creature, DATA_GENERAL_DRAKKISATH) {}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
FireNova_Timer = 6000;
|
||||
Cleave_Timer = 8000;
|
||||
Confliguration_Timer = 15000;
|
||||
Thunderclap_Timer = 17000;
|
||||
_Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_FIRE_NOVA, 6*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 8*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_CONFLIGURATION, 15*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_THUNDERCLAP, 17*IN_MILLISECONDS);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*who*/)
|
||||
{
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
//Return since we have no target
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//FireNova_Timer
|
||||
if (FireNova_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_FIRENOVA);
|
||||
FireNova_Timer = 10000;
|
||||
} else FireNova_Timer -= diff;
|
||||
events.Update(diff);
|
||||
|
||||
//Cleave_Timer
|
||||
if (Cleave_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_CLEAVE);
|
||||
Cleave_Timer = 8000;
|
||||
} else Cleave_Timer -= diff;
|
||||
if (me->HasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
//Confliguration_Timer
|
||||
if (Confliguration_Timer <= diff)
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_CONFLIGURATION);
|
||||
Confliguration_Timer = 18000;
|
||||
} else Confliguration_Timer -= diff;
|
||||
|
||||
//Thunderclap_Timer
|
||||
if (Thunderclap_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_THUNDERCLAP);
|
||||
Thunderclap_Timer = 20000;
|
||||
} else Thunderclap_Timer -= diff;
|
||||
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_FIRE_NOVA:
|
||||
DoCast(me->getVictim(), SPELL_FIRENOVA);
|
||||
events.ScheduleEvent(EVENT_FIRE_NOVA, 10*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_CLEAVE:
|
||||
DoCast(me->getVictim(), SPELL_CLEAVE);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 8*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_CONFLIGURATION:
|
||||
DoCast(me->getVictim(), SPELL_CONFLIGURATION);
|
||||
events.ScheduleEvent(EVENT_CONFLIGURATION, 18*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_THUNDERCLAP:
|
||||
DoCast(me->getVictim(), SPELL_THUNDERCLAP);
|
||||
events.ScheduleEvent(EVENT_THUNDERCLAP, 20*IN_MILLISECONDS);
|
||||
break;
|
||||
}
|
||||
}
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
void AddSC_boss_drakkisath()
|
||||
|
||||
@@ -16,190 +16,160 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Boss_Gyth
|
||||
SD%Complete: 100
|
||||
SDComment:
|
||||
SDCategory: Blackrock Spire
|
||||
EndScriptData */
|
||||
#include "blackrock_spire.h"
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
enum Spells
|
||||
{
|
||||
SPELL_CORROSIVE_ACID = 20667,
|
||||
SPELL_FREEZE = 18763,
|
||||
SPELL_FLAMEBREATH = 20712,
|
||||
SPELL_SELF_ROOT_FOREVER = 33356,
|
||||
};
|
||||
|
||||
#define SPELL_CORROSIVEACID 20667
|
||||
#define SPELL_FREEZE 18763
|
||||
#define SPELL_FLAMEBREATH 20712
|
||||
enum Adds
|
||||
{
|
||||
MODEL_REND_ON_DRAKE = 9723, // TODO: use creature_template 10459 instead of its modelid
|
||||
NPC_RAGE_TALON_FIRE_TONG = 10372,
|
||||
NPC_CHROMATIC_WHELP = 10442,
|
||||
NPC_CHROMATIC_DRAGONSPAWN = 10447,
|
||||
NPC_BLACKHAND_ELITE = 10317,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_SUMMON_REND = 1,
|
||||
EVENT_AGGRO = 2,
|
||||
EVENT_SUMMON_DRAGON_PACK = 3,
|
||||
EVENT_SUMMON_ORC_PACK = 4,
|
||||
EVENT_CORROSIVE_ACID = 5,
|
||||
EVENT_FREEZE = 6,
|
||||
EVENT_FLAME_BREATH = 7,
|
||||
};
|
||||
|
||||
class boss_gyth : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_gyth() : CreatureScript("boss_gyth") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
struct boss_gythAI : public BossAI
|
||||
{
|
||||
return new boss_gythAI (pCreature);
|
||||
}
|
||||
boss_gythAI(Creature* creature) : BossAI(creature, DATA_GYTH)
|
||||
{
|
||||
DoCast(me, SPELL_SELF_ROOT_FOREVER);
|
||||
}
|
||||
|
||||
struct boss_gythAI : public ScriptedAI
|
||||
{
|
||||
boss_gythAI(Creature *c) : ScriptedAI(c) {}
|
||||
|
||||
uint32 Aggro_Timer;
|
||||
uint32 Dragons_Timer;
|
||||
uint32 Orc_Timer;
|
||||
uint32 CorrosiveAcid_Timer;
|
||||
uint32 Freeze_Timer;
|
||||
uint32 Flamebreath_Timer;
|
||||
uint32 Line1Count;
|
||||
uint32 Line2Count;
|
||||
|
||||
bool Event;
|
||||
bool SummonedDragons;
|
||||
bool SummonedOrcs;
|
||||
bool SummonedRend;
|
||||
bool bAggro;
|
||||
bool RootSelf;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
Dragons_Timer = 3000;
|
||||
Orc_Timer = 60000;
|
||||
Aggro_Timer = 60000;
|
||||
CorrosiveAcid_Timer = 8000;
|
||||
Freeze_Timer = 11000;
|
||||
Flamebreath_Timer = 4000;
|
||||
Event = false;
|
||||
SummonedDragons = false;
|
||||
SummonedOrcs= false;
|
||||
_Reset();
|
||||
SummonedRend = false;
|
||||
bAggro = false;
|
||||
RootSelf = false;
|
||||
|
||||
// how many times should the two lines of summoned creatures be spawned
|
||||
// min 2 x 2, max 7 lines of attack in total
|
||||
Line1Count = rand() % 4 + 2;
|
||||
if (Line1Count < 5)
|
||||
Line2Count = rand() % (5 - Line1Count) + 2;
|
||||
else
|
||||
Line2Count = 2;
|
||||
|
||||
//Invisible for event start
|
||||
me->SetDisplayId(11686);
|
||||
me->SetVisible(false);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_SUMMON_DRAGON_PACK, 3*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_SUMMON_ORC_PACK, 60*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_AGGRO, 60*IN_MILLISECONDS);
|
||||
}
|
||||
|
||||
void SummonCreatureWithRandomTarget(uint32 creatureId)
|
||||
void JustDied(Unit* /*who*/)
|
||||
{
|
||||
Unit* Summoned = me->SummonCreature(creatureId, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 240000);
|
||||
if (Summoned)
|
||||
{
|
||||
Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0);
|
||||
if (pTarget)
|
||||
Summoned->AddThreat(pTarget, 1.0f);
|
||||
}
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
void SummonCreatureWithRandomTarget(uint32 creatureId, uint8 count)
|
||||
{
|
||||
//char buf[200];
|
||||
for (uint8 n = 0; n < count; n++)
|
||||
if (Unit * Summoned = me->SummonCreature(creatureId, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 240*IN_MILLISECONDS))
|
||||
if (Unit * target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
|
||||
Summoned->AddThreat(target, 250.0f);
|
||||
}
|
||||
|
||||
//Return since we have no target
|
||||
void UpdateAI(uint32 const diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (!RootSelf)
|
||||
if (!SummonedRend && HealthBelowPct(11))
|
||||
{
|
||||
//me->m_canMove = true;
|
||||
DoCast(me, 33356);
|
||||
RootSelf = true;
|
||||
events.ScheduleEvent(EVENT_SUMMON_REND, 8*IN_MILLISECONDS);
|
||||
SummonedRend = true;
|
||||
}
|
||||
|
||||
if (!bAggro && Line1Count == 0 && Line2Count == 0)
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
if (Aggro_Timer <= diff)
|
||||
switch (eventId)
|
||||
{
|
||||
bAggro = true;
|
||||
// Visible now!
|
||||
me->SetDisplayId(9723);
|
||||
me->setFaction(14);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
} else Aggro_Timer -= diff;
|
||||
}
|
||||
|
||||
// Summon Dragon pack. 2 Dragons and 3 Whelps
|
||||
if (!bAggro && !SummonedRend && Line1Count > 0)
|
||||
{
|
||||
if (Dragons_Timer <= diff)
|
||||
{
|
||||
SummonCreatureWithRandomTarget(10372);
|
||||
SummonCreatureWithRandomTarget(10372);
|
||||
SummonCreatureWithRandomTarget(10442);
|
||||
SummonCreatureWithRandomTarget(10442);
|
||||
SummonCreatureWithRandomTarget(10442);
|
||||
Line1Count = Line1Count - 1;
|
||||
Dragons_Timer = 60000;
|
||||
} else Dragons_Timer -= diff;
|
||||
}
|
||||
|
||||
//Summon Orc pack. 1 Orc Handler 1 Elite Dragonkin and 3 Whelps
|
||||
if (!bAggro && !SummonedRend && Line1Count == 0 && Line2Count > 0)
|
||||
{
|
||||
if (Orc_Timer <= diff)
|
||||
{
|
||||
SummonCreatureWithRandomTarget(10447);
|
||||
SummonCreatureWithRandomTarget(10317);
|
||||
SummonCreatureWithRandomTarget(10442);
|
||||
SummonCreatureWithRandomTarget(10442);
|
||||
SummonCreatureWithRandomTarget(10442);
|
||||
Line2Count = Line2Count - 1;
|
||||
Orc_Timer = 60000;
|
||||
} else Orc_Timer -= diff;
|
||||
}
|
||||
|
||||
// we take part in the fight
|
||||
if (bAggro)
|
||||
{
|
||||
// CorrosiveAcid_Timer
|
||||
if (CorrosiveAcid_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_CORROSIVEACID);
|
||||
CorrosiveAcid_Timer = 7000;
|
||||
} else CorrosiveAcid_Timer -= diff;
|
||||
|
||||
// Freeze_Timer
|
||||
if (Freeze_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_FREEZE);
|
||||
Freeze_Timer = 16000;
|
||||
} else Freeze_Timer -= diff;
|
||||
|
||||
// Flamebreath_Timer
|
||||
if (Flamebreath_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_FLAMEBREATH);
|
||||
Flamebreath_Timer = 10500;
|
||||
} else Flamebreath_Timer -= diff;
|
||||
|
||||
//Summon Rend
|
||||
if (!SummonedRend && HealthBelowPct(11) && me->GetHealth() > 0)
|
||||
{
|
||||
//summon Rend and Change model to normal Gyth
|
||||
//Interrupt any spell casting
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
//Gyth model
|
||||
me->SetDisplayId(9806);
|
||||
me->SummonCreature(10429, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 900000);
|
||||
SummonedRend = true;
|
||||
case EVENT_SUMMON_REND:
|
||||
// Summon Rend and Change model to normal Gyth
|
||||
// Interrupt any spell casting
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
// Gyth model
|
||||
me->SetDisplayId(me->GetCreatureInfo()->Modelid1);
|
||||
me->SummonCreature(NPC_WARCHIEF_REND_BLACKHAND, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 900*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_CORROSIVE_ACID, 8*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_FREEZE, 11*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_FLAME_BREATH, 4*IN_MILLISECONDS);
|
||||
events.CancelEvent(EVENT_SUMMON_REND);
|
||||
break;
|
||||
case EVENT_AGGRO:
|
||||
me->SetVisible(true);
|
||||
me->SetDisplayId(MODEL_REND_ON_DRAKE);
|
||||
me->setFaction(14);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
events.CancelEvent(EVENT_AGGRO);
|
||||
break;
|
||||
// Summon Dragon pack. 2 Dragons and 3 Whelps
|
||||
case EVENT_SUMMON_DRAGON_PACK:
|
||||
for (uint8 i = 0; i < urand(0, 3) + 2; ++i)
|
||||
{
|
||||
SummonCreatureWithRandomTarget(NPC_RAGE_TALON_FIRE_TONG, 2);
|
||||
SummonCreatureWithRandomTarget(NPC_CHROMATIC_WHELP, 3);
|
||||
}
|
||||
events.CancelEvent(EVENT_SUMMON_DRAGON_PACK);
|
||||
break;
|
||||
// Summon Orc pack. 1 Orc Handler 1 Elite Dragonkin and 3 Whelps
|
||||
case EVENT_SUMMON_ORC_PACK:
|
||||
for (uint8 i = 0; i < urand (0, 5) + 2; ++i)
|
||||
{
|
||||
SummonCreatureWithRandomTarget(NPC_CHROMATIC_DRAGONSPAWN, 1);
|
||||
SummonCreatureWithRandomTarget(NPC_BLACKHAND_ELITE, 1);
|
||||
SummonCreatureWithRandomTarget(NPC_CHROMATIC_WHELP, 3);
|
||||
}
|
||||
events.CancelEvent(EVENT_SUMMON_ORC_PACK);
|
||||
break;
|
||||
case EVENT_CORROSIVE_ACID:
|
||||
DoCast(me->getVictim(), SPELL_CORROSIVE_ACID);
|
||||
events.ScheduleEvent(EVENT_CORROSIVE_ACID, 7*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_FREEZE:
|
||||
DoCast(me->getVictim(), SPELL_FREEZE);
|
||||
events.ScheduleEvent(EVENT_FREEZE, 16*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_FLAME_BREATH:
|
||||
DoCast(me->getVictim(), SPELL_FLAMEBREATH);
|
||||
events.ScheduleEvent(EVENT_FLAME_BREATH, 10500);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
} // end if Aggro
|
||||
}
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_gythAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_gyth()
|
||||
|
||||
@@ -16,79 +16,87 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Boss_Halycon
|
||||
SD%Complete: 100
|
||||
SDComment:
|
||||
SDCategory: Blackrock Spire
|
||||
EndScriptData */
|
||||
#include "blackrock_spire.h"
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
enum Spells
|
||||
{
|
||||
SPELL_CROWDPUMMEL = 10887,
|
||||
SPELL_MIGHTYBLOW = 14099,
|
||||
};
|
||||
|
||||
#define SPELL_CROWDPUMMEL 10887
|
||||
#define SPELL_MIGHTYBLOW 14099
|
||||
enum Events
|
||||
{
|
||||
EVENT_CROWD_PUMMEL = 1,
|
||||
EVENT_MIGHTY_BLOW = 2,
|
||||
};
|
||||
|
||||
#define ADD_1X -169.839203f
|
||||
#define ADD_1Y -324.961395f
|
||||
#define ADD_1Z 64.401443f
|
||||
#define ADD_1O 3.124724f
|
||||
const Position SummonLocation = { -169.839f, -324.961f, 64.401f, 3.124f };
|
||||
|
||||
class boss_halycon : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_halycon() : CreatureScript("boss_halycon") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_halyconAI (pCreature);
|
||||
return new boss_halyconAI(creature);
|
||||
}
|
||||
|
||||
struct boss_halyconAI : public ScriptedAI
|
||||
struct boss_halyconAI : public BossAI
|
||||
{
|
||||
boss_halyconAI(Creature *c) : ScriptedAI(c) {}
|
||||
boss_halyconAI(Creature* creature) : BossAI(creature, DATA_HALYCON) {}
|
||||
|
||||
uint32 CrowdPummel_Timer;
|
||||
uint32 MightyBlow_Timer;
|
||||
bool Summoned;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
CrowdPummel_Timer = 8000;
|
||||
MightyBlow_Timer = 14000;
|
||||
_Reset();
|
||||
Summoned = false;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_CROWD_PUMMEL, 8*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_MIGHTY_BLOW, 14*IN_MILLISECONDS);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
void JustDied(Unit* /*who*/)
|
||||
{
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 const diff)
|
||||
{
|
||||
//Return since we have no target
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//CrowdPummel_Timer
|
||||
if (CrowdPummel_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_CROWDPUMMEL);
|
||||
CrowdPummel_Timer = 14000;
|
||||
} else CrowdPummel_Timer -= diff;
|
||||
|
||||
//MightyBlow_Timer
|
||||
if (MightyBlow_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_MIGHTYBLOW);
|
||||
MightyBlow_Timer = 10000;
|
||||
} else MightyBlow_Timer -= diff;
|
||||
|
||||
//Summon Gizrul
|
||||
if (!Summoned && HealthBelowPct(25))
|
||||
{
|
||||
me->SummonCreature(10268,ADD_1X,ADD_1Y,ADD_1Z,ADD_1O,TEMPSUMMON_TIMED_DESPAWN,300000);
|
||||
me->SummonCreature(NPC_GIZRUL_THE_SLAVENER, SummonLocation, TEMPSUMMON_TIMED_DESPAWN, 300*IN_MILLISECONDS);
|
||||
Summoned = true;
|
||||
}
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_CROWD_PUMMEL:
|
||||
DoCast(me->getVictim(), SPELL_CROWDPUMMEL);
|
||||
events.ScheduleEvent(EVENT_CROWD_PUMMEL, 14*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_MIGHTY_BLOW:
|
||||
DoCast(me->getVictim(), SPELL_MIGHTYBLOW);
|
||||
events.ScheduleEvent(EVENT_MIGHTY_BLOW, 10*IN_MILLISECONDS);
|
||||
break;
|
||||
}
|
||||
}
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -16,115 +16,110 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Boss_Highlord_Omokk
|
||||
SD%Complete: 100
|
||||
SDComment:
|
||||
SDCategory: Blackrock Spire
|
||||
EndScriptData */
|
||||
#include "blackrock_spire.h"
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
enum Spells
|
||||
{
|
||||
SPELL_WARSTOMP = 24375,
|
||||
SPELL_CLEAVE = 15579,
|
||||
SPELL_STRIKE = 18368,
|
||||
SPELL_REND = 18106,
|
||||
SPELL_SUNDERARMOR = 24317,
|
||||
SPELL_KNOCKAWAY = 20686,
|
||||
SPELL_SLOW = 22356,
|
||||
};
|
||||
|
||||
#define SPELL_WARSTOMP 24375
|
||||
#define SPELL_CLEAVE 15579
|
||||
#define SPELL_STRIKE 18368
|
||||
#define SPELL_REND 18106
|
||||
#define SPELL_SUNDERARMOR 24317
|
||||
#define SPELL_KNOCKAWAY 20686
|
||||
#define SPELL_SLOW 22356
|
||||
enum Events
|
||||
{
|
||||
EVENT_WARSTOMP = 1,
|
||||
EVENT_CLEAVE = 2,
|
||||
EVENT_STRIKE = 3,
|
||||
EVENT_REND = 4,
|
||||
EVENT_SUNDER_ARMOR = 5,
|
||||
EVENT_KNOCK_AWAY = 6,
|
||||
EVENT_SLOW = 7,
|
||||
};
|
||||
|
||||
class boss_highlord_omokk : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_highlord_omokk() : CreatureScript("boss_highlord_omokk") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_highlordomokkAI (pCreature);
|
||||
return new boss_highlordomokkAI(creature);
|
||||
}
|
||||
|
||||
struct boss_highlordomokkAI : public ScriptedAI
|
||||
struct boss_highlordomokkAI : public BossAI
|
||||
{
|
||||
boss_highlordomokkAI(Creature *c) : ScriptedAI(c) {}
|
||||
|
||||
uint32 WarStomp_Timer;
|
||||
uint32 Cleave_Timer;
|
||||
uint32 Strike_Timer;
|
||||
uint32 Rend_Timer;
|
||||
uint32 SunderArmor_Timer;
|
||||
uint32 KnockAway_Timer;
|
||||
uint32 Slow_Timer;
|
||||
boss_highlordomokkAI(Creature* creature) : BossAI(creature, DATA_OMOKK) {}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
WarStomp_Timer = 15000;
|
||||
Cleave_Timer = 6000;
|
||||
Strike_Timer = 10000;
|
||||
Rend_Timer = 14000;
|
||||
SunderArmor_Timer = 2000;
|
||||
KnockAway_Timer = 18000;
|
||||
Slow_Timer = 24000;
|
||||
_Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_WARSTOMP, 15*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 6*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_STRIKE, 10*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_REND, 14*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_SUNDER_ARMOR, 2*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_KNOCK_AWAY, 18*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_SLOW, 24*IN_MILLISECONDS);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
void JustDied(Unit* /*who*/)
|
||||
{
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 const diff)
|
||||
{
|
||||
//Return since we have no target
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//WarStomp_Timer
|
||||
if (WarStomp_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_WARSTOMP);
|
||||
WarStomp_Timer = 14000;
|
||||
} else WarStomp_Timer -= diff;
|
||||
events.Update(diff);
|
||||
|
||||
//Cleave_Timer
|
||||
if (Cleave_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_CLEAVE);
|
||||
Cleave_Timer = 8000;
|
||||
} else Cleave_Timer -= diff;
|
||||
if (me->HasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
//Strike_Timer
|
||||
if (Strike_Timer <= diff)
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_STRIKE);
|
||||
Strike_Timer = 10000;
|
||||
} else Strike_Timer -= diff;
|
||||
|
||||
//Rend_Timer
|
||||
if (Rend_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_REND);
|
||||
Rend_Timer = 18000;
|
||||
} else Rend_Timer -= diff;
|
||||
|
||||
//SunderArmor_Timer
|
||||
if (SunderArmor_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_SUNDERARMOR);
|
||||
SunderArmor_Timer = 25000;
|
||||
} else SunderArmor_Timer -= diff;
|
||||
|
||||
//KnockAway_Timer
|
||||
if (KnockAway_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_KNOCKAWAY);
|
||||
KnockAway_Timer = 12000;
|
||||
} else KnockAway_Timer -= diff;
|
||||
|
||||
//Slow_Timer
|
||||
if (Slow_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_SLOW);
|
||||
Slow_Timer = 18000;
|
||||
} else Slow_Timer -= diff;
|
||||
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_WARSTOMP:
|
||||
DoCast(me->getVictim(), SPELL_WARSTOMP);
|
||||
events.ScheduleEvent(EVENT_WARSTOMP, 14*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_CLEAVE:
|
||||
DoCast(me->getVictim(), SPELL_CLEAVE);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 8*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_STRIKE:
|
||||
DoCast(me->getVictim(), SPELL_STRIKE);
|
||||
events.ScheduleEvent(EVENT_STRIKE, 10*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_REND:
|
||||
DoCast(me->getVictim(), SPELL_REND);
|
||||
events.ScheduleEvent(EVENT_REND, 18*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_SUNDER_ARMOR:
|
||||
DoCast(me->getVictim(), SPELL_SUNDERARMOR);
|
||||
events.ScheduleEvent(EVENT_SUNDER_ARMOR, 25*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_KNOCK_AWAY:
|
||||
DoCast(me->getVictim(), SPELL_KNOCKAWAY);
|
||||
events.ScheduleEvent(EVENT_KNOCK_AWAY, 12*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_SLOW:
|
||||
DoCast(me->getVictim(), SPELL_SLOW);
|
||||
events.ScheduleEvent(EVENT_SLOW, 18*IN_MILLISECONDS);
|
||||
break;
|
||||
}
|
||||
}
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -16,70 +16,82 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Boss_Mother_Smolderweb
|
||||
SD%Complete: 100
|
||||
SDComment: Uncertain how often mother's milk is casted
|
||||
SDCategory: Blackrock Spire
|
||||
EndScriptData */
|
||||
#include "blackrock_spire.h"
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
enum Spells
|
||||
{
|
||||
SPELL_CRYSTALIZE = 16104,
|
||||
SPELL_MOTHERSMILK = 16468,
|
||||
SPELL_SUMMON_SPIRE_SPIDERLING = 16103,
|
||||
};
|
||||
|
||||
#define SPELL_CRYSTALIZE 16104
|
||||
#define SPELL_MOTHERSMILK 16468
|
||||
#define SPELL_SUMMON_SPIRE_SPIDERLING 16103
|
||||
enum Events
|
||||
{
|
||||
EVENT_CRYSTALIZE = 1,
|
||||
EVENT_MOTHERS_MILK = 2,
|
||||
};
|
||||
|
||||
class boss_mother_smolderweb : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_mother_smolderweb() : CreatureScript("boss_mother_smolderweb") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_mothersmolderwebAI (pCreature);
|
||||
return new boss_mothersmolderwebAI(creature);
|
||||
}
|
||||
|
||||
struct boss_mothersmolderwebAI : public ScriptedAI
|
||||
struct boss_mothersmolderwebAI : public BossAI
|
||||
{
|
||||
boss_mothersmolderwebAI(Creature *c) : ScriptedAI(c) {}
|
||||
|
||||
uint32 Crystalize_Timer;
|
||||
uint32 MothersMilk_Timer;
|
||||
boss_mothersmolderwebAI(Creature* creature) : BossAI(creature, DATA_MOTHER_SMOLDERWEB) {}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
Crystalize_Timer = 20000;
|
||||
MothersMilk_Timer = 10000;
|
||||
_Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/) {}
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_CRYSTALIZE, 20*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_MOTHERS_MILK, 10*IN_MILLISECONDS);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit * /*done_by*/, uint32 &damage)
|
||||
void JustDied(Unit* /*who*/)
|
||||
{
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*done_by*/, uint32 &damage)
|
||||
{
|
||||
if (me->GetHealth() <= damage)
|
||||
DoCast(me, SPELL_SUMMON_SPIRE_SPIDERLING, true);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
void UpdateAI(uint32 const diff)
|
||||
{
|
||||
//Return since we have no target
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//Crystalize_Timer
|
||||
if (Crystalize_Timer <= diff)
|
||||
{
|
||||
DoCast(me, SPELL_CRYSTALIZE);
|
||||
Crystalize_Timer = 15000;
|
||||
} else Crystalize_Timer -= diff;
|
||||
events.Update(diff);
|
||||
|
||||
//MothersMilk_Timer
|
||||
if (MothersMilk_Timer <= diff)
|
||||
{
|
||||
DoCast(me, SPELL_MOTHERSMILK);
|
||||
MothersMilk_Timer = urand(5000,12500);
|
||||
} else MothersMilk_Timer -= diff;
|
||||
if (me->HasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_CRYSTALIZE:
|
||||
DoCast(me, SPELL_CRYSTALIZE);
|
||||
events.ScheduleEvent(EVENT_CRYSTALIZE, 15*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_MOTHERS_MILK:
|
||||
DoCast(me, SPELL_MOTHERSMILK);
|
||||
events.ScheduleEvent(EVENT_MOTHERS_MILK, urand(5*IN_MILLISECONDS,12500));
|
||||
break;
|
||||
}
|
||||
}
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -16,113 +16,117 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Boss_Overlord_Wyrmthalak
|
||||
SD%Complete: 100
|
||||
SDComment:
|
||||
SDCategory: Blackrock Spire
|
||||
EndScriptData */
|
||||
#include "blackrock_spire.h"
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
enum Spells
|
||||
{
|
||||
SPELL_BLASTWAVE = 11130,
|
||||
SPELL_SHOUT = 23511,
|
||||
SPELL_CLEAVE = 20691,
|
||||
SPELL_KNOCKAWAY = 20686,
|
||||
};
|
||||
|
||||
#define SPELL_BLASTWAVE 11130
|
||||
#define SPELL_SHOUT 23511
|
||||
#define SPELL_CLEAVE 20691
|
||||
#define SPELL_KNOCKAWAY 20686
|
||||
enum Events
|
||||
{
|
||||
EVENT_BLAST_WAVE = 1,
|
||||
EVENT_SHOUT = 2,
|
||||
EVENT_CLEAVE = 3,
|
||||
EVENT_KNOCK_AWAY = 4,
|
||||
};
|
||||
|
||||
#define ADD_1X -39.355381f
|
||||
#define ADD_1Y -513.456482f
|
||||
#define ADD_1Z 88.472046f
|
||||
#define ADD_1O 4.679872f
|
||||
enum Adds
|
||||
{
|
||||
NPC_SPIRESTONE_WARLORD = 9216,
|
||||
NPC_SMOLDERTHORN_BERSERKER = 9268,
|
||||
|
||||
#define ADD_2X -49.875881f
|
||||
#define ADD_2Y -511.896942f
|
||||
#define ADD_2Z 88.195160f
|
||||
#define ADD_2O 4.613114f
|
||||
};
|
||||
|
||||
const Position SummonLocation1 = { -39.355f, -513.456f, 88.472f, 4.679f };
|
||||
const Position SummonLocation2 = { -49.875f, -511.896f, 88.195f, 4.613f };
|
||||
|
||||
class boss_overlord_wyrmthalak : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_overlord_wyrmthalak() : CreatureScript("boss_overlord_wyrmthalak") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_overlordwyrmthalakAI (pCreature);
|
||||
return new boss_overlordwyrmthalakAI(creature);
|
||||
}
|
||||
|
||||
struct boss_overlordwyrmthalakAI : public ScriptedAI
|
||||
struct boss_overlordwyrmthalakAI : public BossAI
|
||||
{
|
||||
boss_overlordwyrmthalakAI(Creature *c) : ScriptedAI(c) {}
|
||||
boss_overlordwyrmthalakAI(Creature* creature) : BossAI(creature, DATA_OVERLORD_WYRMTHALAK) {}
|
||||
|
||||
uint32 BlastWave_Timer;
|
||||
uint32 Shout_Timer;
|
||||
uint32 Cleave_Timer;
|
||||
uint32 Knockaway_Timer;
|
||||
bool Summoned;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BlastWave_Timer = 20000;
|
||||
Shout_Timer = 2000;
|
||||
Cleave_Timer = 6000;
|
||||
Knockaway_Timer = 12000;
|
||||
_Reset();
|
||||
Summoned = false;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_BLAST_WAVE, 20*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_SHOUT, 2*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 6*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_KNOCK_AWAY, 12*IN_MILLISECONDS);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
void JustDied(Unit* /*who*/)
|
||||
{
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 const diff)
|
||||
{
|
||||
//Return since we have no target
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//BlastWave_Timer
|
||||
if (BlastWave_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_BLASTWAVE);
|
||||
BlastWave_Timer = 20000;
|
||||
} else BlastWave_Timer -= diff;
|
||||
|
||||
//Shout_Timer
|
||||
if (Shout_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_SHOUT);
|
||||
Shout_Timer = 10000;
|
||||
} else Shout_Timer -= diff;
|
||||
|
||||
//Cleave_Timer
|
||||
if (Cleave_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_CLEAVE);
|
||||
Cleave_Timer = 7000;
|
||||
} else Cleave_Timer -= diff;
|
||||
|
||||
//Knockaway_Timer
|
||||
if (Knockaway_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_KNOCKAWAY);
|
||||
Knockaway_Timer = 14000;
|
||||
} else Knockaway_Timer -= diff;
|
||||
|
||||
//Summon two Beserks
|
||||
if (!Summoned && HealthBelowPct(51))
|
||||
{
|
||||
Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM,0, 100, true);
|
||||
|
||||
if (Creature *SummonedCreature = me->SummonCreature(9216,ADD_1X,ADD_1Y,ADD_1Z,ADD_1O,TEMPSUMMON_TIMED_DESPAWN,300000))
|
||||
SummonedCreature->AI()->AttackStart(pTarget);
|
||||
if (Creature *SummonedCreature = me->SummonCreature(9268,ADD_2X,ADD_2Y,ADD_2Z,ADD_2O,TEMPSUMMON_TIMED_DESPAWN,300000))
|
||||
SummonedCreature->AI()->AttackStart(pTarget);
|
||||
Summoned = true;
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM,0, 100, true))
|
||||
{
|
||||
if (Creature* warlord = me->SummonCreature(NPC_SPIRESTONE_WARLORD, SummonLocation1, TEMPSUMMON_TIMED_DESPAWN,300*IN_MILLISECONDS))
|
||||
warlord->AI()->AttackStart(target);
|
||||
if (Creature* berserker = me->SummonCreature(NPC_SMOLDERTHORN_BERSERKER, SummonLocation2, TEMPSUMMON_TIMED_DESPAWN,300*IN_MILLISECONDS))
|
||||
berserker->AI()->AttackStart(target);
|
||||
Summoned = true;
|
||||
}
|
||||
}
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_BLAST_WAVE:
|
||||
DoCast(me->getVictim(), SPELL_BLASTWAVE);
|
||||
events.ScheduleEvent(EVENT_BLAST_WAVE, 20*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_SHOUT:
|
||||
DoCast(me->getVictim(), SPELL_SHOUT);
|
||||
events.ScheduleEvent(EVENT_SHOUT, 10*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_CLEAVE:
|
||||
DoCast(me->getVictim(), SPELL_CLEAVE);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 7*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_KNOCK_AWAY:
|
||||
DoCast(me->getVictim(), SPELL_KNOCKAWAY);
|
||||
events.ScheduleEvent(EVENT_KNOCK_AWAY, 14*IN_MILLISECONDS);
|
||||
break;
|
||||
}
|
||||
}
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
void AddSC_boss_overlordwyrmthalak()
|
||||
|
||||
@@ -16,80 +16,87 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Boss_Pyroguard_Emberseer
|
||||
SD%Complete: 100
|
||||
SDComment: Event to activate Emberseer NYI
|
||||
SDCategory: Blackrock Spire
|
||||
EndScriptData */
|
||||
#include "blackrock_spire.h"
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
enum Spells
|
||||
{
|
||||
SPELL_FIRENOVA = 23462,
|
||||
SPELL_FLAMEBUFFET = 23341,
|
||||
SPELL_PYROBLAST = 17274,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_FIRENOVA = 1,
|
||||
EVENT_FLAMEBUFFET = 2,
|
||||
EVENT_PYROBLAST = 3,
|
||||
};
|
||||
|
||||
#define SPELL_FIRENOVA 23462
|
||||
#define SPELL_FLAMEBUFFET 23341
|
||||
#define SPELL_PYROBLAST 17274
|
||||
|
||||
class boss_pyroguard_emberseer : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_pyroguard_emberseer() : CreatureScript("boss_pyroguard_emberseer") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_pyroguard_emberseerAI (pCreature);
|
||||
return new boss_pyroguard_emberseerAI(creature);
|
||||
}
|
||||
|
||||
struct boss_pyroguard_emberseerAI : public ScriptedAI
|
||||
struct boss_pyroguard_emberseerAI : public BossAI
|
||||
{
|
||||
boss_pyroguard_emberseerAI(Creature *c) : ScriptedAI(c) {}
|
||||
|
||||
uint32 FireNova_Timer;
|
||||
uint32 FlameBuffet_Timer;
|
||||
uint32 PyroBlast_Timer;
|
||||
boss_pyroguard_emberseerAI(Creature* creature) : BossAI(creature, DATA_PYROGAURD_EMBERSEER) {}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
FireNova_Timer = 6000;
|
||||
FlameBuffet_Timer = 3000;
|
||||
PyroBlast_Timer = 14000;
|
||||
_Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_FIRENOVA, 6*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_FLAMEBUFFET, 3*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_PYROBLAST, 14*IN_MILLISECONDS);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
void JustDied(Unit* /*who*/)
|
||||
{
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 const diff)
|
||||
{
|
||||
//Return since we have no target
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//FireNova_Timer
|
||||
if (FireNova_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_FIRENOVA);
|
||||
FireNova_Timer = 6000;
|
||||
} else FireNova_Timer -= diff;
|
||||
events.Update(diff);
|
||||
|
||||
//FlameBuffet_Timer
|
||||
if (FlameBuffet_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_FLAMEBUFFET);
|
||||
FlameBuffet_Timer = 14000;
|
||||
} else FlameBuffet_Timer -= diff;
|
||||
if (me->HasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
//PyroBlast_Timer
|
||||
if (PyroBlast_Timer <= diff)
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
|
||||
DoCast(pTarget, SPELL_PYROBLAST);
|
||||
PyroBlast_Timer = 15000;
|
||||
} else PyroBlast_Timer -= diff;
|
||||
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_FIRENOVA:
|
||||
DoCast(me->getVictim(), SPELL_FIRENOVA);
|
||||
events.ScheduleEvent(EVENT_FIRENOVA, 6*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_FLAMEBUFFET:
|
||||
DoCast(me->getVictim(), SPELL_FLAMEBUFFET);
|
||||
events.ScheduleEvent(EVENT_FLAMEBUFFET, 14*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_PYROBLAST:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
|
||||
DoCast(target, SPELL_PYROBLAST);
|
||||
events.ScheduleEvent(EVENT_PYROBLAST, 15*IN_MILLISECONDS);
|
||||
break;
|
||||
}
|
||||
}
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
void AddSC_boss_pyroguard_emberseer()
|
||||
|
||||
@@ -16,73 +16,80 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Boss_Quartmaster_Zigris
|
||||
SD%Complete: 100
|
||||
SDComment: Needs revision
|
||||
SDCategory: Blackrock Spire
|
||||
EndScriptData */
|
||||
#include "blackrock_spire.h"
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
enum Spells
|
||||
{
|
||||
SPELL_SHOOT = 16496,
|
||||
SPELL_STUNBOMB = 16497,
|
||||
SPELL_HEALING_POTION = 15504,
|
||||
SPELL_HOOKEDNET = 15609,
|
||||
};
|
||||
|
||||
#define SPELL_SHOOT 16496
|
||||
#define SPELL_STUNBOMB 16497
|
||||
#define SPELL_HEALING_POTION 15504
|
||||
#define SPELL_HOOKEDNET 15609
|
||||
enum Events
|
||||
{
|
||||
EVENT_SHOOT = 1,
|
||||
EVENT_STUN_BOMB = 2,
|
||||
};
|
||||
|
||||
class quartermaster_zigris : public CreatureScript
|
||||
{
|
||||
public:
|
||||
quartermaster_zigris() : CreatureScript("quartermaster_zigris") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_quatermasterzigrisAI (pCreature);
|
||||
return new boss_quatermasterzigrisAI(creature);
|
||||
}
|
||||
|
||||
struct boss_quatermasterzigrisAI : public ScriptedAI
|
||||
struct boss_quatermasterzigrisAI : public BossAI
|
||||
{
|
||||
boss_quatermasterzigrisAI(Creature *c) : ScriptedAI(c) {}
|
||||
|
||||
uint32 Shoot_Timer;
|
||||
uint32 StunBomb_Timer;
|
||||
//uint32 HelingPotion_Timer;
|
||||
boss_quatermasterzigrisAI(Creature* creature) : BossAI(creature, DATA_QUARTERMASTER_ZIGRIS) {}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
Shoot_Timer = 1000;
|
||||
StunBomb_Timer = 16000;
|
||||
//HelingPotion_Timer = 25000;
|
||||
_Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_SHOOT, 1*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_STUN_BOMB, 16*IN_MILLISECONDS);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
void JustDied(Unit* /*who*/)
|
||||
{
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 const diff)
|
||||
{
|
||||
//Return since we have no target
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//Shoot_Timer
|
||||
if (Shoot_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_SHOOT);
|
||||
Shoot_Timer = 500;
|
||||
} else Shoot_Timer -= diff;
|
||||
events.Update(diff);
|
||||
|
||||
//StunBomb_Timer
|
||||
if (StunBomb_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_STUNBOMB);
|
||||
StunBomb_Timer = 14000;
|
||||
} else StunBomb_Timer -= diff;
|
||||
if (me->HasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_SHOOT:
|
||||
DoCast(me->getVictim(), SPELL_SHOOT);
|
||||
events.ScheduleEvent(EVENT_SHOOT, 500);
|
||||
break;
|
||||
case EVENT_STUN_BOMB:
|
||||
DoCast(me->getVictim(), SPELL_STUNBOMB);
|
||||
events.ScheduleEvent(EVENT_STUN_BOMB, 14*IN_MILLISECONDS);
|
||||
break;
|
||||
}
|
||||
}
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
void AddSC_boss_quatermasterzigris()
|
||||
|
||||
@@ -16,79 +16,85 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Boss_Rend_Blackhand
|
||||
SD%Complete: 100
|
||||
SDComment: Intro event NYI
|
||||
SDCategory: Blackrock Spire
|
||||
EndScriptData */
|
||||
#include "blackrock_spire.h"
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
enum Spells
|
||||
{
|
||||
SPELL_WHIRLWIND = 26038,
|
||||
SPELL_CLEAVE = 20691,
|
||||
SPELL_THUNDERCLAP = 23931, //Not sure if he cast this spell
|
||||
};
|
||||
|
||||
#define SPELL_WHIRLWIND 26038
|
||||
#define SPELL_CLEAVE 20691
|
||||
#define SPELL_THUNDERCLAP 23931 //Not sure if he cast this spell
|
||||
enum Events
|
||||
{
|
||||
EVENT_WHIRLWIND = 1,
|
||||
EVENT_CLEAVE = 2,
|
||||
EVENT_THUNDERCLAP = 3,
|
||||
};
|
||||
|
||||
class boss_rend_blackhand : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_rend_blackhand() : CreatureScript("boss_rend_blackhand") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_rend_blackhandAI (pCreature);
|
||||
return new boss_rend_blackhandAI(creature);
|
||||
}
|
||||
|
||||
struct boss_rend_blackhandAI : public ScriptedAI
|
||||
struct boss_rend_blackhandAI : public BossAI
|
||||
{
|
||||
boss_rend_blackhandAI(Creature *c) : ScriptedAI(c) {}
|
||||
|
||||
uint32 WhirlWind_Timer;
|
||||
uint32 Cleave_Timer;
|
||||
uint32 Thunderclap_Timer;
|
||||
boss_rend_blackhandAI(Creature* creature) : BossAI(creature, DATA_WARCHIEF_REND_BLACKHAND) {}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
WhirlWind_Timer = 20000;
|
||||
Cleave_Timer = 5000;
|
||||
Thunderclap_Timer = 9000;
|
||||
_Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_WHIRLWIND, 20*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 5*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_THUNDERCLAP, 9*IN_MILLISECONDS);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
void JustDied(Unit* /*who*/)
|
||||
{
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 const diff)
|
||||
{
|
||||
//Return since we have no target
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//WhirlWind_Timer
|
||||
if (WhirlWind_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_WHIRLWIND);
|
||||
WhirlWind_Timer = 18000;
|
||||
} else WhirlWind_Timer -= diff;
|
||||
events.Update(diff);
|
||||
|
||||
//Cleave_Timer
|
||||
if (Cleave_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_CLEAVE);
|
||||
Cleave_Timer = 10000;
|
||||
} else Cleave_Timer -= diff;
|
||||
if (me->HasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
//Thunderclap_Timer
|
||||
if (Thunderclap_Timer <= diff)
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_THUNDERCLAP);
|
||||
Thunderclap_Timer = 16000;
|
||||
} else Thunderclap_Timer -= diff;
|
||||
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_WHIRLWIND:
|
||||
DoCast(me->getVictim(), SPELL_WHIRLWIND);
|
||||
events.ScheduleEvent(EVENT_WHIRLWIND, 18*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_CLEAVE:
|
||||
DoCast(me->getVictim(), SPELL_CLEAVE);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 10*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_THUNDERCLAP:
|
||||
DoCast(me->getVictim(), SPELL_THUNDERCLAP);
|
||||
events.ScheduleEvent(EVENT_THUNDERCLAP, 16*IN_MILLISECONDS);
|
||||
break;
|
||||
}
|
||||
}
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
void AddSC_boss_rend_blackhand()
|
||||
|
||||
+53
-45
@@ -16,76 +16,84 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Boss_Shadow_Hunter_Voshgajin
|
||||
SD%Complete: 100
|
||||
SDComment:
|
||||
SDCategory: Blackrock Spire
|
||||
EndScriptData */
|
||||
#include "blackrock_spire.h"
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
enum Spells
|
||||
{
|
||||
SPELL_CURSEOFBLOOD = 24673,
|
||||
SPELL_HEX = 16708,
|
||||
SPELL_CLEAVE = 20691,
|
||||
};
|
||||
|
||||
#define SPELL_CURSEOFBLOOD 24673
|
||||
#define SPELL_HEX 16708
|
||||
#define SPELL_CLEAVE 20691
|
||||
enum Events
|
||||
{
|
||||
EVENT_CURSE_OF_BLOOD = 1,
|
||||
EVENT_HEX = 2,
|
||||
EVENT_CLEAVE = 3,
|
||||
};
|
||||
|
||||
class boss_shadow_hunter_voshgajin : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_shadow_hunter_voshgajin() : CreatureScript("boss_shadow_hunter_voshgajin") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_shadowvoshAI (pCreature);
|
||||
return new boss_shadowvoshAI(creature);
|
||||
}
|
||||
|
||||
struct boss_shadowvoshAI : public ScriptedAI
|
||||
struct boss_shadowvoshAI : public BossAI
|
||||
{
|
||||
boss_shadowvoshAI(Creature *c) : ScriptedAI(c) {}
|
||||
|
||||
uint32 CurseOfBlood_Timer;
|
||||
uint32 Hex_Timer;
|
||||
uint32 Cleave_Timer;
|
||||
boss_shadowvoshAI(Creature* creature) : BossAI(creature, DATA_SHADOW_HUNTER_VOSHGAJIN) {}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
CurseOfBlood_Timer = 2000;
|
||||
Hex_Timer = 8000;
|
||||
Cleave_Timer = 14000;
|
||||
|
||||
_Reset();
|
||||
//DoCast(me, SPELL_ICEARMOR, true);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/){}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, 2*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_HEX, 8*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 14*IN_MILLISECONDS);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*who*/)
|
||||
{
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 const diff)
|
||||
{
|
||||
//Return since we have no target
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//CurseOfBlood_Timer
|
||||
if (CurseOfBlood_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_CURSEOFBLOOD);
|
||||
CurseOfBlood_Timer = 45000;
|
||||
} else CurseOfBlood_Timer -= diff;
|
||||
events.Update(diff);
|
||||
|
||||
//Hex_Timer
|
||||
if (Hex_Timer <= diff)
|
||||
{
|
||||
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
|
||||
DoCast(pTarget, SPELL_HEX);
|
||||
Hex_Timer = 15000;
|
||||
} else Hex_Timer -= diff;
|
||||
if (me->HasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
//Cleave_Timer
|
||||
if (Cleave_Timer <= diff)
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_CLEAVE);
|
||||
Cleave_Timer = 7000;
|
||||
} else Cleave_Timer -= diff;
|
||||
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_CURSE_OF_BLOOD:
|
||||
DoCast(me->getVictim(), SPELL_CURSEOFBLOOD);
|
||||
events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, 45*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_HEX:
|
||||
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
|
||||
DoCast(pTarget, SPELL_HEX);
|
||||
events.ScheduleEvent(EVENT_HEX, 15*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_CLEAVE:
|
||||
DoCast(me->getVictim(), SPELL_CLEAVE);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 7*IN_MILLISECONDS);
|
||||
break;
|
||||
}
|
||||
}
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -16,80 +16,86 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Boss_The_Best
|
||||
SD%Complete: 100
|
||||
SDComment:
|
||||
SDCategory: Blackrock Spire
|
||||
EndScriptData */
|
||||
#include "blackrock_spire.h"
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
enum Spells
|
||||
{
|
||||
SPELL_FLAMEBREAK = 16785,
|
||||
SPELL_IMMOLATE = 20294,
|
||||
SPELL_TERRIFYINGROAR = 14100,
|
||||
};
|
||||
|
||||
#define SPELL_FLAMEBREAK 16785
|
||||
#define SPELL_IMMOLATE 20294
|
||||
#define SPELL_TERRIFYINGROAR 14100
|
||||
enum Events
|
||||
{
|
||||
EVENT_FLAME_BREAK = 1,
|
||||
EVENT_IMMOLATE = 2,
|
||||
EVENT_TERRIFYING_ROAR = 3,
|
||||
};
|
||||
|
||||
class boss_the_beast : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_the_beast() : CreatureScript("boss_the_beast") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_thebeastAI (pCreature);
|
||||
return new boss_thebeastAI(creature);
|
||||
}
|
||||
|
||||
struct boss_thebeastAI : public ScriptedAI
|
||||
struct boss_thebeastAI : public BossAI
|
||||
{
|
||||
boss_thebeastAI(Creature *c) : ScriptedAI(c) {}
|
||||
|
||||
uint32 Flamebreak_Timer;
|
||||
uint32 Immolate_Timer;
|
||||
uint32 TerrifyingRoar_Timer;
|
||||
boss_thebeastAI(Creature* creature) : BossAI(creature, DATA_THE_BEAST) {}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
Flamebreak_Timer = 12000;
|
||||
Immolate_Timer = 3000;
|
||||
TerrifyingRoar_Timer = 23000;
|
||||
_Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_FLAME_BREAK, 12*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_IMMOLATE, 3*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_TERRIFYING_ROAR, 23*IN_MILLISECONDS);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
void JustDied(Unit* /*who*/)
|
||||
{
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 const diff)
|
||||
{
|
||||
//Return since we have no target
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//Flamebreak_Timer
|
||||
if (Flamebreak_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_FLAMEBREAK);
|
||||
Flamebreak_Timer = 10000;
|
||||
} else Flamebreak_Timer -= diff;
|
||||
events.Update(diff);
|
||||
|
||||
//Immolate_Timer
|
||||
if (Immolate_Timer <= diff)
|
||||
{
|
||||
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
|
||||
DoCast(pTarget, SPELL_IMMOLATE);
|
||||
Immolate_Timer = 8000;
|
||||
} else Immolate_Timer -= diff;
|
||||
if (me->HasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
//TerrifyingRoar_Timer
|
||||
if (TerrifyingRoar_Timer <= diff)
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_TERRIFYINGROAR);
|
||||
TerrifyingRoar_Timer = 20000;
|
||||
} else TerrifyingRoar_Timer -= diff;
|
||||
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_FLAME_BREAK:
|
||||
DoCast(me->getVictim(), SPELL_FLAMEBREAK);
|
||||
events.ScheduleEvent(EVENT_FLAME_BREAK, 10*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_IMMOLATE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
|
||||
DoCast(target, SPELL_IMMOLATE);
|
||||
events.ScheduleEvent(EVENT_IMMOLATE, 8*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_TERRIFYING_ROAR:
|
||||
DoCast(me->getVictim(), SPELL_TERRIFYINGROAR);
|
||||
events.ScheduleEvent(EVENT_TERRIFYING_ROAR, 20*IN_MILLISECONDS);
|
||||
break;
|
||||
}
|
||||
}
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
void AddSC_boss_thebeast()
|
||||
|
||||
@@ -16,105 +16,103 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: Boss_Warmaster_Voone
|
||||
SD%Complete: 100
|
||||
SDComment:
|
||||
SDCategory: Blackrock Spire
|
||||
EndScriptData */
|
||||
#include "blackrock_spire.h"
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
enum Spells
|
||||
{
|
||||
SPELL_SNAPKICK = 15618,
|
||||
SPELL_CLEAVE = 15579,
|
||||
SPELL_UPPERCUT = 10966,
|
||||
SPELL_MORTALSTRIKE = 16856,
|
||||
SPELL_PUMMEL = 15615,
|
||||
SPELL_THROWAXE = 16075,
|
||||
};
|
||||
|
||||
#define SPELL_SNAPKICK 15618
|
||||
#define SPELL_CLEAVE 15579
|
||||
#define SPELL_UPPERCUT 10966
|
||||
#define SPELL_MORTALSTRIKE 16856
|
||||
#define SPELL_PUMMEL 15615
|
||||
#define SPELL_THROWAXE 16075
|
||||
enum Events
|
||||
{
|
||||
EVENT_SNAP_KICK = 1,
|
||||
EVENT_CLEAVE = 2,
|
||||
EVENT_UPPERCUT = 3,
|
||||
EVENT_MORTAL_STRIKE = 4,
|
||||
EVENT_PUMMEL = 5,
|
||||
EVENT_THROW_AXE = 6,
|
||||
};
|
||||
|
||||
class boss_warmaster_voone : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_warmaster_voone() : CreatureScript("boss_warmaster_voone") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_warmastervooneAI (pCreature);
|
||||
return new boss_warmastervooneAI(creature);
|
||||
}
|
||||
|
||||
struct boss_warmastervooneAI : public ScriptedAI
|
||||
struct boss_warmastervooneAI : public BossAI
|
||||
{
|
||||
boss_warmastervooneAI(Creature *c) : ScriptedAI(c) {}
|
||||
|
||||
uint32 Snapkick_Timer;
|
||||
uint32 Cleave_Timer;
|
||||
uint32 Uppercut_Timer;
|
||||
uint32 MortalStrike_Timer;
|
||||
uint32 Pummel_Timer;
|
||||
uint32 ThrowAxe_Timer;
|
||||
boss_warmastervooneAI(Creature* creature) : BossAI(creature, DATA_WARMASTER_VOONE) {}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
Snapkick_Timer = 8000;
|
||||
Cleave_Timer = 14000;
|
||||
Uppercut_Timer = 20000;
|
||||
MortalStrike_Timer = 12000;
|
||||
Pummel_Timer = 32000;
|
||||
ThrowAxe_Timer = 1000;
|
||||
_Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_SNAP_KICK, 8*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 14*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_UPPERCUT, 20*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_MORTAL_STRIKE, 12*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_PUMMEL, 32*IN_MILLISECONDS);
|
||||
events.ScheduleEvent(EVENT_THROW_AXE, 1*IN_MILLISECONDS);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*who*/)
|
||||
{
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
//Return since we have no target
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//Snapkick_Timer
|
||||
if (Snapkick_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_SNAPKICK);
|
||||
Snapkick_Timer = 6000;
|
||||
} else Snapkick_Timer -= diff;
|
||||
events.Update(diff);
|
||||
|
||||
//Cleave_Timer
|
||||
if (Cleave_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_CLEAVE);
|
||||
Cleave_Timer = 12000;
|
||||
} else Cleave_Timer -= diff;
|
||||
if (me->HasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
//Uppercut_Timer
|
||||
if (Uppercut_Timer <= diff)
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_UPPERCUT);
|
||||
Uppercut_Timer = 14000;
|
||||
} else Uppercut_Timer -= diff;
|
||||
|
||||
//MortalStrike_Timer
|
||||
if (MortalStrike_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_MORTALSTRIKE);
|
||||
MortalStrike_Timer = 10000;
|
||||
} else MortalStrike_Timer -= diff;
|
||||
|
||||
//Pummel_Timer
|
||||
if (Pummel_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_PUMMEL);
|
||||
Pummel_Timer = 16000;
|
||||
} else Pummel_Timer -= diff;
|
||||
|
||||
//ThrowAxe_Timer
|
||||
if (ThrowAxe_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_THROWAXE);
|
||||
ThrowAxe_Timer = 8000;
|
||||
} else ThrowAxe_Timer -= diff;
|
||||
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_SNAP_KICK:
|
||||
DoCast(me->getVictim(), SPELL_SNAPKICK);
|
||||
events.ScheduleEvent(EVENT_SNAP_KICK, 6*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_CLEAVE:
|
||||
DoCast(me->getVictim(), SPELL_CLEAVE);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 12*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_UPPERCUT:
|
||||
DoCast(me->getVictim(), SPELL_UPPERCUT);
|
||||
events.ScheduleEvent(EVENT_UPPERCUT, 14*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_MORTAL_STRIKE:
|
||||
DoCast(me->getVictim(), SPELL_MORTALSTRIKE);
|
||||
events.ScheduleEvent(EVENT_MORTAL_STRIKE, 10*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_PUMMEL:
|
||||
DoCast(me->getVictim(), SPELL_PUMMEL);
|
||||
events.ScheduleEvent(EVENT_MORTAL_STRIKE, 16*IN_MILLISECONDS);
|
||||
break;
|
||||
case EVENT_THROW_AXE:
|
||||
DoCast(me->getVictim(), SPELL_THROWAXE);
|
||||
events.ScheduleEvent(EVENT_THROW_AXE, 8*IN_MILLISECONDS);
|
||||
break;
|
||||
}
|
||||
}
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -0,0 +1,242 @@
|
||||
/*
|
||||
* Copyright (C) 2008-2011 TrinityCore <http://www.trinitycore.org/>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "blackrock_spire.h"
|
||||
|
||||
class instance_blackrock_spire : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_blackrock_spire() : InstanceMapScript("instance_blackrock_spire", 229) { }
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* pMap) const
|
||||
{
|
||||
return new instance_blackrock_spireMapScript(pMap);
|
||||
}
|
||||
|
||||
struct instance_blackrock_spireMapScript : public InstanceScript
|
||||
{
|
||||
instance_blackrock_spireMapScript(InstanceMap* map) : InstanceScript(map) {}
|
||||
|
||||
uint32 Encounter[MAX_ENCOUNTER];
|
||||
std::string m_strInstData;
|
||||
uint64 HighlordOmokk;
|
||||
uint64 ShadowHunterVoshgajin;
|
||||
uint64 WarMasterVoone;
|
||||
uint64 MotherSmolderweb;
|
||||
uint64 UrokDoomhowl;
|
||||
uint64 QuartermasterZigris;
|
||||
uint64 GizrultheSlavener;
|
||||
uint64 Halycon;
|
||||
uint64 OverlordWyrmthalak;
|
||||
uint64 PyroguardEmberseer;
|
||||
uint64 WarchiefRendBlackhand;
|
||||
uint64 Gyth;
|
||||
uint64 TheBeast;
|
||||
uint64 GeneralDrakkisath;
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
HighlordOmokk = 0;
|
||||
ShadowHunterVoshgajin = 0;
|
||||
WarMasterVoone = 0;
|
||||
MotherSmolderweb = 0;
|
||||
UrokDoomhowl = 0;
|
||||
QuartermasterZigris = 0;
|
||||
GizrultheSlavener = 0;
|
||||
Halycon = 0;
|
||||
OverlordWyrmthalak = 0;
|
||||
PyroguardEmberseer = 0;
|
||||
WarchiefRendBlackhand = 0;
|
||||
Gyth = 0;
|
||||
TheBeast = 0;
|
||||
GeneralDrakkisath = 0;
|
||||
}
|
||||
|
||||
bool IsEncounterInProgress() const
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
{
|
||||
if (Encounter[i] == IN_PROGRESS)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
switch(creature->GetEntry())
|
||||
{
|
||||
case NPC_OMOKK:
|
||||
HighlordOmokk = creature->GetGUID();
|
||||
break;
|
||||
case NPC_SHADOW_HUNTER_VOSHGAJIN:
|
||||
ShadowHunterVoshgajin = creature->GetGUID();
|
||||
break;
|
||||
case NPC_WARMASTER_VOONE:
|
||||
WarMasterVoone = creature->GetGUID();
|
||||
break;
|
||||
case NPC_MOTHER_SMOLDERWEB:
|
||||
MotherSmolderweb = creature->GetGUID();
|
||||
break;
|
||||
case NPC_UROK_DOOMHOWL:
|
||||
UrokDoomhowl = creature->GetGUID();
|
||||
break;
|
||||
case NPC_QUARTERMASTER_ZIGRIS:
|
||||
QuartermasterZigris = creature->GetGUID();
|
||||
break;
|
||||
case NPC_GIZRUL_THE_SLAVENER:
|
||||
GizrultheSlavener = creature->GetGUID();
|
||||
break;
|
||||
case NPC_HALYCON:
|
||||
Halycon = creature->GetGUID();
|
||||
break;
|
||||
case NPC_OVERLORD_WYRMTHALAK:
|
||||
OverlordWyrmthalak = creature->GetGUID();
|
||||
break;
|
||||
case NPC_PYROGAURD_EMBERSEER:
|
||||
PyroguardEmberseer = creature->GetGUID();
|
||||
break;
|
||||
case NPC_WARCHIEF_REND_BLACKHAND:
|
||||
WarchiefRendBlackhand = creature->GetGUID();
|
||||
break;
|
||||
case NPC_GYTH:
|
||||
Gyth = creature->GetGUID();
|
||||
break;
|
||||
case NPC_THE_BEAST:
|
||||
TheBeast = creature->GetGUID();
|
||||
break;
|
||||
case NPC_GENERAL_DRAKKISATH:
|
||||
GeneralDrakkisath = creature->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 type, EncounterState state)
|
||||
{
|
||||
if (!InstanceScript::SetBossState(type, state))
|
||||
return false;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case DATA_OMOKK:
|
||||
case DATA_SHADOW_HUNTER_VOSHGAJIN:
|
||||
case DATA_WARMASTER_VOONE:
|
||||
case DATA_MOTHER_SMOLDERWEB:
|
||||
case DATA_UROK_DOOMHOWL:
|
||||
case DATA_QUARTERMASTER_ZIGRIS:
|
||||
case DATA_GIZRUL_THE_SLAVENER:
|
||||
case DATA_HALYCON:
|
||||
case DATA_OVERLORD_WYRMTHALAK:
|
||||
case DATA_PYROGAURD_EMBERSEER:
|
||||
case DATA_WARCHIEF_REND_BLACKHAND:
|
||||
case DATA_GYTH:
|
||||
case DATA_THE_BEAST:
|
||||
case DATA_GENERAL_DRAKKISATH:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 type)
|
||||
{
|
||||
switch(type)
|
||||
{
|
||||
case DATA_OMOKK:
|
||||
return HighlordOmokk;
|
||||
case DATA_SHADOW_HUNTER_VOSHGAJIN:
|
||||
return ShadowHunterVoshgajin;
|
||||
case DATA_WARMASTER_VOONE:
|
||||
return WarMasterVoone;
|
||||
case DATA_MOTHER_SMOLDERWEB:
|
||||
return MotherSmolderweb;
|
||||
case DATA_UROK_DOOMHOWL:
|
||||
return UrokDoomhowl;
|
||||
case DATA_QUARTERMASTER_ZIGRIS:
|
||||
return QuartermasterZigris;
|
||||
case DATA_GIZRUL_THE_SLAVENER:
|
||||
return GizrultheSlavener;
|
||||
case DATA_HALYCON:
|
||||
return Halycon;
|
||||
case DATA_OVERLORD_WYRMTHALAK:
|
||||
return OverlordWyrmthalak;
|
||||
case DATA_PYROGAURD_EMBERSEER:
|
||||
return PyroguardEmberseer;
|
||||
case DATA_WARCHIEF_REND_BLACKHAND:
|
||||
return WarchiefRendBlackhand;
|
||||
case DATA_GYTH:
|
||||
return Gyth;
|
||||
case DATA_THE_BEAST:
|
||||
return TheBeast;
|
||||
case DATA_GENERAL_DRAKKISATH:
|
||||
return GeneralDrakkisath;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "B S " << GetBossSaveData();
|
||||
|
||||
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;
|
||||
|
||||
std::istringstream loadStream(strIn);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'B' && dataHead2 == 'S')
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
|
||||
tmpState = NOT_STARTED;
|
||||
}
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
void AddSC_instance_blackrock_spire()
|
||||
{
|
||||
new instance_blackrock_spire();
|
||||
}
|
||||
@@ -120,6 +120,8 @@ set(scripts_STAT_SRCS
|
||||
EasternKingdoms/BlackrockSpire/boss_rend_blackhand.cpp
|
||||
EasternKingdoms/BlackrockSpire/boss_highlord_omokk.cpp
|
||||
EasternKingdoms/BlackrockSpire/boss_the_beast.cpp
|
||||
EasternKingdoms/BlackrockSpire/blackrock_spire.h
|
||||
EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp
|
||||
EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp
|
||||
EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
|
||||
EasternKingdoms/SunwellPlateau/sunwell_plateau.h
|
||||
|
||||
Reference in New Issue
Block a user