mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-16 18:40:28 +00:00
Big re-organization of repository [W.I.P]
This commit is contained in:
@@ -1,841 +0,0 @@
|
||||
/*
|
||||
REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "trial_of_the_champion.h"
|
||||
#include "ScriptedEscortAI.h"
|
||||
#include "SpellScript.h"
|
||||
|
||||
enum EadricSpells
|
||||
{
|
||||
//Eadric
|
||||
SPELL_EADRIC_ACHIEVEMENT = 68197,
|
||||
ACHIEV_FACEROLLER = 3803,
|
||||
|
||||
SPELL_RADIANCE = 66935,
|
||||
SPELL_VENGEANCE = 66865,
|
||||
SPELL_HAMMER_JUSTICE = 66863,
|
||||
SPELL_HAMMER_RIGHTEOUS = 66867,
|
||||
SPELL_HAMMER_RIGHTEOUS_DAMAGE = 66903,
|
||||
SPELL_HAMMER_RIGHTEOUS_ACTION_BAR = 66904,
|
||||
SPELL_HAMMER_RIGHTEOUS_THROW_BACK = 66905,
|
||||
};
|
||||
|
||||
enum EadricEvents
|
||||
{
|
||||
EVENT_SPELL_RADIANCE = 1,
|
||||
EVENT_SPELL_HAMMER_RIGHTEOUS,
|
||||
};
|
||||
|
||||
enum PaletressSpells
|
||||
{
|
||||
SPELL_SMITE_N = 66536,
|
||||
SPELL_SMITE_H = 67674,
|
||||
SPELL_HOLY_FIRE_N = 66538,
|
||||
SPELL_HOLY_FIRE_H = 67676,
|
||||
SPELL_RENEW_N = 66537,
|
||||
SPELL_RENEW_H = 67675,
|
||||
|
||||
SPELL_HOLY_NOVA = 66546,
|
||||
SPELL_SHIELD = 66515,
|
||||
SPELL_CONFESS = 66680,
|
||||
SPELL_SUMMON_MEMORY = 66545,
|
||||
|
||||
//Memory
|
||||
SPELL_OLD_WOUNDS_N = 66620,
|
||||
SPELL_OLD_WOUNDS_H = 67679,
|
||||
SPELL_SHADOWS_PAST_N = 66619,
|
||||
SPELL_SHADOWS_PAST_H = 67678,
|
||||
SPELL_WAKING_NIGHTMARE_N = 66552,
|
||||
SPELL_WAKING_NIGHTMARE_H = 67677,
|
||||
};
|
||||
|
||||
#define SPELL_SMITE DUNGEON_MODE(SPELL_SMITE_N, SPELL_SMITE_H)
|
||||
#define SPELL_HOLY_FIRE DUNGEON_MODE(SPELL_HOLY_FIRE_N, SPELL_HOLY_FIRE_H)
|
||||
#define SPELL_RENEW DUNGEON_MODE(SPELL_RENEW_N, SPELL_RENEW_H)
|
||||
#define SPELL_OLD_WOUNDS DUNGEON_MODE(SPELL_OLD_WOUNDS_N, SPELL_OLD_WOUNDS_H)
|
||||
#define SPELL_SHADOWS_PAST DUNGEON_MODE(SPELL_SHADOWS_PAST_N, SPELL_SHADOWS_PAST_H)
|
||||
#define SPELL_WAKING_NIGHTMARE DUNGEON_MODE(SPELL_WAKING_NIGHTMARE_N, SPELL_WAKING_NIGHTMARE_H)
|
||||
|
||||
enum PaletressEvents
|
||||
{
|
||||
EVENT_SPELL_SMITE = 1,
|
||||
EVENT_SPELL_HOLY_FIRE,
|
||||
EVENT_SPELL_RENEW,
|
||||
|
||||
EVENT_MEMORY_SCALE,
|
||||
EVENT_MEMORY_START_ATTACK,
|
||||
EVENT_SPELL_OLD_WOUNDS,
|
||||
EVENT_SPELL_SHADOWS_PAST,
|
||||
EVENT_SPELL_WAKING_NIGHTMARE,
|
||||
};
|
||||
|
||||
#define TEXT_RADIATE "Eadric the Pure begins to radiate light. Shield your eyes!"
|
||||
|
||||
class boss_eadric : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_eadric() : CreatureScript("boss_eadric") { }
|
||||
struct boss_eadricAI : public ScriptedAI
|
||||
{
|
||||
boss_eadricAI(Creature* pCreature) : ScriptedAI(pCreature)
|
||||
{
|
||||
pInstance = pCreature->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
EventMap events;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
if( pInstance )
|
||||
pInstance->SetData(BOSS_ARGENT_CHALLENGE, NOT_STARTED);
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id)
|
||||
{
|
||||
if( type == POINT_MOTION_TYPE && id == 1 )
|
||||
me->SetFacingTo(3*M_PI/2);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who)
|
||||
{
|
||||
if( who->GetTypeId() == TYPEID_PLAYER )
|
||||
{
|
||||
if( urand(0,1) )
|
||||
Talk(TEXT_EADRIC_SLAIN_1);
|
||||
else
|
||||
Talk(TEXT_EADRIC_SLAIN_2);
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_SPELL_RADIANCE, 16000);
|
||||
events.ScheduleEvent(EVENT_SPELL_HAMMER_RIGHTEOUS, 25000);
|
||||
Talk(TEXT_EADRIC_AGGRO);
|
||||
me->CastSpell(me, SPELL_VENGEANCE, false);
|
||||
if( pInstance )
|
||||
pInstance->SetData(BOSS_ARGENT_CHALLENGE, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void SpellHit(Unit* caster, const SpellInfo* spell)
|
||||
{
|
||||
if (spell->Id == 66905 && me->GetHealth() == 1) // hammer throw back damage (15k)
|
||||
me->CastSpell(me, 68197, true);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
if( damage >= me->GetHealth() )
|
||||
{
|
||||
damage = me->GetHealth() - 1;
|
||||
if( me->getFaction() != 35 )
|
||||
{
|
||||
me->CastSpell((Unit*)NULL, 68575, true); // achievements
|
||||
me->GetMap()->UpdateEncounterState(ENCOUNTER_CREDIT_CAST_SPELL, 68574, me); // paletress' spell credits encounter, but shouldn't credit achievements
|
||||
me->setFaction(35);
|
||||
events.Reset();
|
||||
Talk(TEXT_EADRIC_DEATH);
|
||||
me->getThreatManager().clearReferences();
|
||||
me->SetRegeneratingHealth(false);
|
||||
_EnterEvadeMode();
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
if( pInstance )
|
||||
pInstance->SetData(BOSS_ARGENT_CHALLENGE, DONE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if( !UpdateVictim() )
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if( me->HasUnitState(UNIT_STATE_CASTING) )
|
||||
return;
|
||||
|
||||
switch( events.GetEvent() )
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case EVENT_SPELL_RADIANCE:
|
||||
me->CastSpell((Unit*)NULL, SPELL_RADIANCE, false);
|
||||
me->MonsterTextEmote(TEXT_RADIATE, 0, true);
|
||||
events.RepeatEvent(16000);
|
||||
break;
|
||||
case EVENT_SPELL_HAMMER_RIGHTEOUS:
|
||||
if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 55.0f, true) )
|
||||
{
|
||||
char buffer[100];
|
||||
sprintf(buffer, "Eadric the Pure targets %s with the Hammer of the Righteous!", target->GetName().c_str());
|
||||
me->MonsterTextEmote(buffer, 0, true);
|
||||
Talk(TEXT_EADRIC_HAMMER);
|
||||
me->CastSpell(target, SPELL_HAMMER_JUSTICE, true);
|
||||
me->CastSpell(target, SPELL_HAMMER_RIGHTEOUS, false);
|
||||
}
|
||||
events.RepeatEvent(25000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_eadricAI(pCreature);
|
||||
}
|
||||
};
|
||||
|
||||
class boss_paletress : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_paletress() : CreatureScript("boss_paletress") { }
|
||||
|
||||
struct boss_paletressAI : public ScriptedAI
|
||||
{
|
||||
boss_paletressAI(Creature* pCreature) : ScriptedAI(pCreature)
|
||||
{
|
||||
pInstance = pCreature->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
EventMap events;
|
||||
bool summoned;
|
||||
uint64 MemoryGUID;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
summoned = false;
|
||||
if( MemoryGUID )
|
||||
{
|
||||
if( Creature* memory = ObjectAccessor::GetCreature(*me, MemoryGUID) )
|
||||
memory->DespawnOrUnsummon();
|
||||
MemoryGUID = 0;
|
||||
}
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
if( pInstance )
|
||||
pInstance->SetData(BOSS_ARGENT_CHALLENGE, NOT_STARTED);
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id)
|
||||
{
|
||||
if( type == POINT_MOTION_TYPE && id == 1 )
|
||||
me->SetFacingTo(3*M_PI/2);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who)
|
||||
{
|
||||
if( who->GetTypeId() == TYPEID_PLAYER )
|
||||
{
|
||||
if( urand(0,1) )
|
||||
Talk(TEXT_PALETRESS_SLAIN_1);
|
||||
else
|
||||
Talk(TEXT_PALETRESS_SLAIN_2);
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_SPELL_HOLY_FIRE, urand(9000,12000));
|
||||
events.ScheduleEvent(EVENT_SPELL_SMITE, urand(2000,3000));
|
||||
me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
|
||||
Talk(TEXT_PALETRESS_AGGRO);
|
||||
if( pInstance )
|
||||
pInstance->SetData(BOSS_ARGENT_CHALLENGE, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if( param == 1 )
|
||||
{
|
||||
MemoryGUID = 0;
|
||||
me->RemoveAura(SPELL_SHIELD);
|
||||
Talk(TEXT_PALETRESS_MEMORY_DEFEATED);
|
||||
}
|
||||
else if( param == (-1) )
|
||||
{
|
||||
if( MemoryGUID )
|
||||
if( Creature* memory = ObjectAccessor::GetCreature(*me, MemoryGUID) )
|
||||
{
|
||||
memory->DespawnOrUnsummon();
|
||||
MemoryGUID = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
//if( me->HasAura(SPELL_SHIELD) )
|
||||
// return;
|
||||
|
||||
if( damage >= me->GetHealth() )
|
||||
{
|
||||
damage = me->GetHealth() - 1;
|
||||
|
||||
if( me->getFaction() != 35 )
|
||||
{
|
||||
me->CastSpell((Unit*)NULL, 68574, true); // achievements
|
||||
me->setFaction(35);
|
||||
events.Reset();
|
||||
Talk(TEXT_PALETRESS_DEATH);
|
||||
me->getThreatManager().clearReferences();
|
||||
me->SetRegeneratingHealth(false);
|
||||
_EnterEvadeMode();
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
if( pInstance )
|
||||
{
|
||||
pInstance->SetData(BOSS_ARGENT_CHALLENGE, DONE);
|
||||
pInstance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 68206);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
if( pInstance )
|
||||
pInstance->SetData(DATA_MEMORY_ENTRY, summon->GetEntry());
|
||||
MemoryGUID = summon->GetGUID();
|
||||
}
|
||||
|
||||
void SummonMemory()
|
||||
{
|
||||
uint8 uiRandom = urand(0,25);
|
||||
uint32 uiSpells[26] = {66704,66705,66706,66707,66709,66710,66711,66712,66713,66714,66715,66708,66708,66691,66692,66694,66695,66696,66697,66698,66699,66700,66701,66702,66703,66543};
|
||||
me->CastSpell(me, uiSpells[uiRandom], true);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if( !UpdateVictim() )
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if( !summoned && HealthBelowPct(25) )
|
||||
{
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
Talk(TEXT_PALETRESS_MEMORY_SUMMON);
|
||||
me->CastSpell((Unit*)NULL, SPELL_HOLY_NOVA, false);
|
||||
me->CastSpell(me, SPELL_SHIELD, false);
|
||||
me->CastSpell((Unit*)NULL, SPELL_SUMMON_MEMORY, false);
|
||||
SummonMemory();
|
||||
me->CastSpell((Unit*)NULL, SPELL_CONFESS, false);
|
||||
events.ScheduleEvent(EVENT_SPELL_RENEW, urand(6000,8000));
|
||||
summoned = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if( me->HasUnitState(UNIT_STATE_CASTING) )
|
||||
return;
|
||||
|
||||
switch( events.GetEvent() )
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case EVENT_SPELL_SMITE:
|
||||
if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true) )
|
||||
me->CastSpell(target, SPELL_SMITE, false);
|
||||
events.RepeatEvent(urand(3000,4000));
|
||||
break;
|
||||
case EVENT_SPELL_HOLY_FIRE:
|
||||
if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true) )
|
||||
me->CastSpell(target, SPELL_HOLY_FIRE, false);
|
||||
events.RepeatEvent(urand(9000,12000));
|
||||
break;
|
||||
case EVENT_SPELL_RENEW:
|
||||
if( !MemoryGUID )
|
||||
{
|
||||
events.PopEvent();
|
||||
break;
|
||||
}
|
||||
if( urand(0,1) )
|
||||
me->CastSpell(me, SPELL_RENEW, false);
|
||||
else if( Creature* memory = ObjectAccessor::GetCreature(*me, MemoryGUID) )
|
||||
if( memory->IsAlive() )
|
||||
me->CastSpell(memory, SPELL_RENEW, false);
|
||||
events.RepeatEvent(urand(15000,17000));
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_paletressAI(pCreature);
|
||||
}
|
||||
};
|
||||
|
||||
class npc_memory : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_memory() : CreatureScript("npc_memory") { }
|
||||
|
||||
struct npc_memoryAI : public ScriptedAI
|
||||
{
|
||||
npc_memoryAI(Creature* pCreature) : ScriptedAI(pCreature)
|
||||
{
|
||||
pInstance = pCreature->GetInstanceScript();
|
||||
events.Reset();
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetObjectScale(0.01f);
|
||||
events.ScheduleEvent(EVENT_MEMORY_SCALE, 500);
|
||||
}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
EventMap events;
|
||||
|
||||
void Reset() {}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
me->DespawnOrUnsummon(20000);
|
||||
if( pInstance )
|
||||
if( Creature* paletress = ObjectAccessor::GetCreature(*me, pInstance->GetData64(DATA_PALETRESS)) )
|
||||
paletress->AI()->DoAction(1);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
UpdateVictim();
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if( me->HasUnitState(UNIT_STATE_CASTING) )
|
||||
return;
|
||||
|
||||
switch( events.GetEvent() )
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case EVENT_MEMORY_SCALE:
|
||||
me->SetObjectScale(1.0f);
|
||||
events.ScheduleEvent(EVENT_MEMORY_START_ATTACK, 5000);
|
||||
events.PopEvent();
|
||||
break;
|
||||
case EVENT_MEMORY_START_ATTACK:
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
if( Unit* target = me->SelectNearestTarget(200.0f) )
|
||||
{
|
||||
AttackStart(target);
|
||||
DoZoneInCombat();
|
||||
}
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
events.ScheduleEvent(EVENT_SPELL_OLD_WOUNDS, 8000);
|
||||
events.ScheduleEvent(EVENT_SPELL_SHADOWS_PAST, 4000);
|
||||
events.ScheduleEvent(EVENT_SPELL_WAKING_NIGHTMARE, urand(20000,30000));
|
||||
events.PopEvent();
|
||||
break;
|
||||
case EVENT_SPELL_OLD_WOUNDS:
|
||||
if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 10.0f, true) )
|
||||
me->CastSpell(target, SPELL_OLD_WOUNDS, true);
|
||||
events.RepeatEvent(12000);
|
||||
break;
|
||||
case EVENT_SPELL_SHADOWS_PAST:
|
||||
if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true) )
|
||||
me->CastSpell(target, SPELL_SHADOWS_PAST, false);
|
||||
events.RepeatEvent(urand(15000,20000));
|
||||
break;
|
||||
case EVENT_SPELL_WAKING_NIGHTMARE:
|
||||
me->CastSpell(me, SPELL_WAKING_NIGHTMARE, false);
|
||||
events.RepeatEvent(35000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new npc_memoryAI(pCreature);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
enum ArgentSoldierSpells
|
||||
{
|
||||
// monk
|
||||
SPELL_FLURRY_OF_BLOWS = 67233,
|
||||
SPELL_PUMMEL = 67235,
|
||||
SPELL_DIVINE_SHIELD_H = 67251,
|
||||
SPELL_FINAL_MEDITATION_H = 67255,
|
||||
|
||||
// priestess
|
||||
SPELL_HOLY_SMITE_N = 36176,
|
||||
SPELL_HOLY_SMITE_H = 67289,
|
||||
SPELL_FOUNTAIN_OF_LIGHT = 67194,
|
||||
NPC_FOUNTAIN_OF_LIGHT = 35311,
|
||||
SPELL_SHADOW_WORD_PAIN_N = 34941,
|
||||
SPELL_SHADOW_WORD_PAIN_H = 34942,
|
||||
SPELL_MIND_CONTROL_H = 67229,
|
||||
|
||||
// lightwielder
|
||||
SPELL_BLAZING_LIGHT_N = 67247,
|
||||
SPELL_BLAZING_LIGHT_H = 67290,
|
||||
SPELL_CLEAVE = 15284,
|
||||
SPELL_UNBALANCING_STRIKE_H = 67237,
|
||||
};
|
||||
|
||||
#define SPELL_HOLY_SMITE DUNGEON_MODE(SPELL_HOLY_SMITE_N, SPELL_HOLY_SMITE_H)
|
||||
#define SPELL_SHADOW_WORD_PAIN DUNGEON_MODE(SPELL_SHADOW_WORD_PAIN_N, SPELL_SHADOW_WORD_PAIN_H)
|
||||
#define SPELL_BLAZING_LIGHT DUNGEON_MODE(SPELL_BLAZING_LIGHT_N, SPELL_BLAZING_LIGHT_H)
|
||||
|
||||
enum ArgentSoldierEvents
|
||||
{
|
||||
EVENT_MONK_SPELL_FLURRY_OF_BLOWS = 1,
|
||||
EVENT_MONK_SPELL_PUMMEL,
|
||||
EVENT_PRIESTESS_SPELL_HOLY_SMITE,
|
||||
EVENT_PRIESTESS_SPELL_SHADOW_WORD_PAIN,
|
||||
EVENT_PRIESTESS_SPELL_FOUNTAIN_OF_LIGHT,
|
||||
EVENT_PRIESTESS_SPELL_MIND_CONTROL_H,
|
||||
EVENT_LIGHTWIELDER_SPELL_BLAZING_LIGHT,
|
||||
EVENT_LIGHTWIELDER_SPELL_CLEAVE,
|
||||
EVENT_LIGHTWIELDER_SPELL_UNBALANCING_STRIKE_H,
|
||||
};
|
||||
|
||||
class npc_argent_soldier : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_argent_soldier() : CreatureScript("npc_argent_soldier") { }
|
||||
|
||||
struct npc_argent_soldierAI : public npc_escortAI
|
||||
{
|
||||
npc_argent_soldierAI(Creature* pCreature) : npc_escortAI(pCreature)
|
||||
{
|
||||
pInstance = pCreature->GetInstanceScript();
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
SetDespawnAtEnd(false);
|
||||
uiWaypoint = 0;
|
||||
}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
EventMap events;
|
||||
uint8 uiWaypoint;
|
||||
bool bCheck;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
bCheck = false;
|
||||
}
|
||||
|
||||
void WaypointReached(uint32 uiPoint)
|
||||
{
|
||||
if( uiPoint == 1 )
|
||||
{
|
||||
switch( uiWaypoint )
|
||||
{
|
||||
case 0:
|
||||
me->SetFacingTo(5.4f);
|
||||
break;
|
||||
case 1:
|
||||
me->SetFacingTo(4.6f);
|
||||
break;
|
||||
case 2:
|
||||
me->SetFacingTo(4.0f);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SetData(uint32 uiType, uint32 /*uiData*/)
|
||||
{
|
||||
AddWaypoint(0, me->GetPositionX(), 660.0f, 411.80f);
|
||||
switch( me->GetEntry() )
|
||||
{
|
||||
case NPC_ARGENT_LIGHTWIELDER:
|
||||
switch( uiType )
|
||||
{
|
||||
case 0:
|
||||
AddWaypoint(1,716.321f,647.047f,411.93f);
|
||||
break;
|
||||
case 1:
|
||||
AddWaypoint(1,742.44f,650.29f,411.79f);
|
||||
break;
|
||||
case 2:
|
||||
AddWaypoint(1,772.6314f,651.7f,411.93f);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case NPC_ARGENT_MONK:
|
||||
switch( uiType )
|
||||
{
|
||||
case 0:
|
||||
AddWaypoint(1,717.86f,649.0f,411.923f);
|
||||
break;
|
||||
case 1:
|
||||
AddWaypoint(1,746.73f,650.24f,411.56f);
|
||||
break;
|
||||
case 2:
|
||||
AddWaypoint(1,775.567f,648.26f,411.93f);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case NPC_PRIESTESS:
|
||||
switch( uiType )
|
||||
{
|
||||
case 0:
|
||||
AddWaypoint(1,719.872f,650.94f,411.93f);
|
||||
break;
|
||||
case 1:
|
||||
AddWaypoint(1,750.72f,650.20f,411.77f);
|
||||
break;
|
||||
case 2:
|
||||
AddWaypoint(1,777.78f,645.70f,411.93f);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
Start(false,true,0);
|
||||
uiWaypoint = uiType;
|
||||
}
|
||||
|
||||
void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
if( bCheck && damage >= me->GetHealth() )
|
||||
{
|
||||
bCheck = false;
|
||||
damage = me->GetHealth()-1;
|
||||
events.DelayEvents(10000);
|
||||
me->CastSpell(me, SPELL_DIVINE_SHIELD_H, true);
|
||||
me->CastSpell((Unit*)NULL, SPELL_FINAL_MEDITATION_H, true);
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
switch( me->GetEntry() )
|
||||
{
|
||||
case NPC_ARGENT_MONK:
|
||||
events.RescheduleEvent(EVENT_MONK_SPELL_FLURRY_OF_BLOWS, 5000);
|
||||
events.RescheduleEvent(EVENT_MONK_SPELL_PUMMEL, 7000);
|
||||
if( IsHeroic() )
|
||||
bCheck = true;
|
||||
break;
|
||||
case NPC_PRIESTESS:
|
||||
events.RescheduleEvent(EVENT_PRIESTESS_SPELL_HOLY_SMITE, urand(5000,8000));
|
||||
events.RescheduleEvent(EVENT_PRIESTESS_SPELL_SHADOW_WORD_PAIN, urand(3000,6000));
|
||||
events.RescheduleEvent(EVENT_PRIESTESS_SPELL_FOUNTAIN_OF_LIGHT, urand(8000,15000));
|
||||
if( IsHeroic() )
|
||||
events.RescheduleEvent(EVENT_PRIESTESS_SPELL_MIND_CONTROL_H, 12000);
|
||||
break;
|
||||
case NPC_ARGENT_LIGHTWIELDER:
|
||||
events.RescheduleEvent(EVENT_LIGHTWIELDER_SPELL_BLAZING_LIGHT, urand(12000,15000));
|
||||
events.RescheduleEvent(EVENT_LIGHTWIELDER_SPELL_CLEAVE, urand(3000,5000));
|
||||
if( IsHeroic() )
|
||||
events.RescheduleEvent(EVENT_LIGHTWIELDER_SPELL_UNBALANCING_STRIKE_H, urand(8000,12000));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
npc_escortAI::UpdateAI(diff);
|
||||
|
||||
if( !UpdateVictim() )
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if( me->HasUnitState(UNIT_STATE_CASTING) )
|
||||
return;
|
||||
|
||||
switch( events.GetEvent() )
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
|
||||
case EVENT_MONK_SPELL_FLURRY_OF_BLOWS:
|
||||
me->CastSpell(me, SPELL_FLURRY_OF_BLOWS, false);
|
||||
events.RepeatEvent(urand(12000,18000));
|
||||
break;
|
||||
case EVENT_MONK_SPELL_PUMMEL:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_PUMMEL, false);
|
||||
events.RepeatEvent(urand(8000,11000));
|
||||
break;
|
||||
|
||||
case EVENT_PRIESTESS_SPELL_HOLY_SMITE:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_HOLY_SMITE, false);
|
||||
events.RepeatEvent(urand(6000,8000));
|
||||
break;
|
||||
case EVENT_PRIESTESS_SPELL_SHADOW_WORD_PAIN:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_SHADOW_WORD_PAIN, false);
|
||||
events.RepeatEvent(urand(12000,15000));
|
||||
break;
|
||||
case EVENT_PRIESTESS_SPELL_FOUNTAIN_OF_LIGHT:
|
||||
me->CastSpell((Unit*)NULL, SPELL_FOUNTAIN_OF_LIGHT, false);
|
||||
events.RepeatEvent(urand(35000,45000));
|
||||
break;
|
||||
case EVENT_PRIESTESS_SPELL_MIND_CONTROL_H:
|
||||
if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true) )
|
||||
me->CastSpell(target, SPELL_MIND_CONTROL_H, false);
|
||||
events.RepeatEvent(urand(22000,30000));
|
||||
break;
|
||||
|
||||
case EVENT_LIGHTWIELDER_SPELL_BLAZING_LIGHT:
|
||||
{
|
||||
Unit* target = DoSelectLowestHpFriendly(40.0f);
|
||||
if( !target )
|
||||
target = me;
|
||||
me->CastSpell(target, SPELL_BLAZING_LIGHT, false);
|
||||
events.RepeatEvent(urand(8000,12000));
|
||||
}
|
||||
break;
|
||||
case EVENT_LIGHTWIELDER_SPELL_CLEAVE:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false);
|
||||
events.RepeatEvent(urand(6000,8000));
|
||||
break;
|
||||
case EVENT_LIGHTWIELDER_SPELL_UNBALANCING_STRIKE_H:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_UNBALANCING_STRIKE_H, false);
|
||||
events.RepeatEvent(urand(12000,15000));
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*pKiller*/)
|
||||
{
|
||||
me->DespawnOrUnsummon(10000);
|
||||
if( pInstance )
|
||||
pInstance->SetData(DATA_ARGENT_SOLDIER_DEFEATED, 0);
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new npc_argent_soldierAI(pCreature);
|
||||
}
|
||||
};
|
||||
|
||||
class spell_eadric_radiance : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_eadric_radiance() : SpellScriptLoader("spell_eadric_radiance") { }
|
||||
|
||||
class spell_eadric_radiance_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_eadric_radiance_SpellScript);
|
||||
|
||||
void FilterTargets(std::list<WorldObject*>& targets)
|
||||
{
|
||||
std::list<WorldObject*> tmplist;
|
||||
for( std::list<WorldObject*>::const_iterator itr = targets.begin(); itr != targets.end(); ++itr)
|
||||
if( (*itr)->ToUnit()->HasInArc(M_PI, GetCaster()) )
|
||||
tmplist.push_back(*itr);
|
||||
|
||||
targets.clear();
|
||||
for( std::list<WorldObject*>::iterator itr = tmplist.begin(); itr != tmplist.end(); ++itr )
|
||||
targets.push_back(*itr);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_eadric_radiance_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_eadric_radiance_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_eadric_radiance_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_toc5_light_rain : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_toc5_light_rain() : SpellScriptLoader("spell_toc5_light_rain") { }
|
||||
|
||||
class spell_toc5_light_rain_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_toc5_light_rain_SpellScript);
|
||||
|
||||
void FilterTargets(std::list<WorldObject*>& targets)
|
||||
{
|
||||
for( std::list<WorldObject*>::iterator itr = targets.begin(); itr != targets.end(); )
|
||||
{
|
||||
if ((*itr)->GetTypeId() == TYPEID_UNIT)
|
||||
if ((*itr)->ToCreature()->GetEntry() == NPC_FOUNTAIN_OF_LIGHT)
|
||||
{
|
||||
targets.erase(itr);
|
||||
itr = targets.begin();
|
||||
continue;
|
||||
}
|
||||
++itr;
|
||||
}
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_toc5_light_rain_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_toc5_light_rain_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_reflective_shield : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_reflective_shield() : SpellScriptLoader("spell_reflective_shield") { }
|
||||
|
||||
class spell_reflective_shield_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_reflective_shield_AuraScript)
|
||||
|
||||
void HandleAfterEffectAbsorb(AuraEffect * aurEff, DamageInfo & dmgInfo, uint32 & absorbAmount)
|
||||
{
|
||||
if( Unit* attacker = dmgInfo.GetAttacker() )
|
||||
if( GetOwner() && attacker->GetGUID() != GetOwner()->GetGUID() )
|
||||
{
|
||||
int32 damage = (int32)(absorbAmount*0.25f);
|
||||
GetOwner()->ToUnit()->CastCustomSpell(attacker, 33619, &damage, NULL, NULL, true);
|
||||
}
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectAbsorb += AuraEffectAbsorbFn(spell_reflective_shield_AuraScript::HandleAfterEffectAbsorb, EFFECT_0);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript *GetAuraScript() const
|
||||
{
|
||||
return new spell_reflective_shield_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_argent_challenge()
|
||||
{
|
||||
new boss_eadric();
|
||||
new boss_paletress();
|
||||
new npc_memory();
|
||||
new npc_argent_soldier();
|
||||
new spell_eadric_radiance();
|
||||
new spell_toc5_light_rain();
|
||||
new spell_reflective_shield();
|
||||
}
|
||||
@@ -1,479 +0,0 @@
|
||||
/*
|
||||
REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptedEscortAI.h"
|
||||
#include "trial_of_the_champion.h"
|
||||
#include "SpellInfo.h"
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_RAISE_DEAD_JAEREN = 67715,
|
||||
SPELL_RAISE_DEAD_ARELAS = 67705,
|
||||
SPELL_BK_FEIGN_DEATH = 67691,
|
||||
SPELL_BLACK_KNIGHT_RES = 67693,
|
||||
SPELL_BK_KILL_CREDIT = 68663,
|
||||
|
||||
// phase 1
|
||||
SPELL_PLAGUE_STRIKE_N = 67724,
|
||||
SPELL_PLAGUE_STRIKE_H = 67884,
|
||||
SPELL_ICY_TOUCH_N = 67718,
|
||||
SPELL_ICY_TOUCH_H = 67881,
|
||||
SPELL_DEATH_RESPITE_N = 67745,
|
||||
SPELL_DEATH_RESPITE_H = 68306,
|
||||
SPELL_DEATH_RESPITE_DUMMY = 66798,
|
||||
SPELL_OBLITERATE_N = 67725,
|
||||
SPELL_OBLITERATE_H = 67883,
|
||||
|
||||
// phase 2 (+ abilities from phase 1 without death respite)
|
||||
SPELL_ARMY_DEAD_N = 67761,
|
||||
SPELL_ARMY_DEAD_H = 67874,
|
||||
SPELL_DESECRATION_N = 67778,
|
||||
SPELL_DESECRATION_H = 67877,
|
||||
SPELL_DESECRATION_SUMMON = 67779,
|
||||
SPELL_BK_GHOUL_EXPLODE = 67751,
|
||||
|
||||
// phase 3
|
||||
SPELL_DEATH_BITE_N = 67808,
|
||||
SPELL_DEATH_BITE_H = 67875,
|
||||
SPELL_MARKED_DEATH_N = 67823,
|
||||
SPELL_MARKED_DEATH_H = 67882,
|
||||
|
||||
// ghouls
|
||||
SPELL_CLAW_N = 67774,
|
||||
SPELL_CLAW_H = 67879,
|
||||
SPELL_EXPLODE_N = 67729,
|
||||
SPELL_EXPLODE_H = 67886,
|
||||
SPELL_LEAP_N = 67749,
|
||||
SPELL_LEAP_H = 67880,
|
||||
};
|
||||
#define SPELL_LEAP DUNGEON_MODE(SPELL_LEAP_N, SPELL_LEAP_H)
|
||||
#define SPELL_EXPLODE DUNGEON_MODE(SPELL_EXPLODE_N, SPELL_EXPLODE_H)
|
||||
|
||||
#define SPELL_PLAGUE_STRIKE DUNGEON_MODE(SPELL_PLAGUE_STRIKE_N, SPELL_PLAGUE_STRIKE_H)
|
||||
#define SPELL_ICY_TOUCH DUNGEON_MODE(SPELL_ICY_TOUCH_N, SPELL_ICY_TOUCH_H)
|
||||
#define SPELL_DEATH_RESPITE DUNGEON_MODE(SPELL_DEATH_RESPITE_N, SPELL_DEATH_RESPITE_H)
|
||||
#define SPELL_OBLITERATE DUNGEON_MODE(SPELL_OBLITERATE_N, SPELL_OBLITERATE_H)
|
||||
#define SPELL_ARMY_DEAD DUNGEON_MODE(SPELL_ARMY_DEAD_N, SPELL_ARMY_DEAD_H)
|
||||
#define SPELL_DESECRATION DUNGEON_MODE(SPELL_DESECRATION_N, SPELL_DESECRATION_H)
|
||||
#define SPELL_DEATH_BITE DUNGEON_MODE(SPELL_DEATH_BITE_N, SPELL_DEATH_BITE_H)
|
||||
#define SPELL_MARKED_DEATH DUNGEON_MODE(SPELL_MARKED_DEATH_N, SPELL_MARKED_DEATH_H)
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_ANNOUNCER_SAY_ZOMBIE = 1,
|
||||
EVENT_SPELL_PLAGUE_STRIKE,
|
||||
EVENT_SPELL_ICY_TOUCH,
|
||||
EVENT_SPELL_DEATH_RESPITE,
|
||||
EVENT_SPELL_OBLITERATE,
|
||||
EVENT_SPELL_DESECRATION,
|
||||
EVENT_SPELL_DEATH_BITE,
|
||||
EVENT_SPELL_MARKED_DEATH,
|
||||
};
|
||||
|
||||
enum NPCs
|
||||
{
|
||||
NPC_RISEN_CHAMPION = 35590,
|
||||
};
|
||||
|
||||
enum Models
|
||||
{
|
||||
MODEL_SKELETON = 29846,
|
||||
MODEL_GHOST = 21300
|
||||
};
|
||||
|
||||
|
||||
class boss_black_knight : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_black_knight() : CreatureScript("boss_black_knight") { }
|
||||
|
||||
struct boss_black_knightAI : public ScriptedAI
|
||||
{
|
||||
boss_black_knightAI(Creature* pCreature) : ScriptedAI(pCreature), summons(me)
|
||||
{
|
||||
pInstance = pCreature->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
uint8 Phase;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
Phase = 1;
|
||||
me->SetDisplayId(me->GetNativeDisplayId());
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
if( pInstance )
|
||||
pInstance->SetData(BOSS_BLACK_KNIGHT, NOT_STARTED);
|
||||
|
||||
//me->SetLootMode(0); // [LOOT]
|
||||
}
|
||||
|
||||
void EnterEvadeMode()
|
||||
{
|
||||
me->DespawnOrUnsummon(1);
|
||||
ScriptedAI::EnterEvadeMode();
|
||||
}
|
||||
|
||||
void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
|
||||
{
|
||||
damage = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
if( Phase < 3 && damage >= me->GetHealth() )
|
||||
{
|
||||
damage = 0;
|
||||
me->SetHealth(me->GetMaxHealth());
|
||||
events.Reset();
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->RemoveAllAuras();
|
||||
me->SetControlled(true, UNIT_STATE_STUNNED);
|
||||
me->CastSpell(me, SPELL_BK_GHOUL_EXPLODE, true);
|
||||
summons.clear();
|
||||
|
||||
me->CastSpell(me, SPELL_BK_FEIGN_DEATH, true);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
|
||||
me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
|
||||
me->AddUnitState(UNIT_STATE_DIED);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if( param == -1 )
|
||||
{
|
||||
summons.DespawnAll();
|
||||
}
|
||||
else if( param == 1 )
|
||||
{
|
||||
if( !pInstance )
|
||||
return;
|
||||
|
||||
pInstance->SetData(BOSS_BLACK_KNIGHT, IN_PROGRESS);
|
||||
Talk(TEXT_BK_AGGRO);
|
||||
me->CastSpell((Unit*)NULL, (pInstance->GetData(DATA_TEAMID_IN_INSTANCE)==TEAM_HORDE ? SPELL_RAISE_DEAD_JAEREN : SPELL_RAISE_DEAD_ARELAS), false);
|
||||
if( Creature* announcer = pInstance->instance->GetCreature(pInstance->GetData64(DATA_ANNOUNCER)) )
|
||||
announcer->DespawnOrUnsummon();
|
||||
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_ANNOUNCER_SAY_ZOMBIE, 2500);
|
||||
events.ScheduleEvent(EVENT_SPELL_PLAGUE_STRIKE, urand(7000,9000));
|
||||
events.ScheduleEvent(EVENT_SPELL_ICY_TOUCH, urand(3500,7000));
|
||||
events.ScheduleEvent(EVENT_SPELL_DEATH_RESPITE, urand(13000,15000));
|
||||
events.ScheduleEvent(EVENT_SPELL_OBLITERATE, urand(11000,19000));
|
||||
}
|
||||
}
|
||||
|
||||
void SpellHitTarget(Unit* target, const SpellInfo* spell)
|
||||
{
|
||||
switch( spell->Id )
|
||||
{
|
||||
case SPELL_BLACK_KNIGHT_RES:
|
||||
me->SetHealth(me->GetMaxHealth());
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->SetControlled(false, UNIT_STATE_STUNNED);
|
||||
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
|
||||
me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
|
||||
me->ClearUnitState(UNIT_STATE_DIED);
|
||||
|
||||
++Phase;
|
||||
|
||||
switch( Phase )
|
||||
{
|
||||
case 2:
|
||||
me->SetDisplayId(MODEL_SKELETON);
|
||||
Talk(TEXT_BK_SKELETON_RES);
|
||||
me->CastSpell(me, SPELL_ARMY_DEAD, false);
|
||||
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_SPELL_PLAGUE_STRIKE, urand(7000,9000));
|
||||
events.ScheduleEvent(EVENT_SPELL_ICY_TOUCH, urand(3500,7000));
|
||||
events.ScheduleEvent(EVENT_SPELL_OBLITERATE, urand(11000,19000));
|
||||
events.ScheduleEvent(EVENT_SPELL_DESECRATION, urand(2000,3000));
|
||||
break;
|
||||
case 3:
|
||||
me->SetDisplayId(MODEL_GHOST);
|
||||
Talk(TEXT_BK_GHOST_RES);
|
||||
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_SPELL_DEATH_BITE, 2000);
|
||||
events.ScheduleEvent(EVENT_SPELL_MARKED_DEATH, 1000);
|
||||
break;
|
||||
default:
|
||||
EnterEvadeMode();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if( !UpdateVictim() )
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if( me->HasUnitState(UNIT_STATE_CASTING) )
|
||||
return;
|
||||
|
||||
switch( events.GetEvent() )
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case EVENT_ANNOUNCER_SAY_ZOMBIE:
|
||||
if( pInstance && !summons.empty() )
|
||||
if( Creature* ghoul = pInstance->instance->GetCreature(*summons.begin()) )
|
||||
ghoul->MonsterYell("[Zombie] .... . Brains ....", LANG_UNIVERSAL, 0);
|
||||
events.PopEvent();
|
||||
break;
|
||||
case EVENT_SPELL_PLAGUE_STRIKE:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_PLAGUE_STRIKE, false);
|
||||
events.RepeatEvent(urand(10000,12000));
|
||||
break;
|
||||
case EVENT_SPELL_ICY_TOUCH:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_ICY_TOUCH, false);
|
||||
events.RepeatEvent(urand(5000,6000));
|
||||
break;
|
||||
case EVENT_SPELL_DEATH_RESPITE:
|
||||
if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true) )
|
||||
me->CastSpell(target, SPELL_DEATH_RESPITE, false);
|
||||
events.RepeatEvent(urand(13000,15000));
|
||||
break;
|
||||
case EVENT_SPELL_OBLITERATE:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_OBLITERATE, false);
|
||||
events.RepeatEvent(urand(15000,17000));
|
||||
break;
|
||||
case EVENT_SPELL_DESECRATION:
|
||||
if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true) )
|
||||
me->CastSpell(target, SPELL_DESECRATION, false);
|
||||
events.RepeatEvent(urand(14000,17000));
|
||||
break;
|
||||
case EVENT_SPELL_DEATH_BITE:
|
||||
me->CastSpell((Unit*)NULL, SPELL_DEATH_BITE, false);
|
||||
events.RepeatEvent(urand(2000,4000));
|
||||
break;
|
||||
case EVENT_SPELL_MARKED_DEATH:
|
||||
if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.000000f, true) )
|
||||
me->CastSpell(target, SPELL_MARKED_DEATH, false);
|
||||
events.RepeatEvent(9000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
if( Unit* target = summon->SelectNearestTarget(200.0f) )
|
||||
{
|
||||
summon->AI()->AttackStart(target);
|
||||
DoZoneInCombat(summon);
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if( victim->GetTypeId() == TYPEID_PLAYER )
|
||||
{
|
||||
if( urand(0,1) )
|
||||
Talk(TEXT_BK_SLAIN_1);
|
||||
else
|
||||
Talk(TEXT_BK_SLAIN_2);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
me->CastSpell((Unit*)NULL, SPELL_BK_KILL_CREDIT, true);
|
||||
Talk(TEXT_BK_DEATH);
|
||||
if( pInstance )
|
||||
pInstance->SetData(BOSS_BLACK_KNIGHT, DONE);
|
||||
if( me->ToTempSummon() )
|
||||
me->ToTempSummon()->SetTempSummonType(TEMPSUMMON_MANUAL_DESPAWN);
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature *pCreature) const
|
||||
{
|
||||
return new boss_black_knightAI (pCreature);
|
||||
}
|
||||
};
|
||||
|
||||
class npc_black_knight_skeletal_gryphon : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_black_knight_skeletal_gryphon() : CreatureScript("npc_black_knight_skeletal_gryphon") {}
|
||||
|
||||
struct npc_black_knight_skeletal_gryphonAI : public npc_escortAI
|
||||
{
|
||||
npc_black_knight_skeletal_gryphonAI(Creature* pCreature) : npc_escortAI(pCreature) {}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
Start(false,true,0,NULL);
|
||||
SetDespawnAtEnd(true);
|
||||
}
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if( param == 1 )
|
||||
{
|
||||
me->SetControlled(false, UNIT_STATE_ROOT);
|
||||
me->DisableRotate(false);
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE);
|
||||
SetEscortPaused(false);
|
||||
}
|
||||
}
|
||||
|
||||
void WaypointReached(uint32 i)
|
||||
{
|
||||
if( i == 12 )
|
||||
{
|
||||
SetEscortPaused(true);
|
||||
me->SetOrientation(3.62f);
|
||||
me->SetControlled(true, UNIT_STATE_ROOT);
|
||||
me->DisableRotate(true);
|
||||
me->SetFacingTo(3.62f);
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_MOUNT_SPECIAL);
|
||||
if( InstanceScript* pInstance = me->GetInstanceScript() )
|
||||
pInstance->SetData(DATA_SKELETAL_GRYPHON_LANDED, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 uiDiff)
|
||||
{
|
||||
npc_escortAI::UpdateAI(uiDiff);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new npc_black_knight_skeletal_gryphonAI(pCreature);
|
||||
}
|
||||
};
|
||||
|
||||
class npc_black_knight_ghoul : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_black_knight_ghoul() : CreatureScript("npc_black_knight_ghoul") { }
|
||||
|
||||
struct npc_black_knight_ghoulAI : public ScriptedAI
|
||||
{
|
||||
npc_black_knight_ghoulAI(Creature* pCreature) : ScriptedAI(pCreature)
|
||||
{
|
||||
pInstance = pCreature->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
EventMap events;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
events.Reset();
|
||||
if (me->GetEntry() == NPC_RISEN_JAEREN || me->GetEntry() == NPC_RISEN_ARELAS)
|
||||
events.RescheduleEvent(1, 1000); // leap
|
||||
events.RescheduleEvent(2, urand(3000,4000)); // claw
|
||||
}
|
||||
|
||||
void SpellHit(Unit* caster, const SpellInfo* spell)
|
||||
{
|
||||
if (spell->Id == SPELL_BK_GHOUL_EXPLODE)
|
||||
{
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
|
||||
me->CastSpell(me, SPELL_EXPLODE, false);
|
||||
}
|
||||
}
|
||||
|
||||
void SpellHitTarget(Unit* target, const SpellInfo* spell)
|
||||
{
|
||||
switch(spell->Id)
|
||||
{
|
||||
case SPELL_CLAW_N:
|
||||
case SPELL_CLAW_H:
|
||||
DoResetThreat();
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f))
|
||||
{
|
||||
me->AddThreat(target, 100.0f);
|
||||
AttackStart(target);
|
||||
}
|
||||
break;
|
||||
case SPELL_EXPLODE_H:
|
||||
if (target && target->GetTypeId() == TYPEID_PLAYER)
|
||||
if (pInstance)
|
||||
pInstance->SetData(DATA_ACHIEV_IVE_HAD_WORSE, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
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: // leap
|
||||
if (Unit* target = me->GetVictim())
|
||||
if (me->GetDistance(target) > 5.0f && me->GetDistance(target) < 30.0f)
|
||||
{
|
||||
me->CastSpell(target, SPELL_LEAP, false);
|
||||
events.PopEvent();
|
||||
break;
|
||||
}
|
||||
events.RepeatEvent(1000);
|
||||
break;
|
||||
case 2: // claw
|
||||
if (Unit* target = me->GetVictim())
|
||||
me->CastSpell(target, SPELL_CLAW_N, false);
|
||||
events.RepeatEvent(urand(6000,8000));
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature *pCreature) const
|
||||
{
|
||||
return new npc_black_knight_ghoulAI (pCreature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_black_knight()
|
||||
{
|
||||
new boss_black_knight();
|
||||
new npc_black_knight_skeletal_gryphon();
|
||||
new npc_black_knight_ghoul();
|
||||
}
|
||||
@@ -1,943 +0,0 @@
|
||||
/*
|
||||
REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptedEscortAI.h"
|
||||
#include "Vehicle.h"
|
||||
#include "trial_of_the_champion.h"
|
||||
#include "PassiveAI.h"
|
||||
#include "Player.h"
|
||||
#include "SpellInfo.h"
|
||||
|
||||
enum MountSpells
|
||||
{
|
||||
SPELL_PLAYER_VEHICLE_DEFEND = 66482,
|
||||
SPELL_MINIONS_DEFEND = 64100,
|
||||
SPELL_BOSS_DEFEND = 62719,
|
||||
SPELL_BOSS_DEFEND_PERIODIC = 64553,
|
||||
SPELL_SHIELD_LEVEL_1_VISUAL = 63130,
|
||||
SPELL_SHIELD_LEVEL_2_VISUAL = 63131,
|
||||
SPELL_SHIELD_LEVEL_3_VISUAL = 63132,
|
||||
|
||||
SPELL_PLAYER_VEHICLE_SHIELD_BREAKER = 62575,
|
||||
SPELL_PLAYER_SHIELD_BREAKER_DAMAGE = 62626,
|
||||
SPELL_NPC_SHIELD_BREAKER = 68504,
|
||||
|
||||
SPELL_PLAYER_VEHICLE_CHARGE = 68284,
|
||||
SPELL_CHARGE_DAMAGE_20000 = 68498,
|
||||
SPELL_MINIONS_CHARGE = 63010,
|
||||
SPELL_BOSS_CHARGE = 68301, // triggers SPELL_MINIONS_CHARGE (should be with custom damage?)
|
||||
|
||||
SPELL_PLAYER_VEHICLE_THRUST = 68505,
|
||||
|
||||
SPELL_TRAMPLE_AURA = 67865,
|
||||
SPELL_TRAMPLE_TRIGGERED_DUMMY = 67866,
|
||||
SPELL_TRAMPLE_STUN = 67867,
|
||||
};
|
||||
|
||||
enum ChampionSpells
|
||||
{
|
||||
// Mage (Ambrose Boltspark, Eressea Dawnsinger)
|
||||
SPELL_FIREBALL_N = 66042,
|
||||
SPELL_FIREBALL_H = 68310,
|
||||
SPELL_BLAST_WAVE_N = 66044,
|
||||
SPELL_BLAST_WAVE_H = 68312,
|
||||
SPELL_HASTE = 66045,
|
||||
SPELL_POLYMORPH_N = 66043,
|
||||
SPELL_POLYMORPH_H = 68311,
|
||||
|
||||
// Shaman (Colosos, Runok Wildmane)
|
||||
SPELL_CHAIN_LIGHTNING_N = 67529,
|
||||
SPELL_CHAIN_LIGHTNING_H = 68319,
|
||||
SPELL_EARTH_SHIELD = 67530,
|
||||
SPELL_HEALING_WAVE_N = 67528,
|
||||
SPELL_HEALING_WAVE_H = 68318,
|
||||
SPELL_HEX_OF_MENDING = 67534,
|
||||
|
||||
// Hunter (Jaelyne Evensong, Zul'tore)
|
||||
SPELL_DISENGAGE = 68339,
|
||||
SPELL_LIGHTNING_ARROWS = 66083,
|
||||
SPELL_MULTI_SHOT = 66081,
|
||||
SPELL_SHOOT_N = 65868,
|
||||
SPELL_SHOOT_H = 67988,
|
||||
|
||||
// Rogue (Lana Stouthammer Evensong, Deathstalker Visceri)
|
||||
SPELL_EVISCERATE_N = 67709,
|
||||
SPELL_EVISCERATE_H = 68317,
|
||||
SPELL_FAN_OF_KNIVES = 67706,
|
||||
SPELL_POISON_BOTTLE = 67701,
|
||||
|
||||
// Warrior (Marshal Jacob Alerius, Mokra the Skullcrusher)
|
||||
SPELL_MORTAL_STRIKE_N = 68783,
|
||||
SPELL_MORTAL_STRIKE_H = 68784,
|
||||
SPELL_BLADESTORM = 63784,
|
||||
SPELL_INTERCEPT = 67540,
|
||||
SPELL_ROLLING_THROW = 67546, // not implemented yet!
|
||||
};
|
||||
|
||||
#define SPELL_FIREBALL DUNGEON_MODE(SPELL_FIREBALL_N, SPELL_FIREBALL_H)
|
||||
#define SPELL_BLAST_WAVE DUNGEON_MODE(SPELL_BLAST_WAVE_N, SPELL_BLAST_WAVE_H)
|
||||
#define SPELL_POLYMORPH DUNGEON_MODE(SPELL_POLYMORPH_N, SPELL_POLYMORPH_H)
|
||||
#define SPELL_CHAIN_LIGHTNING DUNGEON_MODE(SPELL_CHAIN_LIGHTNING_N, SPELL_CHAIN_LIGHTNING_H)
|
||||
#define SPELL_HEALING_WAVE DUNGEON_MODE(SPELL_HEALING_WAVE_N, SPELL_HEALING_WAVE_H)
|
||||
#define SPELL_SHOOT DUNGEON_MODE(SPELL_SHOOT_N, SPELL_SHOOT_H)
|
||||
#define SPELL_EVISCERATE DUNGEON_MODE(SPELL_EVISCERATE_N, SPELL_EVISCERATE_H)
|
||||
#define SPELL_MORTAL_STRIKE DUNGEON_MODE(SPELL_MORTAL_STRIKE_N, SPELL_MORTAL_STRIKE_H)
|
||||
|
||||
enum MountEvents
|
||||
{
|
||||
EVENT_NONE = 0,
|
||||
EVENT_MOUNT_CHARGE,
|
||||
EVENT_SHIELD_BREAKER,
|
||||
EVENT_THRUST,
|
||||
EVENT_FIND_NEW_MOUNT,
|
||||
};
|
||||
|
||||
enum ChampionEvents
|
||||
{
|
||||
EVEMT_MAGE_SPELL_FIREBALL = 101,
|
||||
EVEMT_MAGE_SPELL_BLAST_WAVE,
|
||||
EVEMT_MAGE_SPELL_HASTE,
|
||||
EVEMT_MAGE_SPELL_POLYMORPH,
|
||||
|
||||
EVENT_SHAMAN_SPELL_CHAIN_LIGHTNING,
|
||||
EVENT_SHAMAN_SPELL_EARTH_SHIELD,
|
||||
EVENT_SHAMAN_SPELL_HEALING_WAVE,
|
||||
EVENT_SHAMAN_SPELL_HEX_OF_MENDING,
|
||||
|
||||
EVENT_HUNTER_SPELL_DISENGAGE,
|
||||
EVENT_HUNTER_SPELL_LIGHTNING_ARROWS,
|
||||
EVENT_HUNTER_SPELL_MULTI_SHOT,
|
||||
EVENT_HUNTER_SPELL_SHOOT,
|
||||
|
||||
EVENT_ROGUE_SPELL_EVISCERATE,
|
||||
EVENT_ROGUE_SPELL_FAN_OF_KNIVES,
|
||||
EVENT_ROGUE_SPELL_POISON_BOTTLE,
|
||||
|
||||
EVENT_WARRIOR_SPELL_MORTAL_STRIKE,
|
||||
EVENT_WARRIOR_SPELL_BLADESTORM,
|
||||
EVENT_WARRIOR_SPELL_INTERCEPT,
|
||||
EVENT_WARRIOR_SPELL_ROLLING_THROW,
|
||||
};
|
||||
|
||||
class npc_toc5_player_vehicle : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_toc5_player_vehicle() : CreatureScript("npc_toc5_player_vehicle") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new npc_toc5_player_vehicleAI(pCreature);
|
||||
}
|
||||
|
||||
struct npc_toc5_player_vehicleAI : public NullCreatureAI
|
||||
{
|
||||
npc_toc5_player_vehicleAI(Creature* pCreature) : NullCreatureAI(pCreature)
|
||||
{
|
||||
conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_CREATURE_TEMPLATE_VEHICLE, me->GetEntry());
|
||||
m_ConditionsTimer = 1000;
|
||||
}
|
||||
|
||||
ConditionList conditions;
|
||||
uint16 m_ConditionsTimer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->getHostileRefManager().setOnlineOfflineState(false);
|
||||
}
|
||||
|
||||
void OnCharmed(bool apply)
|
||||
{
|
||||
if (me->IsDuringRemoveFromWorld())
|
||||
return;
|
||||
|
||||
if( apply )
|
||||
{
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->SetSpeed(MOVE_RUN, 2.0f, false);
|
||||
me->CastSpell(me, SPELL_TRAMPLE_AURA, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->StopMoving();
|
||||
me->RemoveAura(SPELL_TRAMPLE_AURA);
|
||||
}
|
||||
}
|
||||
|
||||
// just in case, should be done in spell_gen_defend
|
||||
void PassengerBoarded(Unit* who, int8 seat, bool apply)
|
||||
{
|
||||
if (me->IsDuringRemoveFromWorld())
|
||||
return;
|
||||
|
||||
if( !apply )
|
||||
{
|
||||
me->RemoveAura(SPELL_PLAYER_VEHICLE_DEFEND);
|
||||
who->RemoveAura(SPELL_PLAYER_VEHICLE_DEFEND);
|
||||
for (uint8 i=0; i<3; ++i)
|
||||
who->RemoveAura(SPELL_SHIELD_LEVEL_1_VISUAL + i);
|
||||
}
|
||||
}
|
||||
|
||||
//void EnterEvadeMode() { CreatureAI::EnterEvadeMode(); }
|
||||
void MoveInLineOfSight(Unit* who) {}
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (m_ConditionsTimer <= diff)
|
||||
{
|
||||
if (!conditions.empty())
|
||||
if (Unit* passenger = me->GetVehicleKit()->GetPassenger(0))
|
||||
if (!sConditionMgr->IsObjectMeetToConditions(passenger, me, conditions))
|
||||
passenger->ExitVehicle();
|
||||
m_ConditionsTimer = VEHICLE_CONDITION_CHECK_TIME;
|
||||
}
|
||||
else
|
||||
m_ConditionsTimer -= diff;
|
||||
}
|
||||
void AttackStart(Unit* who) {}
|
||||
void EnterCombat(Unit* who) {}
|
||||
};
|
||||
};
|
||||
|
||||
class npc_toc5_grand_champion_minion : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_toc5_grand_champion_minion() : CreatureScript("npc_toc5_grand_champion_minion") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new npc_toc5_grand_champion_minionAI(pCreature);
|
||||
}
|
||||
|
||||
struct npc_toc5_grand_champion_minionAI : public ScriptedAI
|
||||
{
|
||||
npc_toc5_grand_champion_minionAI(Creature* pCreature) : ScriptedAI(pCreature)
|
||||
{
|
||||
pInstance = pCreature->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
int32 ShieldTimer;
|
||||
EventMap events;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
ShieldTimer = 0;
|
||||
events.Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_MOUNT_CHARGE, urand(2500,4000));
|
||||
events.ScheduleEvent(EVENT_SHIELD_BREAKER, urand(5000,8000));
|
||||
events.ScheduleEvent(EVENT_THRUST, urand(3000,5000));
|
||||
me->CastSpell(me, SPELL_TRAMPLE_AURA, true);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if( ShieldTimer <= (int32)diff )
|
||||
{
|
||||
me->CastSpell(me, SPELL_MINIONS_DEFEND, true);
|
||||
ShieldTimer = 5000;
|
||||
}
|
||||
else
|
||||
ShieldTimer -= diff;
|
||||
|
||||
if ( !UpdateVictim() )
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if( me->HasUnitState(UNIT_STATE_CASTING) )
|
||||
return;
|
||||
|
||||
switch( events.GetEvent() )
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case EVENT_MOUNT_CHARGE:
|
||||
{
|
||||
std::vector<uint64> LIST;
|
||||
Map::PlayerList const &pl = me->GetMap()->GetPlayers();
|
||||
for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr )
|
||||
if( Player* plr = itr->GetSource() )
|
||||
{
|
||||
if( me->GetExactDist(plr) < 8.0f || me->GetExactDist(plr) > 25.0f || plr->isDead() )
|
||||
continue;
|
||||
if( !plr->GetVehicle() )
|
||||
LIST.push_back(plr->GetGUID());
|
||||
else if( Vehicle* v = plr->GetVehicle() )
|
||||
{
|
||||
if( Unit* mount = v->GetBase() )
|
||||
LIST.push_back(mount->GetGUID());
|
||||
}
|
||||
}
|
||||
if( !LIST.empty() )
|
||||
{
|
||||
uint8 rnd = LIST.size()>1 ? urand(0,LIST.size()-1) : 0;
|
||||
if( Unit* target = ObjectAccessor::GetUnit(*me, LIST.at(rnd)) )
|
||||
{
|
||||
me->getThreatManager().resetAllAggro();
|
||||
me->AddThreat(target, 10000.0f);
|
||||
AttackStart(target);
|
||||
me->CastSpell(target, SPELL_MINIONS_CHARGE, false);
|
||||
}
|
||||
}
|
||||
events.RepeatEvent(urand(4500,6000));
|
||||
}
|
||||
break;
|
||||
case EVENT_SHIELD_BREAKER:
|
||||
{
|
||||
std::vector<uint64> LIST;
|
||||
Map::PlayerList const &pl = me->GetMap()->GetPlayers();
|
||||
for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr )
|
||||
if( Player* plr = itr->GetSource() )
|
||||
{
|
||||
if( me->GetExactDist(plr) < 10.0f || me->GetExactDist(plr) > 30.0f )
|
||||
continue;
|
||||
if( Vehicle* v = plr->GetVehicle() )
|
||||
if( Unit* mount = v->GetBase() )
|
||||
LIST.push_back(mount->GetGUID());
|
||||
}
|
||||
if( !LIST.empty() )
|
||||
{
|
||||
uint8 rnd = LIST.size()>1 ? urand(0,LIST.size()-1) : 0;
|
||||
if( Unit* target = ObjectAccessor::GetCreature(*me, LIST.at(rnd)) )
|
||||
me->CastSpell(target, SPELL_NPC_SHIELD_BREAKER, false);
|
||||
}
|
||||
events.RepeatEvent(urand(6000,8000));
|
||||
}
|
||||
break;
|
||||
case EVENT_THRUST:
|
||||
if( me->GetVictim() && me->GetExactDist(me->GetVictim()) <= 5.5f )
|
||||
me->CastSpell(me->GetVictim(), SPELL_PLAYER_VEHICLE_THRUST, false);
|
||||
events.RepeatEvent(urand(3000,5000));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*pKiller*/)
|
||||
{
|
||||
me->SetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID, 0);
|
||||
me->DespawnOrUnsummon(10000);
|
||||
if( pInstance )
|
||||
pInstance->SetData(DATA_MOUNT_DIED, 0);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class boss_grand_champion : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_grand_champion() : CreatureScript("boss_grand_champion") { }
|
||||
|
||||
struct boss_grand_championAI : public npc_escortAI
|
||||
{
|
||||
boss_grand_championAI(Creature* pCreature) : npc_escortAI(pCreature)
|
||||
{
|
||||
pInstance = pCreature->GetInstanceScript();
|
||||
MountPhase = true;
|
||||
SetDespawnAtEnd(false);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
BossOrder = 0;
|
||||
NewMountGUID = 0;
|
||||
me->CastSpell(me, SPELL_BOSS_DEFEND_PERIODIC, true);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED);
|
||||
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_MOUNT_CHARGE, urand(2500,4000));
|
||||
events.ScheduleEvent(EVENT_SHIELD_BREAKER, urand(5000,8000));
|
||||
events.ScheduleEvent(EVENT_THRUST, urand(3000,5000));
|
||||
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_CHARM, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISORIENTED, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DISTRACT, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FEAR, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_GRIP, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_ROOT, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SLEEP, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SNARE, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_FREEZE, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_KNOCKOUT, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_POLYMORPH, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_BANISH, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SHACKLE, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_TURN, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_HORROR, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_INTERRUPT, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_DAZE, true);
|
||||
me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_SAPPED, true);
|
||||
}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
EventMap events;
|
||||
uint32 BossOrder;
|
||||
bool MountPhase;
|
||||
uint64 NewMountGUID;
|
||||
uint64 UnitTargetGUID;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
if( pInstance && pInstance->GetData(DATA_INSTANCE_PROGRESS) == INSTANCE_PROGRESS_CHAMPIONS_UNMOUNTED )
|
||||
{
|
||||
DoAction(1);
|
||||
DoAction(2);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->SetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID, 0);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
if( pInstance && pInstance->GetData(DATA_INSTANCE_PROGRESS) == INSTANCE_PROGRESS_CHAMPIONS_UNMOUNTED )
|
||||
me->CallForHelp(100.0f);
|
||||
}
|
||||
|
||||
void ScheduleAbilitiesEvents()
|
||||
{
|
||||
me->m_spellImmune[IMMUNITY_MECHANIC].clear();
|
||||
events.Reset();
|
||||
switch( me->GetEntry() )
|
||||
{
|
||||
case NPC_AMBROSE: // Ambrose Boltspark
|
||||
case NPC_ERESSEA: // Eressea Dawnsinger
|
||||
events.RescheduleEvent(EVEMT_MAGE_SPELL_FIREBALL, 5000);
|
||||
events.RescheduleEvent(EVEMT_MAGE_SPELL_BLAST_WAVE, 12000);
|
||||
events.RescheduleEvent(EVEMT_MAGE_SPELL_HASTE, 22000);
|
||||
events.RescheduleEvent(EVEMT_MAGE_SPELL_POLYMORPH, 8000);
|
||||
break;
|
||||
case NPC_COLOSOS: // Colosos
|
||||
case NPC_RUNOK: // Runok Wildmane
|
||||
events.RescheduleEvent(EVENT_SHAMAN_SPELL_CHAIN_LIGHTNING, 16000);
|
||||
events.RescheduleEvent(EVENT_SHAMAN_SPELL_EARTH_SHIELD, urand(30000,35000));
|
||||
events.RescheduleEvent(EVENT_SHAMAN_SPELL_HEALING_WAVE, 12000);
|
||||
events.RescheduleEvent(EVENT_SHAMAN_SPELL_HEX_OF_MENDING, urand(20000,25000));
|
||||
break;
|
||||
case NPC_JAELYNE: // Jaelyne Evensong
|
||||
case NPC_ZULTORE: // Zul'tore
|
||||
//events.RescheduleEvent(EVENT_HUNTER_SPELL_DISENGAGE, x);
|
||||
events.RescheduleEvent(EVENT_HUNTER_SPELL_LIGHTNING_ARROWS, 7000);
|
||||
events.RescheduleEvent(EVENT_HUNTER_SPELL_MULTI_SHOT, 12000);
|
||||
break;
|
||||
case NPC_LANA: // Lana Stouthammer
|
||||
case NPC_VISCERI: // Deathstalker Visceri
|
||||
events.RescheduleEvent(EVENT_ROGUE_SPELL_EVISCERATE, 8000);
|
||||
events.RescheduleEvent(EVENT_ROGUE_SPELL_FAN_OF_KNIVES, 14000);
|
||||
events.RescheduleEvent(EVENT_ROGUE_SPELL_POISON_BOTTLE, 19000);
|
||||
break;
|
||||
case NPC_JACOB: // Marshal Jacob Alerius
|
||||
case NPC_MOKRA: // Mokra the Skullcrusher
|
||||
events.RescheduleEvent(EVENT_WARRIOR_SPELL_MORTAL_STRIKE, urand(8000,12000));
|
||||
events.RescheduleEvent(EVENT_WARRIOR_SPELL_BLADESTORM, urand(15000,20000));
|
||||
events.RescheduleEvent(EVENT_WARRIOR_SPELL_INTERCEPT, 7000);
|
||||
//events.RescheduleEvent(EVENT_WARRIOR_SPELL_ROLLING_THROW, x);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void AddCreatureAddonAuras()
|
||||
{
|
||||
CreatureAddon const *cainfo = me->GetCreatureAddon();
|
||||
if (!cainfo)
|
||||
return;
|
||||
|
||||
if (!cainfo->auras.empty())
|
||||
{
|
||||
for (std::vector<uint32>::const_iterator itr = cainfo->auras.begin(); itr != cainfo->auras.end(); ++itr)
|
||||
{
|
||||
SpellInfo const *AdditionalSpellInfo = sSpellMgr->GetSpellInfo(*itr);
|
||||
if (!AdditionalSpellInfo)
|
||||
continue;
|
||||
|
||||
if (me->HasAura(AdditionalSpellInfo->Id))
|
||||
continue;
|
||||
|
||||
me->AddAura(AdditionalSpellInfo->Id, me);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if( param == 1 )
|
||||
{
|
||||
MountPhase = false;
|
||||
NewMountGUID = 0;
|
||||
me->SetHealth(me->GetMaxHealth());
|
||||
me->SetRegeneratingHealth(true);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED);
|
||||
me->SetSpeed(MOVE_RUN, 1.0f, false);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
|
||||
me->RemoveAllAuras();
|
||||
AddCreatureAddonAuras();
|
||||
events.Reset();
|
||||
}
|
||||
else if( param == 2 )
|
||||
ScheduleAbilitiesEvents();
|
||||
}
|
||||
|
||||
void SetData(uint32 uiType, uint32 uiData)
|
||||
{
|
||||
BossOrder = uiType;
|
||||
if( uiData > 1 )
|
||||
return;
|
||||
switch( BossOrder )
|
||||
{
|
||||
case 0:
|
||||
if (uiData == 0) // 1 == short version
|
||||
{
|
||||
AddWaypoint(0,747.36f,634.07f,411.572f);
|
||||
AddWaypoint(1,780.43f,607.15f,411.82f);
|
||||
}
|
||||
AddWaypoint(2,785.99f,599.41f,411.92f);
|
||||
AddWaypoint(3,778.44f,601.64f,411.79f);
|
||||
break;
|
||||
case 1:
|
||||
if (uiData == 0) // 1 == short version
|
||||
{
|
||||
AddWaypoint(0,747.35f,634.07f,411.57f);
|
||||
AddWaypoint(1,768.72f,581.01f,411.92f);
|
||||
}
|
||||
AddWaypoint(2,763.55f,590.52f,411.71f);
|
||||
break;
|
||||
case 2:
|
||||
if (uiData == 0) // 1 == short version
|
||||
{
|
||||
AddWaypoint(0,747.35f,634.07f,411.57f);
|
||||
AddWaypoint(1,784.02f,645.33f,412.39f);
|
||||
}
|
||||
AddWaypoint(2,775.67f,641.91f,411.91f);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
Start(false, true, 0, NULL);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
if( MountPhase )
|
||||
{
|
||||
if( me->GetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID) == 0 )
|
||||
damage = 0;
|
||||
else if( damage >= me->GetHealth() )
|
||||
{
|
||||
events.Reset();
|
||||
damage = me->GetHealth()-1;
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->RemoveAllAuras();
|
||||
AddCreatureAddonAuras();
|
||||
me->DeleteThreatList();
|
||||
me->CombatStop(true);
|
||||
me->GetMotionMaster()->Clear();
|
||||
me->StopMoving();
|
||||
me->SetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID, 0);
|
||||
me->SetRegeneratingHealth(false);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
|
||||
if( pInstance )
|
||||
{
|
||||
pInstance->SetData(DATA_MOUNT_DIED, BossOrder);
|
||||
if( Creature* mount = me->FindNearestCreature( pInstance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE ? VEHICLE_ARGENT_WARHORSE : VEHICLE_ARGENT_BATTLEWORG, 100.0f, true ) )
|
||||
{
|
||||
NewMountGUID = mount->GetGUID();
|
||||
me->GetMotionMaster()->MovePoint(7, *mount);
|
||||
events.RescheduleEvent(EVENT_FIND_NEW_MOUNT, 1000);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if( damage >= me->GetHealth() )
|
||||
{
|
||||
events.Reset();
|
||||
damage = me->GetHealth()-1;
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->RemoveAllAuras();
|
||||
AddCreatureAddonAuras();
|
||||
me->DeleteThreatList();
|
||||
me->CombatStop(true);
|
||||
me->GetMotionMaster()->Clear();
|
||||
me->SetRegeneratingHealth(false);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
if( pInstance )
|
||||
pInstance->SetData(DATA_GRAND_CHAMPION_DIED, BossOrder);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void EnterEvadeMode() {}
|
||||
|
||||
void WaypointReached(uint32 i)
|
||||
{
|
||||
if( !pInstance )
|
||||
return;
|
||||
|
||||
if( (i==2 && (BossOrder==1 || BossOrder==2)) || (i==3 && BossOrder==0) )
|
||||
pInstance->SetData(DATA_GRAND_CHAMPION_REACHED_DEST, BossOrder);
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id)
|
||||
{
|
||||
if( id < 4 )
|
||||
npc_escortAI::MovementInform(type, id);
|
||||
|
||||
if( type == POINT_MOTION_TYPE )
|
||||
{
|
||||
if( id == 5 )
|
||||
me->SetFacingTo(3*M_PI/2);
|
||||
else if( id == 7 ) // reached new mount!
|
||||
{
|
||||
if( NewMountGUID )
|
||||
if( Creature* mount = ObjectAccessor::GetCreature(*me, NewMountGUID) )
|
||||
{
|
||||
mount->DespawnOrUnsummon();
|
||||
me->SetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID, mount->GetDisplayId());
|
||||
me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
|
||||
me->SetHealth(50000);
|
||||
me->CastSpell(me, SPELL_BOSS_DEFEND_PERIODIC, true);
|
||||
me->SetRegeneratingHealth(true);
|
||||
events.Reset();
|
||||
events.ScheduleEvent(EVENT_MOUNT_CHARGE, urand(2500,4000));
|
||||
events.ScheduleEvent(EVENT_SHIELD_BREAKER, urand(5000,8000));
|
||||
events.ScheduleEvent(EVENT_THRUST, urand(3000,5000));
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
if( Unit* target = me->SelectNearestTarget(200.0f) )
|
||||
AttackStart(target);
|
||||
DoZoneInCombat();
|
||||
me->CastSpell(me, SPELL_TRAMPLE_AURA, true);
|
||||
if( pInstance )
|
||||
pInstance->SetData(DATA_REACHED_NEW_MOUNT, 0);
|
||||
NewMountGUID = 0;
|
||||
}
|
||||
}
|
||||
else if( id == 9 )
|
||||
me->DespawnOrUnsummon();
|
||||
}
|
||||
}
|
||||
|
||||
void SpellHit(Unit* caster, const SpellInfo* spell)
|
||||
{
|
||||
switch( spell->Id )
|
||||
{
|
||||
case SPELL_TRAMPLE_STUN:
|
||||
{
|
||||
char buffer[50];
|
||||
sprintf(buffer, "%s is trampled!", me->GetName().c_str());
|
||||
me->MonsterTextEmote(buffer, 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
npc_escortAI::UpdateAI(diff);
|
||||
|
||||
if ( !UpdateVictim() && !NewMountGUID )
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if( me->HasUnitState(UNIT_STATE_CASTING) || ((me->GetEntry()==NPC_JACOB || me->GetEntry()==NPC_MOKRA) && me->HasAura(SPELL_BLADESTORM)) )
|
||||
return;
|
||||
|
||||
switch( events.GetEvent() )
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case EVENT_FIND_NEW_MOUNT:
|
||||
{
|
||||
if( me->HasAura(SPELL_TRAMPLE_STUN) )
|
||||
{
|
||||
events.RepeatEvent(200);
|
||||
break;
|
||||
}
|
||||
|
||||
// hackfix, trample won't hit grand champions because of UNIT_FLAG_NON_ATTACKABLE
|
||||
if( pInstance )
|
||||
{
|
||||
bool trample = false;
|
||||
Map::PlayerList const &pl = me->GetMap()->GetPlayers();
|
||||
for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr )
|
||||
if( Player* plr = itr->GetSource() )
|
||||
if( me->GetExactDist(plr) <= 5.0f )
|
||||
if( Vehicle* v = plr->GetVehicle() )
|
||||
if( Unit* c = v->GetBase() )
|
||||
if( c->GetTypeId() == TYPEID_UNIT && c->ToCreature()->GetEntry() == (pInstance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE ? VEHICLE_ARGENT_BATTLEWORG : VEHICLE_ARGENT_WARHORSE) )
|
||||
{
|
||||
me->GetMotionMaster()->MovementExpired();;
|
||||
me->GetMotionMaster()->MoveIdle();
|
||||
me->StopMoving();
|
||||
me->CastSpell(me, SPELL_TRAMPLE_STUN, false);
|
||||
trample = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if( trample )
|
||||
{
|
||||
events.RepeatEvent(15100);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if( Creature* mount = ObjectAccessor::GetCreature(*me, NewMountGUID) )
|
||||
if( mount->IsAlive() )
|
||||
{
|
||||
if( me->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE )
|
||||
me->GetMotionMaster()->MovePoint(7, *mount);
|
||||
events.RepeatEvent(200);
|
||||
break;
|
||||
}
|
||||
|
||||
if( Creature* mount = me->FindNearestCreature( pInstance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_HORDE ? VEHICLE_ARGENT_WARHORSE : VEHICLE_ARGENT_BATTLEWORG, 100.0f, true ) )
|
||||
{
|
||||
me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
|
||||
NewMountGUID = mount->GetGUID();
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->GetMotionMaster()->MovePoint(7, *mount);
|
||||
events.RepeatEvent(200);
|
||||
break;
|
||||
}
|
||||
|
||||
events.PopEvent();
|
||||
}
|
||||
break;
|
||||
case EVENT_MOUNT_CHARGE:
|
||||
{
|
||||
std::vector<uint64> LIST;
|
||||
Map::PlayerList const &pl = me->GetMap()->GetPlayers();
|
||||
for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr )
|
||||
if( Player* plr = itr->GetSource() )
|
||||
{
|
||||
if( me->GetExactDist(plr) < 8.0f || me->GetExactDist(plr) > 25.0f || plr->isDead() )
|
||||
continue;
|
||||
if( !plr->GetVehicle() )
|
||||
LIST.push_back(plr->GetGUID());
|
||||
else if( Vehicle* v = plr->GetVehicle() )
|
||||
{
|
||||
if( Unit* mount = v->GetBase() )
|
||||
LIST.push_back(mount->GetGUID());
|
||||
}
|
||||
}
|
||||
if( !LIST.empty() )
|
||||
{
|
||||
uint8 rnd = LIST.size()>1 ? urand(0,LIST.size()-1) : 0;
|
||||
if( Unit* target = ObjectAccessor::GetUnit(*me, LIST.at(rnd)) )
|
||||
{
|
||||
me->getThreatManager().resetAllAggro();
|
||||
me->AddThreat(target, 10000.0f);
|
||||
AttackStart(target);
|
||||
me->CastSpell(target, SPELL_MINIONS_CHARGE, false);
|
||||
}
|
||||
}
|
||||
events.RepeatEvent(urand(4500,6000));
|
||||
}
|
||||
break;
|
||||
case EVENT_SHIELD_BREAKER:
|
||||
{
|
||||
std::vector<uint64> LIST;
|
||||
Map::PlayerList const &pl = me->GetMap()->GetPlayers();
|
||||
for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr )
|
||||
if( Player* plr = itr->GetSource() )
|
||||
{
|
||||
if( me->GetExactDist(plr) < 10.0f || me->GetExactDist(plr) > 30.0f )
|
||||
continue;
|
||||
if( Vehicle* v = plr->GetVehicle() )
|
||||
if( Unit* mount = v->GetBase() )
|
||||
LIST.push_back(mount->GetGUID());
|
||||
}
|
||||
if( !LIST.empty() )
|
||||
{
|
||||
uint8 rnd = LIST.size()>1 ? urand(0,LIST.size()-1) : 0;
|
||||
if( Unit* target = ObjectAccessor::GetCreature(*me, LIST.at(rnd)) )
|
||||
me->CastSpell(target, SPELL_NPC_SHIELD_BREAKER, false);
|
||||
}
|
||||
events.RepeatEvent(urand(6000,8000));
|
||||
}
|
||||
break;
|
||||
case EVENT_THRUST:
|
||||
if( Unit* victim = me->GetVictim() )
|
||||
if( me->GetExactDist(victim) <= 6.0f )
|
||||
me->CastSpell(victim, SPELL_PLAYER_VEHICLE_THRUST, false);
|
||||
events.RepeatEvent(urand(3000,5000));
|
||||
break;
|
||||
|
||||
/******************* MAGE *******************/
|
||||
case EVEMT_MAGE_SPELL_FIREBALL:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_FIREBALL, false);
|
||||
events.RepeatEvent(5000);
|
||||
break;
|
||||
case EVEMT_MAGE_SPELL_BLAST_WAVE:
|
||||
me->CastSpell((Unit*)NULL, SPELL_BLAST_WAVE, false);
|
||||
events.RepeatEvent(13000);
|
||||
break;
|
||||
case EVEMT_MAGE_SPELL_HASTE:
|
||||
me->CastSpell(me, SPELL_HASTE, false);
|
||||
events.RepeatEvent(22000);
|
||||
break;
|
||||
case EVEMT_MAGE_SPELL_POLYMORPH:
|
||||
if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true) )
|
||||
me->CastSpell(target, SPELL_POLYMORPH, false);
|
||||
events.RepeatEvent(8000);
|
||||
break;
|
||||
/***************** MAGE END *****************/
|
||||
|
||||
/****************** SHAMAN ******************/
|
||||
case EVENT_SHAMAN_SPELL_CHAIN_LIGHTNING:
|
||||
if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true) )
|
||||
me->CastSpell(target, SPELL_CHAIN_LIGHTNING, false);
|
||||
events.RepeatEvent(16000);
|
||||
break;
|
||||
case EVENT_SHAMAN_SPELL_EARTH_SHIELD:
|
||||
me->CastSpell(me, SPELL_EARTH_SHIELD, false);
|
||||
events.RepeatEvent(urand(30000,35000));
|
||||
break;
|
||||
case EVENT_SHAMAN_SPELL_HEALING_WAVE:
|
||||
{
|
||||
Unit* target = NULL;
|
||||
if( urand(0,1) )
|
||||
{
|
||||
target = DoSelectLowestHpFriendly(40.0f);
|
||||
if( !target )
|
||||
target = me;
|
||||
}
|
||||
else
|
||||
target = me;
|
||||
me->CastSpell(target, SPELL_HEALING_WAVE, false);
|
||||
events.RepeatEvent(22000);
|
||||
}
|
||||
break;
|
||||
case EVENT_SHAMAN_SPELL_HEX_OF_MENDING:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_HEX_OF_MENDING, false);
|
||||
events.RepeatEvent(urand(20000,25000));
|
||||
break;
|
||||
/**************** SHAMAN END ****************/
|
||||
|
||||
/****************** HUNTER ******************/
|
||||
case EVENT_HUNTER_SPELL_DISENGAGE:
|
||||
events.PopEvent();
|
||||
break;
|
||||
case EVENT_HUNTER_SPELL_LIGHTNING_ARROWS:
|
||||
me->CastSpell((Unit*)NULL, SPELL_LIGHTNING_ARROWS, false);
|
||||
events.RepeatEvent(urand(20000,25000));
|
||||
break;
|
||||
case EVENT_HUNTER_SPELL_MULTI_SHOT:
|
||||
{
|
||||
if( !UnitTargetGUID )
|
||||
{
|
||||
if( Unit* target = SelectTarget(SELECT_TARGET_FARTHEST, 0, 30.0f, true) )
|
||||
{
|
||||
me->CastSpell(target, SPELL_SHOOT, false);
|
||||
UnitTargetGUID = target->GetGUID();
|
||||
}
|
||||
events.RepeatEvent(2000);
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
Unit* target = ObjectAccessor::GetUnit(*me, UnitTargetGUID);
|
||||
if( target && me->IsInRange(target, 5.0f, 30.0f, false) )
|
||||
me->CastSpell(target, SPELL_MULTI_SHOT, false);
|
||||
else
|
||||
{
|
||||
Map::PlayerList const& pl = me->GetMap()->GetPlayers();
|
||||
for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr )
|
||||
{
|
||||
Player* player = itr->GetSource();
|
||||
if( player && me->IsInRange(player, 5.0f, 30.0f, false) )
|
||||
{
|
||||
me->CastSpell(player, SPELL_MULTI_SHOT, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
UnitTargetGUID = 0;
|
||||
}
|
||||
events.RepeatEvent(urand(15000,20000));
|
||||
}
|
||||
break;
|
||||
/**************** HUNTER END ****************/
|
||||
|
||||
/****************** ROGUE *******************/
|
||||
case EVENT_ROGUE_SPELL_EVISCERATE:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_EVISCERATE, false);
|
||||
events.RepeatEvent(8000);
|
||||
break;
|
||||
case EVENT_ROGUE_SPELL_FAN_OF_KNIVES:
|
||||
me->CastSpell((Unit*)NULL, SPELL_FAN_OF_KNIVES, false);
|
||||
events.RepeatEvent(14000);
|
||||
break;
|
||||
case EVENT_ROGUE_SPELL_POISON_BOTTLE:
|
||||
if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 30.0f, true) )
|
||||
me->CastSpell(target, SPELL_POISON_BOTTLE, false);
|
||||
events.RepeatEvent(19000);
|
||||
break;
|
||||
/**************** ROGUE END *****************/
|
||||
|
||||
/***************** WARRIOR ******************/
|
||||
case EVENT_WARRIOR_SPELL_MORTAL_STRIKE:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_MORTAL_STRIKE, false);
|
||||
events.RepeatEvent(urand(8000,12000));
|
||||
break;
|
||||
case EVENT_WARRIOR_SPELL_BLADESTORM:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_BLADESTORM, false);
|
||||
events.RepeatEvent(urand(15000,20000));
|
||||
break;
|
||||
case EVENT_WARRIOR_SPELL_INTERCEPT:
|
||||
{
|
||||
Map::PlayerList const& pl = me->GetMap()->GetPlayers();
|
||||
for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr )
|
||||
{
|
||||
Player* player = itr->GetSource();
|
||||
if( player && me->IsInRange(player, 8.0f, 25.0f, false) )
|
||||
{
|
||||
DoResetThreat();
|
||||
me->AddThreat(player,5.0f);
|
||||
me->CastSpell(player, SPELL_INTERCEPT, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
events.RepeatEvent(7000);
|
||||
}
|
||||
break;
|
||||
case EVENT_WARRIOR_SPELL_ROLLING_THROW:
|
||||
events.PopEvent();
|
||||
break;
|
||||
/*************** WARRIOR END ****************/
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_grand_championAI(pCreature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_grand_champions()
|
||||
{
|
||||
new boss_grand_champion();
|
||||
new npc_toc5_grand_champion_minion();
|
||||
new npc_toc5_player_vehicle();
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,118 +0,0 @@
|
||||
/*
|
||||
REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptedGossip.h"
|
||||
#include "trial_of_the_champion.h"
|
||||
#include "Player.h"
|
||||
|
||||
#define GOSSIP_START_EVENT1a "I am ready."
|
||||
#define GOSSIP_START_EVENT1b "I am ready. However I'd like to skip the pageantry."
|
||||
#define GOSSIP_START_EVENT2 "I'm ready for the next challenge."
|
||||
#define GOSSIP_START_EVENT3 "I'm ready."
|
||||
|
||||
class npc_announcer_toc5 : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_announcer_toc5() : CreatureScript("npc_announcer_toc5") {}
|
||||
|
||||
bool OnGossipHello(Player* pPlayer, Creature* pCreature)
|
||||
{
|
||||
if( !pCreature->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP) )
|
||||
return true;
|
||||
|
||||
InstanceScript* pInstance = pCreature->GetInstanceScript();
|
||||
if( !pInstance )
|
||||
return true;
|
||||
|
||||
uint32 gossipTextId = 0;
|
||||
switch( pInstance->GetData(DATA_INSTANCE_PROGRESS) )
|
||||
{
|
||||
case INSTANCE_PROGRESS_INITIAL:
|
||||
gossipTextId = 14688;
|
||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_START_EVENT1a, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1338);
|
||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_START_EVENT1b, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1341);
|
||||
break;
|
||||
case INSTANCE_PROGRESS_CHAMPIONS_DEAD:
|
||||
gossipTextId = 14737;
|
||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_START_EVENT2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1339);
|
||||
break;
|
||||
case INSTANCE_PROGRESS_ARGENT_CHALLENGE_DIED:
|
||||
gossipTextId = 14738;
|
||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_START_EVENT3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1340);
|
||||
break;
|
||||
default:
|
||||
return true;
|
||||
}
|
||||
|
||||
pPlayer->SEND_GOSSIP_MENU(gossipTextId, pCreature->GetGUID());
|
||||
return true;
|
||||
}
|
||||
|
||||
bool OnGossipSelect(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 uiAction)
|
||||
{
|
||||
if( !pCreature->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP) )
|
||||
return true;
|
||||
|
||||
InstanceScript* pInstance = pCreature->GetInstanceScript();
|
||||
if( !pInstance )
|
||||
return true;
|
||||
|
||||
if( uiAction == GOSSIP_ACTION_INFO_DEF+1338 || uiAction == GOSSIP_ACTION_INFO_DEF+1341 || uiAction == GOSSIP_ACTION_INFO_DEF+1339 || uiAction == GOSSIP_ACTION_INFO_DEF+1340 )
|
||||
{
|
||||
pInstance->SetData(DATA_ANNOUNCER_GOSSIP_SELECT, (uiAction == GOSSIP_ACTION_INFO_DEF+1341 ? 1 : 0));
|
||||
pCreature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
}
|
||||
|
||||
pPlayer->CLOSE_GOSSIP_MENU();
|
||||
return true;
|
||||
}
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new npc_announcer_toc5AI(pCreature);
|
||||
}
|
||||
|
||||
struct npc_announcer_toc5AI : public CreatureAI
|
||||
{
|
||||
npc_announcer_toc5AI(Creature *pCreature) : CreatureAI(pCreature) {}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
InstanceScript* pInstance = me->GetInstanceScript();
|
||||
if( !pInstance )
|
||||
return;
|
||||
if( pInstance->GetData(DATA_TEAMID_IN_INSTANCE) == TEAM_ALLIANCE )
|
||||
me->UpdateEntry(NPC_ARELAS);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); // removed during black knight scene
|
||||
}
|
||||
|
||||
void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
if (damage >= me->GetHealth()) // for bk scene so strangulate doesn't kill him
|
||||
damage = me->GetHealth()-1;
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id)
|
||||
{
|
||||
if (type != EFFECT_MOTION_TYPE)
|
||||
return;
|
||||
InstanceScript* pInstance = me->GetInstanceScript();
|
||||
if( !pInstance )
|
||||
return;
|
||||
if (pInstance->GetData(DATA_INSTANCE_PROGRESS) < INSTANCE_PROGRESS_ARGENT_CHALLENGE_DIED)
|
||||
return;
|
||||
|
||||
Unit::Kill(me, me); // for bk scene, die after knockback
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) {}
|
||||
};
|
||||
};
|
||||
|
||||
void AddSC_trial_of_the_champion()
|
||||
{
|
||||
new npc_announcer_toc5();
|
||||
}
|
||||
@@ -1,222 +0,0 @@
|
||||
/*
|
||||
REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
|
||||
*/
|
||||
|
||||
#ifndef DEF_TOC_H
|
||||
#define DEF_TOC_H
|
||||
|
||||
enum eData
|
||||
{
|
||||
BOSS_GRAND_CHAMPIONS = 0,
|
||||
BOSS_ARGENT_CHALLENGE = 1,
|
||||
BOSS_BLACK_KNIGHT = 2,
|
||||
MAX_ENCOUNTER = 3,
|
||||
DATA_INSTANCE_PROGRESS = 4,
|
||||
|
||||
DATA_ANNOUNCER = 5,
|
||||
DATA_ANNOUNCER_GOSSIP_SELECT,
|
||||
DATA_GRAND_CHAMPION_REACHED_DEST,
|
||||
DATA_MOUNT_DIED,
|
||||
DATA_REACHED_NEW_MOUNT,
|
||||
DATA_GRAND_CHAMPION_PICKED_NEW_VEHICLE,
|
||||
DATA_GRAND_CHAMPION_DIED,
|
||||
DATA_ARGENT_SOLDIER_DEFEATED,
|
||||
DATA_SKELETAL_GRYPHON_LANDED,
|
||||
DATA_TEAMID_IN_INSTANCE,
|
||||
DATA_PALETRESS,
|
||||
DATA_MEMORY_ENTRY,
|
||||
DATA_ACHIEV_IVE_HAD_WORSE,
|
||||
};
|
||||
|
||||
enum eProgress
|
||||
{
|
||||
INSTANCE_PROGRESS_INITIAL = 0,
|
||||
INSTANCE_PROGRESS_GRAND_CHAMPIONS_REACHED_DEST,
|
||||
INSTANCE_PROGRESS_CHAMPION_GROUP_DIED_1,
|
||||
INSTANCE_PROGRESS_CHAMPION_GROUP_DIED_2,
|
||||
INSTANCE_PROGRESS_CHAMPION_GROUP_DIED_3,
|
||||
INSTANCE_PROGRESS_CHAMPIONS_UNMOUNTED,
|
||||
INSTANCE_PROGRESS_CHAMPIONS_DEAD,
|
||||
INSTANCE_PROGRESS_ARGENT_SOLDIERS_DIED,
|
||||
INSTANCE_PROGRESS_ARGENT_CHALLENGE_DIED,
|
||||
INSTANCE_PROGRESS_FINISHED,
|
||||
};
|
||||
|
||||
enum eEvents
|
||||
{
|
||||
EVENT_NULL = 0,
|
||||
EVENT_CHECK_PLAYERS,
|
||||
EVENT_CLOSE_GATE,
|
||||
EVENT_SUMMON_GRAND_CHAMPION_1,
|
||||
EVENT_SUMMON_GRAND_CHAMPION_2,
|
||||
EVENT_SUMMON_GRAND_CHAMPION_3,
|
||||
EVENT_YELL_WELCOME_2,
|
||||
EVENT_GRAND_GROUP_1_MOVE_MIDDLE,
|
||||
EVENT_GRAND_GROUP_1_ATTACK,
|
||||
EVENT_GRAND_GROUP_2_MOVE_MIDDLE,
|
||||
EVENT_GRAND_GROUP_2_ATTACK,
|
||||
EVENT_GRAND_GROUP_3_MOVE_MIDDLE,
|
||||
EVENT_GRAND_GROUP_3_ATTACK,
|
||||
EVENT_GRAND_CHAMPIONS_MOVE_MIDDLE,
|
||||
EVENT_GRAND_CHAMPIONS_MOUNTS_ATTACK,
|
||||
EVENT_GRAND_CHAMPIONS_MOVE_SIDE,
|
||||
EVENT_GRAND_CHAMPIONS_ATTACK,
|
||||
EVENT_GRATZ_SLAIN_CHAMPIONS,
|
||||
EVENT_RESTORE_ANNOUNCER_GOSSIP,
|
||||
EVENT_START_ARGENT_CHALLENGE_INTRO,
|
||||
EVENT_SUMMON_ARGENT_CHALLENGE,
|
||||
EVENT_ARGENT_CHALLENGE_SAY_1,
|
||||
EVENT_ARGENT_CHALLENGE_SAY_2,
|
||||
EVENT_ARGENT_SOLDIER_GROUP_ATTACK,
|
||||
EVENT_ARGENT_CHALLENGE_MOVE_FORWARD,
|
||||
EVENT_ARGENT_CHALLENGE_ATTACK,
|
||||
EVENT_ARGENT_CHALLENGE_RUN_MIDDLE,
|
||||
EVENT_ARGENT_CHALLENGE_LEAVE_CHEST,
|
||||
EVENT_ARGENT_CHALLENGE_DISAPPEAR,
|
||||
EVENT_SUMMON_BLACK_KNIGHT,
|
||||
EVENT_START_BLACK_KNIGHT_SCENE,
|
||||
EVENT_BLACK_KNIGHT_CAST_ANNOUNCER,
|
||||
EVENT_BLACK_KNIGHT_KILL_ANNOUNCER,
|
||||
EVENT_BLACK_KNIGHT_MOVE_FORWARD,
|
||||
EVENT_BLACK_KNIGHT_SAY_TASK,
|
||||
EVENT_BLACK_KNIGHT_ATTACK,
|
||||
};
|
||||
|
||||
enum eNpcs
|
||||
{
|
||||
// Horde Champions
|
||||
NPC_MOKRA = 35572,
|
||||
NPC_ERESSEA = 35569,
|
||||
NPC_RUNOK = 35571,
|
||||
NPC_ZULTORE = 35570,
|
||||
NPC_VISCERI = 35617,
|
||||
|
||||
// Alliance Champions
|
||||
NPC_JACOB = 34705,
|
||||
NPC_AMBROSE = 34702,
|
||||
NPC_COLOSOS = 34701,
|
||||
NPC_JAELYNE = 34657,
|
||||
NPC_LANA = 34703,
|
||||
|
||||
// Grand Champion Minions
|
||||
NPC_IRONFORGE_MINION = 35329,
|
||||
NPC_STORMWIND_MINION = 35328,
|
||||
NPC_GNOMEREGAN_MINION = 35331,
|
||||
NPC_EXODAR_MINION = 35330,
|
||||
NPC_DARNASSUS_MINION = 35332,
|
||||
NPC_ORGRIMMAR_MINION = 35314,
|
||||
NPC_SILVERMOON_MINION = 35326,
|
||||
NPC_THUNDER_BLUFF_MINION = 35325,
|
||||
NPC_SENJIN_MINION = 35323,
|
||||
NPC_UNDERCITY_MINION = 35327,
|
||||
|
||||
NPC_EADRIC = 35119,
|
||||
NPC_EADRIC_H = 35518,
|
||||
NPC_PALETRESS = 34928,
|
||||
NPC_PALETRESS_H = 35517,
|
||||
|
||||
NPC_ARGENT_LIGHTWIELDER = 35309,
|
||||
NPC_ARGENT_MONK = 35305,
|
||||
NPC_PRIESTESS = 35307,
|
||||
|
||||
NPC_BLACK_KNIGHT = 35451,
|
||||
|
||||
NPC_JAEREN = 35004,
|
||||
NPC_ARELAS = 35005,
|
||||
NPC_RISEN_JAEREN = 35545,
|
||||
NPC_RISEN_ARELAS = 35564,
|
||||
NPC_TIRION = 33628,
|
||||
};
|
||||
|
||||
enum eGameObjects
|
||||
{
|
||||
GO_MAIN_GATE = 195647,
|
||||
GO_SOUTH_PORTCULLIS = 195649,
|
||||
GO_EAST_PORTCULLIS = 195648,
|
||||
|
||||
GO_CHAMPIONS_LOOT = 195709,
|
||||
GO_CHAMPIONS_LOOT_H = 195710,
|
||||
|
||||
GO_EADRIC_LOOT = 195374,
|
||||
GO_EADRIC_LOOT_H = 195375,
|
||||
|
||||
GO_PALETRESS_LOOT = 195323,
|
||||
GO_PALETRESS_LOOT_H = 195324,
|
||||
};
|
||||
|
||||
enum eVehicles
|
||||
{
|
||||
VEHICLE_ARGENT_WARHORSE = 35644,
|
||||
VEHICLE_ARGENT_BATTLEWORG = 36558,
|
||||
|
||||
VEHICLE_BLACK_KNIGHT = 35491,
|
||||
};
|
||||
|
||||
enum eTexts
|
||||
{
|
||||
TEXT_LANA_STOUTHAMMER = 1,
|
||||
TEXT_CHEER_LANA_STOUTHAMMER = 2,
|
||||
TEXT_COLOSOS = 3,
|
||||
TEXT_CHEER_COLOSOS = 4,
|
||||
TEXT_EVENSONG = 5,
|
||||
TEXT_CHEER_EVENSONG = 6,
|
||||
TEXT_MARSHAL_JACOB_ALERIUS = 7,
|
||||
TEXT_CHEER_MARSHAL_JACOB_ALERIUS = 8,
|
||||
TEXT_AMBROSE_BOLTSPARK = 9,
|
||||
TEXT_CHEER_AMBROSE_BOLTSPARK = 10,
|
||||
|
||||
TEXT_DEATHSTALKER_VESCERI = 11,
|
||||
TEXT_CHEER_DEATHSTALKER_VESCERI = 12,
|
||||
TEXT_RUNOK_WILDMANE = 13,
|
||||
TEXT_CHEER_RUNOK_WILDMANE = 14,
|
||||
TEXT_ZUL_TORE = 15,
|
||||
TEXT_CHEER_ZUL_TORE = 16,
|
||||
TEXT_MOKRA_SKILLCRUSHER = 17,
|
||||
TEXT_CHEER_MOKRA_SKILLCRUSHER = 18,
|
||||
TEXT_ERESSEA_DAWNSINGER = 19,
|
||||
TEXT_CHEER_ERESSEA_DAWNSINGER = 20,
|
||||
|
||||
TEXT_WELCOME = 21,
|
||||
TEXT_WELCOME_2 = 22,
|
||||
TEXT_BEGIN = 23,
|
||||
TEXT_GRATZ_SLAIN_CHAMPIONS = 24,
|
||||
TEXT_INTRODUCE_EADRIC = 25,
|
||||
TEXT_INTRODUCE_PALETRESS = 26,
|
||||
TEXT_CHEER_EADRIC_1 = 27,
|
||||
TEXT_CHEER_EADRIC_2 = 28,
|
||||
TEXT_EADRIC_SAY_1 = 39,
|
||||
TEXT_CHEER_PALETRESS_1 = 29,
|
||||
TEXT_CHEER_PALETRESS_2 = 30,
|
||||
TEXT_PALETRESS_SAY_1 = 37,
|
||||
TEXT_PALETRESS_SAY_2 = 38,
|
||||
TEXT_YOU_MAY_BEGIN = 41,
|
||||
|
||||
TEXT_BK_INTRO = 31,
|
||||
TEXT_BK_RAFTERS = 32,
|
||||
TEXT_BK_SPOILED = 33,
|
||||
TEXT_BK_MEANING = 34,
|
||||
TEXT_BK_LICH = 35,
|
||||
TEXT_BK_TASK = 36,
|
||||
|
||||
TEXT_EADRIC_AGGRO = 42,
|
||||
TEXT_EADRIC_HAMMER = 43,
|
||||
TEXT_EADRIC_SLAIN_1 = 44,
|
||||
TEXT_EADRIC_SLAIN_2 = 45,
|
||||
TEXT_EADRIC_DEATH = 46,
|
||||
|
||||
TEXT_PALETRESS_AGGRO = 47,
|
||||
TEXT_PALETRESS_MEMORY_SUMMON = 48,
|
||||
TEXT_PALETRESS_MEMORY_DEFEATED = 51,
|
||||
TEXT_PALETRESS_SLAIN_1 = 49,
|
||||
TEXT_PALETRESS_SLAIN_2 = 50,
|
||||
TEXT_PALETRESS_DEATH = 52,
|
||||
|
||||
TEXT_BK_AGGRO = 53,
|
||||
TEXT_BK_SLAIN_1 = 57,
|
||||
TEXT_BK_SLAIN_2 = 58,
|
||||
TEXT_BK_SKELETON_RES = 54,
|
||||
TEXT_BK_GHOST_RES = 55,
|
||||
TEXT_BK_DEATH = 56,
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,964 +0,0 @@
|
||||
/*
|
||||
REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "trial_of_the_crusader.h"
|
||||
#include "SpellScript.h"
|
||||
#include "PassiveAI.h"
|
||||
#include "Player.h"
|
||||
|
||||
enum AnubTexts
|
||||
{
|
||||
SAY_INTRO = 0,
|
||||
SAY_AGGRO = 1,
|
||||
EMOTE_SUBMERGE = 2,
|
||||
EMOTE_BURROWER = 3,
|
||||
SAY_EMERGE = 4,
|
||||
SAY_LEECHING_SWARM = 5,
|
||||
EMOTE_LEECHING_SWARM = 6,
|
||||
SAY_KILL_PLAYER = 7,
|
||||
SAY_DEATH = 8,
|
||||
|
||||
EMOTE_SPIKE = 0,
|
||||
};
|
||||
|
||||
enum AnubNPCs
|
||||
{
|
||||
NPC_FROST_SPHERE = 34606,
|
||||
NPC_BURROW = 34862,
|
||||
NPC_BURROWER = 34607,
|
||||
NPC_SCARAB = 34605,
|
||||
NPC_SPIKE = 34660,
|
||||
};
|
||||
|
||||
const Position AnubLocs[]=
|
||||
{
|
||||
// scarab's beginning pos
|
||||
{722.65f, 135.41f, 142.16f, M_PI},
|
||||
|
||||
// churning ground spawns
|
||||
{694.886353f, 102.484665f, 142.119614f, 0},
|
||||
{731.987244f, 83.3824690f, 142.119614f, 0},
|
||||
{694.500671f, 185.363968f, 142.117905f, 0},
|
||||
{740.184509f, 193.443390f, 142.117584f, 0},
|
||||
|
||||
// sphere spawns
|
||||
{ 786.6439f, 108.2498f, 155.6701f, 0 },
|
||||
{ 806.8429f, 150.5902f, 155.6701f, 0 },
|
||||
{ 759.1386f, 163.9654f, 155.6701f, 0 },
|
||||
{ 744.3701f, 119.5211f, 155.6701f, 0 },
|
||||
{ 710.0211f, 120.8152f, 155.6701f, 0 },
|
||||
{ 706.6383f, 161.5266f, 155.6701f, 0 },
|
||||
};
|
||||
|
||||
class HideNpcEvent : public BasicEvent
|
||||
{
|
||||
public:
|
||||
HideNpcEvent(Creature& owner) : _owner(owner) { }
|
||||
|
||||
bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/)
|
||||
{
|
||||
_owner.SetVisible(false);
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
Creature& _owner;
|
||||
};
|
||||
|
||||
enum AnubSpells
|
||||
{
|
||||
// Anub'arak
|
||||
SPELL_SUBMERGE = 65981,
|
||||
SPELL_EMERGE = 65982,
|
||||
SPELL_BERSERK = 26662,
|
||||
|
||||
SPELL_FREEZING_SLASH = 66012,
|
||||
SPELL_PENETRATING_COLD = 66013,
|
||||
SPELL_SUMMON_SCARAB = 66339,
|
||||
SPELL_SUMMON_BURROWER = 66332,
|
||||
SPELL_LEECHING_SWARM = 66118,
|
||||
|
||||
// Anub'arak Pursue
|
||||
SPELL_MARK = 67574,
|
||||
SPELL_SUMMON_SPIKE = 66169,
|
||||
SPELL_SPIKE_SPEED1 = 65920,
|
||||
SPELL_SPIKE_TRAIL = 65921,
|
||||
SPELL_SPIKE_SPEED2 = 65922,
|
||||
SPELL_SPIKE_SPEED3 = 65923,
|
||||
SPELL_SPIKE_FAIL = 66181,
|
||||
SPELL_SPIKE_TELE = 66170,
|
||||
SPELL_IMPALE = 65919,
|
||||
|
||||
// Scarab
|
||||
SPELL_DETERMINATION = 66092,
|
||||
SPELL_ACID_MANDIBLE = 65774,
|
||||
|
||||
// Burrow
|
||||
SPELL_CHURNING_GROUND = 66969,
|
||||
|
||||
// Frost Sphere
|
||||
SPELL_FROST_SPHERE = 67539,
|
||||
SPELL_PERMAFROST = 66193,
|
||||
SPELL_PERMAFROST_VISUAL = 65882,
|
||||
|
||||
// Burrower
|
||||
SPELL_SPIDER_FRENZY = 66128,
|
||||
SPELL_EXPOSE_WEAKNESS = 67720,
|
||||
SPELL_SHADOW_STRIKE = 66134,
|
||||
SPELL_SUBMERGE_EFFECT = 53421,
|
||||
SPELL_EMERGE_EFFECT = 66947,
|
||||
};
|
||||
|
||||
enum AnubEvents
|
||||
{
|
||||
EVENT_RESPAWN_SPHERE = 1,
|
||||
EVENT_ENRAGE,
|
||||
EVENT_SPELL_FREEZING_SLASH,
|
||||
EVENT_SPELL_PENETRATING_COLD,
|
||||
EVENT_SUMMON_NERUBIAN,
|
||||
EVENT_SUBMERGE,
|
||||
EVENT_EMERGE,
|
||||
EVENT_EMERGE_2,
|
||||
EVENT_SPELL_SUMMON_SPIKE,
|
||||
EVENT_SPELL_SHADOW_STRIKE,
|
||||
EVENT_SUMMON_SCARAB,
|
||||
};
|
||||
|
||||
#define SUBMERGE_INTERVAL 80000
|
||||
#define EMERGE_INTERVAL 60000
|
||||
|
||||
class boss_anubarak_trial : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_anubarak_trial() : CreatureScript("boss_anubarak_trial") {}
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_anubarak_trialAI(pCreature);
|
||||
};
|
||||
|
||||
struct boss_anubarak_trialAI : public ScriptedAI
|
||||
{
|
||||
boss_anubarak_trialAI(Creature* pCreature) : ScriptedAI(pCreature), summons(me)
|
||||
{
|
||||
pInstance = (InstanceScript*)pCreature->GetInstanceScript();
|
||||
events.Reset();
|
||||
bIntro = false;
|
||||
bPhase3 = false;
|
||||
me->ApplySpellImmune(0, IMMUNITY_ID, RAID_MODE(66193,67855,67856,67857), true);
|
||||
me->m_SightDistance = 90.0f; // for MoveInLineOfSight distance
|
||||
}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
SummonList summons;
|
||||
EventMap events;
|
||||
bool bIntro;
|
||||
bool bPhase3;
|
||||
uint64 SphereGUID[6];
|
||||
uint64 BurrowGUID[4];
|
||||
|
||||
void Reset()
|
||||
{
|
||||
me->SetStandState(UNIT_STAND_STATE_SUBMERGED);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
summons.DespawnAll();
|
||||
for( uint8 i=0; i<10; ++i )
|
||||
{
|
||||
float angle = rand_norm()*2*M_PI;
|
||||
float dist = rand_norm()*40.0f;
|
||||
if( Creature* c = me->SummonCreature(NPC_SCARAB, AnubLocs[0].GetPositionX()+cos(angle)*dist, AnubLocs[0].GetPositionY()+sin(angle)*dist, AnubLocs[0].GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000) )
|
||||
{
|
||||
c->setFaction(31);
|
||||
c->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
c->GetMotionMaster()->MoveRandom(15.0f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
switch( param )
|
||||
{
|
||||
case -1:
|
||||
summons.DespawnAll();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
me->setActive(true);
|
||||
events.Reset();
|
||||
events.RescheduleEvent(EVENT_ENRAGE, 600000);
|
||||
events.RescheduleEvent(EVENT_SPELL_FREEZING_SLASH, urand(7000,15000));
|
||||
events.RescheduleEvent(EVENT_SPELL_PENETRATING_COLD, urand(15000,20000));
|
||||
events.RescheduleEvent(EVENT_SUMMON_NERUBIAN, urand(5000,8000));
|
||||
events.RescheduleEvent(EVENT_SUBMERGE, SUBMERGE_INTERVAL);
|
||||
if( !IsHeroic() )
|
||||
events.RescheduleEvent(EVENT_RESPAWN_SPHERE, 4000);
|
||||
|
||||
for( std::list<uint64>::iterator itr = summons.begin(); itr != summons.end(); ++itr )
|
||||
if( Creature* c = pInstance->instance->GetCreature(*itr) )
|
||||
{
|
||||
c->GetMotionMaster()->MoveIdle();
|
||||
c->StopMoving();
|
||||
c->CastSpell(c, SPELL_SUBMERGE, false);
|
||||
c->AI()->DoAction(1);
|
||||
}
|
||||
summons.clear();
|
||||
for( uint8 i=0; i<4; ++i )
|
||||
if( Creature* c = me->SummonCreature(NPC_BURROW, AnubLocs[i+1]) )
|
||||
BurrowGUID[i] = c->GetGUID();
|
||||
for( uint8 i=0; i<6; ++i )
|
||||
if( Creature* c = me->SummonCreature(NPC_FROST_SPHERE, AnubLocs[i+5]) )
|
||||
SphereGUID[i] = c->GetGUID();
|
||||
|
||||
Talk(SAY_AGGRO);
|
||||
DoZoneInCombat();
|
||||
if( pInstance )
|
||||
pInstance->SetData(TYPE_ANUBARAK, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void JustReachedHome()
|
||||
{
|
||||
me->setActive(false);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if( !UpdateVictim() )
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if( me->HasUnitState(UNIT_STATE_CASTING) )
|
||||
return;
|
||||
|
||||
if( !bPhase3 && HealthBelowPct(30) && !me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE) && !me->HasAura(SPELL_SUBMERGE) && !me->HasAura(SPELL_EMERGE) )
|
||||
{
|
||||
bPhase3 = true;
|
||||
events.CancelEvent(EVENT_SUBMERGE);
|
||||
events.CancelEvent(EVENT_EMERGE);
|
||||
events.CancelEvent(EVENT_EMERGE_2);
|
||||
if( !IsHeroic() )
|
||||
events.CancelEvent(EVENT_SUMMON_NERUBIAN);
|
||||
me->CastSpell((Unit*)NULL, SPELL_LEECHING_SWARM, false);
|
||||
Talk(EMOTE_LEECHING_SWARM);
|
||||
Talk(SAY_LEECHING_SWARM);
|
||||
return;
|
||||
}
|
||||
|
||||
switch( events.GetEvent() )
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case EVENT_ENRAGE:
|
||||
{
|
||||
me->CastSpell(me, SPELL_BERSERK, true);
|
||||
events.PopEvent();
|
||||
}
|
||||
break;
|
||||
case EVENT_RESPAWN_SPHERE:
|
||||
{
|
||||
uint8 StartAt = urand(0,5);
|
||||
uint8 i = StartAt;
|
||||
do
|
||||
{
|
||||
if( Creature* c = ObjectAccessor::GetCreature(*me, SphereGUID[i]) )
|
||||
if( !c->HasAura(SPELL_FROST_SPHERE) )
|
||||
{
|
||||
if( Creature* c = me->SummonCreature(NPC_FROST_SPHERE, AnubLocs[i+5]) )
|
||||
SphereGUID[i] = c->GetGUID();
|
||||
break;
|
||||
}
|
||||
i = (i+1)%6;
|
||||
}
|
||||
while( i != StartAt );
|
||||
events.RepeatEvent(4000);
|
||||
}
|
||||
break;
|
||||
case EVENT_SPELL_FREEZING_SLASH:
|
||||
{
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_FREEZING_SLASH, false);
|
||||
events.RepeatEvent(urand(15000,20000));
|
||||
}
|
||||
break;
|
||||
case EVENT_SPELL_PENETRATING_COLD:
|
||||
{
|
||||
me->CastCustomSpell(SPELL_PENETRATING_COLD, SPELLVALUE_MAX_TARGETS, RAID_MODE(2,5,2,5));
|
||||
events.RepeatEvent(18000);
|
||||
}
|
||||
break;
|
||||
case EVENT_SUMMON_NERUBIAN:
|
||||
{
|
||||
me->CastCustomSpell(SPELL_SUMMON_BURROWER, SPELLVALUE_MAX_TARGETS, RAID_MODE(1,2,2,4));
|
||||
events.RepeatEvent(45000);
|
||||
}
|
||||
break;
|
||||
case EVENT_SUBMERGE:
|
||||
{
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
bool berserk = me->HasAura(SPELL_BERSERK);
|
||||
me->RemoveAllAuras();
|
||||
if (berserk)
|
||||
me->CastSpell(me, SPELL_BERSERK, true);
|
||||
Talk(EMOTE_SUBMERGE);
|
||||
Talk(EMOTE_BURROWER);
|
||||
me->CastSpell(me, SPELL_SUBMERGE, false);
|
||||
events.CancelEvent(EVENT_SUMMON_NERUBIAN);
|
||||
events.CancelEvent(EVENT_SPELL_FREEZING_SLASH);
|
||||
events.CancelEvent(EVENT_SPELL_PENETRATING_COLD);
|
||||
events.RescheduleEvent(EVENT_EMERGE, EMERGE_INTERVAL);
|
||||
events.RescheduleEvent(EVENT_SPELL_SUMMON_SPIKE, 2500);
|
||||
events.RescheduleEvent(EVENT_SUMMON_SCARAB, 3000);
|
||||
events.PopEvent();
|
||||
}
|
||||
break;
|
||||
case EVENT_SUMMON_SCARAB:
|
||||
{
|
||||
uint8 i = urand(0,3);
|
||||
if( Creature* c = ObjectAccessor::GetCreature(*me, BurrowGUID[i]) )
|
||||
me->CastSpell(c, SPELL_SUMMON_SCARAB, true);
|
||||
events.RepeatEvent(4000);
|
||||
}
|
||||
break;
|
||||
case EVENT_EMERGE:
|
||||
{
|
||||
me->CastSpell(me, SPELL_SPIKE_TELE, true);
|
||||
summons.DespawnEntry(NPC_SPIKE);
|
||||
events.CancelEvent(EVENT_SUMMON_SCARAB);
|
||||
events.RescheduleEvent(EVENT_EMERGE_2, 2000);
|
||||
events.PopEvent();
|
||||
}
|
||||
break;
|
||||
case EVENT_EMERGE_2:
|
||||
{
|
||||
Talk(SAY_EMERGE);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->setAttackTimer(BASE_ATTACK, 3000);
|
||||
me->RemoveAura(SPELL_SUBMERGE);
|
||||
me->CastSpell(me, SPELL_EMERGE, false);
|
||||
events.RescheduleEvent(EVENT_SUMMON_NERUBIAN, urand(5000,8000));
|
||||
events.RescheduleEvent(EVENT_SPELL_FREEZING_SLASH, urand(7000,15000));
|
||||
events.RescheduleEvent(EVENT_SPELL_PENETRATING_COLD, urand(15000,20000));
|
||||
events.RescheduleEvent(EVENT_SUBMERGE, SUBMERGE_INTERVAL);
|
||||
events.PopEvent();
|
||||
}
|
||||
break;
|
||||
case EVENT_SPELL_SUMMON_SPIKE:
|
||||
me->CastSpell(me, SPELL_SUMMON_SPIKE, true);
|
||||
events.PopEvent();
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
if( !summon )
|
||||
return;
|
||||
|
||||
summons.Summon(summon);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*pKiller*/)
|
||||
{
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
Talk(SAY_DEATH);
|
||||
if( pInstance )
|
||||
pInstance->SetData(TYPE_ANUBARAK, DONE);
|
||||
|
||||
|
||||
Player* plr = NULL;
|
||||
if( !pInstance->instance->GetPlayers().isEmpty() )
|
||||
plr = pInstance->instance->GetPlayers().begin()->GetSource();
|
||||
|
||||
if( !plr )
|
||||
return;
|
||||
|
||||
// remove loot for the other faction (items are invisible for players, done in conditions), so corpse can be skinned
|
||||
for( std::vector<LootItem>::iterator itr = me->loot.items.begin(); itr != me->loot.items.end(); ++itr )
|
||||
if( ItemTemplate const *iProto = sObjectMgr->GetItemTemplate((*itr).itemid) )
|
||||
if( ((iProto->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY) && plr->GetTeamId() != TEAM_HORDE) || ((iProto->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY) && plr->GetTeamId() != TEAM_ALLIANCE) )
|
||||
{
|
||||
(*itr).count = 0;
|
||||
(*itr).is_looted = true;
|
||||
--me->loot.unlootedCount;
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who)
|
||||
{
|
||||
if( who->GetTypeId() == TYPEID_PLAYER )
|
||||
Talk(SAY_KILL_PLAYER);
|
||||
}
|
||||
|
||||
void EnterEvadeMode()
|
||||
{
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
if( pInstance )
|
||||
pInstance->SetData(TYPE_FAILED, 1);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who)
|
||||
{
|
||||
if (who->GetTypeId() != TYPEID_PLAYER || me->GetExactDistSq(who) > 6400.0f) // 80yd*80yd
|
||||
return;
|
||||
|
||||
if (me->getStandState() != UNIT_STAND_STATE_STAND)
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
|
||||
if (!bIntro)
|
||||
{
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
if( !me->IsInCombat() )
|
||||
Talk(SAY_INTRO);
|
||||
bIntro = true;
|
||||
}
|
||||
ScriptedAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
bool CanAIAttack(const Unit* target) const
|
||||
{
|
||||
return target->GetEntry() != NPC_FROST_SPHERE;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class npc_swarm_scarab : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_swarm_scarab() : CreatureScript("npc_swarm_scarab") {}
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new npc_swarm_scarabAI(pCreature);
|
||||
};
|
||||
|
||||
struct npc_swarm_scarabAI : public ScriptedAI
|
||||
{
|
||||
npc_swarm_scarabAI(Creature* pCreature) : ScriptedAI(pCreature) {}
|
||||
|
||||
int32 determinationTimer;
|
||||
int32 despawnTimer;
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if( param == 1 )
|
||||
despawnTimer = 2000;
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
me->SetCorpseDelay(10*60);
|
||||
me->CastSpell(me, SPELL_ACID_MANDIBLE, true);
|
||||
determinationTimer = urand(10000,50000);
|
||||
despawnTimer = 0;
|
||||
if( me->getFaction() == 16 ) // hostile - it's phase 2
|
||||
if( Unit* target = me->SelectNearestTarget(250.0f) )
|
||||
{
|
||||
AttackStart(target);
|
||||
DoZoneInCombat();
|
||||
if( Unit* t = SelectTarget(SELECT_TARGET_RANDOM, 0, 250.0f, true) )
|
||||
{
|
||||
me->AddThreat(t, 20000.0f);
|
||||
AttackStart(t);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
DoZoneInCombat();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if( despawnTimer )
|
||||
{
|
||||
if( despawnTimer <= (int32)diff )
|
||||
{
|
||||
despawnTimer = 0;
|
||||
me->DisappearAndDie();
|
||||
}
|
||||
else
|
||||
despawnTimer -= diff;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if( !UpdateVictim() )
|
||||
return;
|
||||
|
||||
if( determinationTimer <= (int32)diff )
|
||||
{
|
||||
me->CastSpell(me, SPELL_DETERMINATION, false);
|
||||
determinationTimer = urand(20000,60000);
|
||||
}
|
||||
else
|
||||
determinationTimer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
me->CastSpell(me, RAID_MODE(SPELL_TRAITOR_KING_10, SPELL_TRAITOR_KING_25, SPELL_TRAITOR_KING_10, SPELL_TRAITOR_KING_25), true);
|
||||
me->m_Events.AddEvent(new HideNpcEvent(*me), me->m_Events.CalculateTime(5000));
|
||||
}
|
||||
|
||||
bool CanAIAttack(const Unit* target) const
|
||||
{
|
||||
return target->GetEntry() != NPC_FROST_SPHERE && !me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class npc_frost_sphere : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_frost_sphere() : CreatureScript("npc_frost_sphere") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new npc_frost_sphereAI(pCreature);
|
||||
};
|
||||
|
||||
struct npc_frost_sphereAI : public NullCreatureAI
|
||||
{
|
||||
npc_frost_sphereAI(Creature* pCreature) : NullCreatureAI(pCreature)
|
||||
{
|
||||
uint32 ID = 0;
|
||||
if (me->GetMap())
|
||||
switch (me->GetMap()->GetDifficulty())
|
||||
{
|
||||
case RAID_DIFFICULTY_10MAN_NORMAL: ID = 66118; break;
|
||||
case RAID_DIFFICULTY_25MAN_NORMAL: ID = 67630; break;
|
||||
case RAID_DIFFICULTY_10MAN_HEROIC: ID = 68646; break;
|
||||
case RAID_DIFFICULTY_25MAN_HEROIC: ID = 68647; break;
|
||||
}
|
||||
if (ID)
|
||||
me->ApplySpellImmune(0, IMMUNITY_ID, ID, true);
|
||||
|
||||
permafrostTimer = 0;
|
||||
me->CastSpell(me, SPELL_FROST_SPHERE, true);
|
||||
me->GetMotionMaster()->MoveRandom(20.0f);
|
||||
me->SetCorpseDelay(15*60*1000);
|
||||
}
|
||||
|
||||
uint32 permafrostTimer;
|
||||
|
||||
void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
if( me->GetHealth() <= damage )
|
||||
{
|
||||
damage = 0;
|
||||
if( !me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE) )
|
||||
{
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->GetMotionMaster()->MoveIdle();
|
||||
me->GetMotionMaster()->MoveCharge(me->GetPositionX(), me->GetPositionY(), 143.0f, 20.0f);
|
||||
permafrostTimer = 1500;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SpellHit(Unit* caster, const SpellInfo* spell)
|
||||
{
|
||||
if( spell->Id == SPELL_SPIKE_FAIL )
|
||||
{
|
||||
me->RemoveAllAuras();
|
||||
me->DespawnOrUnsummon(1500);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if( permafrostTimer )
|
||||
{
|
||||
if( permafrostTimer <= diff )
|
||||
{
|
||||
permafrostTimer = 0;
|
||||
me->RemoveAurasDueToSpell(SPELL_FROST_SPHERE);
|
||||
me->SetDisplayId(11686);
|
||||
me->SetObjectScale(2.0f);
|
||||
me->UpdatePosition(me->GetPositionX(), me->GetPositionY(), 142.7f, me->GetOrientation(), false);
|
||||
me->SetFacingTo(me->GetOrientation());
|
||||
me->CastSpell(me, SPELL_PERMAFROST_VISUAL, true);
|
||||
me->CastSpell(me, SPELL_PERMAFROST, true);
|
||||
me->SetCanFly(false);
|
||||
}
|
||||
else
|
||||
permafrostTimer -= diff;
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class npc_nerubian_burrower : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_nerubian_burrower() : CreatureScript("npc_nerubian_burrower") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new npc_nerubian_burrowerAI(pCreature);
|
||||
};
|
||||
|
||||
struct npc_nerubian_burrowerAI : public ScriptedAI
|
||||
{
|
||||
npc_nerubian_burrowerAI(Creature* pCreature) : ScriptedAI(pCreature)
|
||||
{
|
||||
// I am summoned by another npc (SPELL_EFFECT_FORCE_CAST), inform Anub'arak
|
||||
if (InstanceScript* pInstance = me->GetInstanceScript())
|
||||
if (uint64 guid = pInstance->GetData64(TYPE_ANUBARAK))
|
||||
if (Creature* anub = pInstance->instance->GetCreature(guid))
|
||||
CAST_AI(boss_anubarak_trial::boss_anubarak_trialAI, anub->AI())->JustSummoned(me);
|
||||
}
|
||||
|
||||
EventMap events;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
me->SetCorpseDelay(10*60);
|
||||
me->CastSpell(me, SPELL_EXPOSE_WEAKNESS, true);
|
||||
me->CastSpell(me, SPELL_SPIDER_FRENZY, true);
|
||||
events.Reset();
|
||||
events.RescheduleEvent(EVENT_SUBMERGE, 30000);
|
||||
if( IsHeroic() )
|
||||
events.RescheduleEvent(EVENT_SPELL_SHADOW_STRIKE, urand(30000,45000));
|
||||
if( Unit* target = me->SelectNearestTarget(250.0f) )
|
||||
{
|
||||
AttackStart(target);
|
||||
DoZoneInCombat();
|
||||
}
|
||||
}
|
||||
|
||||
void SpellHitTarget(Unit* target, const SpellInfo* spell)
|
||||
{
|
||||
if( !target || !spell )
|
||||
return;
|
||||
|
||||
if( spell->Id == SPELL_SHADOW_STRIKE )
|
||||
{
|
||||
float o = target->GetOrientation();
|
||||
if( o >= M_PI )
|
||||
o -= M_PI;
|
||||
else
|
||||
o += M_PI;
|
||||
me->NearTeleportTo(target->GetPositionX()+cos(o)*5.0f, target->GetPositionY()+sin(o)*5.0f, target->GetPositionZ()+0.6f, target->GetOrientation());
|
||||
AttackStart(target);
|
||||
me->GetMotionMaster()->MoveChase(target);
|
||||
events.DelayEvents(3000);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if( !UpdateVictim() )
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if( me->HasUnitState(UNIT_STATE_CASTING) )
|
||||
return;
|
||||
|
||||
switch( events.GetEvent() )
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case EVENT_SPELL_SHADOW_STRIKE:
|
||||
if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 250.0f, true) )
|
||||
me->CastSpell(target, SPELL_SHADOW_STRIKE, false);
|
||||
events.RepeatEvent(urand(30000,45000));
|
||||
break;
|
||||
case EVENT_SUBMERGE:
|
||||
if( HealthBelowPct(80) && !me->HasAura(RAID_MODE(66193,67855,67856,67857)) ) // not having permafrost - allow submerge
|
||||
{
|
||||
me->GetMotionMaster()->MoveIdle();
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->RemoveAllAuras();
|
||||
me->CastSpell(me, SPELL_EXPOSE_WEAKNESS, true);
|
||||
me->CastSpell(me, SPELL_SPIDER_FRENZY, true);
|
||||
me->CastSpell(me, SPELL_SUBMERGE, false);
|
||||
events.PopEvent();
|
||||
events.DelayEvents(15000);
|
||||
events.RescheduleEvent(EVENT_EMERGE, 10000);
|
||||
}
|
||||
else
|
||||
events.RepeatEvent(3000);
|
||||
break;
|
||||
case EVENT_EMERGE:
|
||||
me->SetHealth(me->GetMaxHealth());
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->CastSpell(me, SPELL_EMERGE, false);
|
||||
me->RemoveAura(SPELL_SUBMERGE);
|
||||
events.PopEvent();
|
||||
events.RescheduleEvent(EVENT_SUBMERGE, 30000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
me->m_Events.AddEvent(new HideNpcEvent(*me), me->m_Events.CalculateTime(5000));
|
||||
}
|
||||
|
||||
bool CanAIAttack(const Unit* target) const
|
||||
{
|
||||
return target->GetEntry() != NPC_FROST_SPHERE;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class npc_anubarak_spike : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_anubarak_spike() : CreatureScript("npc_anubarak_spike") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new npc_anubarak_spikeAI(pCreature);
|
||||
};
|
||||
|
||||
struct npc_anubarak_spikeAI : public ScriptedAI
|
||||
{
|
||||
npc_anubarak_spikeAI(Creature* pCreature) : ScriptedAI(pCreature)
|
||||
{
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetCorpseDelay(0);
|
||||
}
|
||||
|
||||
EventMap events;
|
||||
uint64 TargetGUID;
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if( param == -1 )
|
||||
{
|
||||
if( Unit* target = ObjectAccessor::GetPlayer(*me, TargetGUID) )
|
||||
target->RemoveAura(SPELL_MARK);
|
||||
TargetGUID = 0;
|
||||
me->RemoveAllAuras();
|
||||
me->GetMotionMaster()->MoveIdle();
|
||||
events.Reset();
|
||||
events.RescheduleEvent(3, 4000);
|
||||
}
|
||||
}
|
||||
|
||||
void SelectNewTarget(bool next)
|
||||
{
|
||||
if (TargetGUID)
|
||||
if( Unit* target = ObjectAccessor::GetPlayer(*me, TargetGUID) )
|
||||
target->RemoveAura(SPELL_MARK);
|
||||
TargetGUID = 0;
|
||||
if (!next)
|
||||
{
|
||||
events.Reset();
|
||||
me->RemoveAllAuras();
|
||||
}
|
||||
DoZoneInCombat();
|
||||
DoResetThreat();
|
||||
if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 250.0f, true) )
|
||||
{
|
||||
if (!next)
|
||||
{
|
||||
me->CastSpell(me, SPELL_SPIKE_SPEED1, true);
|
||||
me->CastSpell(me, SPELL_SPIKE_TRAIL, true);
|
||||
events.RescheduleEvent(1, 7000);
|
||||
}
|
||||
TargetGUID = target->GetGUID();
|
||||
me->CastSpell(target, SPELL_MARK, true);
|
||||
Talk(EMOTE_SPIKE, target);
|
||||
AttackStart(target);
|
||||
me->GetMotionMaster()->MoveChase(target);
|
||||
}
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
SelectNewTarget(false);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if( TargetGUID )
|
||||
{
|
||||
Unit* target = ObjectAccessor::GetPlayer(*me, TargetGUID);
|
||||
if( !target || !target->HasAura(SPELL_MARK) || !me->IsValidAttackTarget(target) || me->GetMotionMaster()->GetCurrentMovementGeneratorType() != CHASE_MOTION_TYPE || !me->HasUnitState(UNIT_STATE_CHASE_MOVE) )
|
||||
{
|
||||
SelectNewTarget(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
switch( events.GetEvent() )
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case 1:
|
||||
me->CastSpell(me, SPELL_SPIKE_SPEED2, true);
|
||||
events.PopEvent();
|
||||
events.RescheduleEvent(2, 7000);
|
||||
break;
|
||||
case 2:
|
||||
me->CastSpell(me, SPELL_SPIKE_SPEED3, true);
|
||||
events.PopEvent();
|
||||
break;
|
||||
case 3:
|
||||
Reset();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
damage = 0;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class spell_pursuing_spikes : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_pursuing_spikes() : SpellScriptLoader("spell_pursuing_spikes") { }
|
||||
|
||||
class spell_pursuing_spikesAuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_pursuing_spikesAuraScript)
|
||||
|
||||
void HandleEffectPeriodic(AuraEffect const * aurEff)
|
||||
{
|
||||
if( Unit* target = GetTarget() )
|
||||
{
|
||||
if( Creature* c = target->FindNearestCreature(NPC_FROST_SPHERE, 8.0f, true) )
|
||||
{
|
||||
target->UpdatePosition(*c, false);
|
||||
target->CastCustomSpell(SPELL_SPIKE_FAIL, SPELLVALUE_MAX_TARGETS, 1);
|
||||
if( target->GetTypeId() == TYPEID_UNIT )
|
||||
target->ToCreature()->AI()->DoAction(-1);
|
||||
Remove();
|
||||
return;
|
||||
}
|
||||
target->CastSpell((Unit*)NULL, SPELL_IMPALE, true);
|
||||
}
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_pursuing_spikesAuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript *GetAuraScript() const
|
||||
{
|
||||
return new spell_pursuing_spikesAuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
// 66118 Leeching Swarm
|
||||
enum eLeechingSwarmSpells
|
||||
{
|
||||
SPELL_LEECHING_SWARM_DMG = 66240,
|
||||
SPELL_LEECHING_SWARM_HEAL = 66125,
|
||||
};
|
||||
|
||||
class spell_gen_leeching_swarm : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_gen_leeching_swarm() : SpellScriptLoader("spell_gen_leeching_swarm") { }
|
||||
|
||||
class spell_gen_leeching_swarm_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_gen_leeching_swarm_AuraScript);
|
||||
|
||||
bool Validate(SpellInfo const* /*spellEntry*/)
|
||||
{
|
||||
if (!sSpellMgr->GetSpellInfo(SPELL_LEECHING_SWARM_DMG))
|
||||
return false;
|
||||
if (!sSpellMgr->GetSpellInfo(SPELL_LEECHING_SWARM_HEAL))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void HandleEffectPeriodic(AuraEffect const* aurEff)
|
||||
{
|
||||
if (Unit* caster = GetCaster())
|
||||
{
|
||||
int32 lifeLeeched = GetTarget()->CountPctFromCurHealth(aurEff->GetAmount());
|
||||
if (lifeLeeched < 250)
|
||||
lifeLeeched = 250;
|
||||
// Damage
|
||||
caster->CastCustomSpell(GetTarget(), SPELL_LEECHING_SWARM_DMG, &lifeLeeched, 0, 0, true);
|
||||
// Heal is handled in damage spell. It has to heal the same amount, but some of the dmg can be resisted.
|
||||
}
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_leeching_swarm_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_gen_leeching_swarm_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_gen_leeching_swarm_dmg : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_gen_leeching_swarm_dmg() : SpellScriptLoader("spell_gen_leeching_swarm_dmg") {}
|
||||
|
||||
class spell_gen_leeching_swarm_dmg_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_gen_leeching_swarm_dmg_SpellScript);
|
||||
|
||||
void HandleAfterHit()
|
||||
{
|
||||
if (Unit* caster = GetCaster())
|
||||
if (GetHitDamage() > 0)
|
||||
{
|
||||
int32 damage = GetHitDamage();
|
||||
caster->CastCustomSpell(caster, SPELL_LEECHING_SWARM_HEAL, &damage, 0, 0, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterHit += SpellHitFn(spell_gen_leeching_swarm_dmg_SpellScript::HandleAfterHit);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_gen_leeching_swarm_dmg_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_anubarak_trial()
|
||||
{
|
||||
new boss_anubarak_trial();
|
||||
new npc_swarm_scarab();
|
||||
new npc_frost_sphere();
|
||||
new npc_nerubian_burrower();
|
||||
new npc_anubarak_spike();
|
||||
new spell_pursuing_spikes();
|
||||
new spell_gen_leeching_swarm();
|
||||
new spell_gen_leeching_swarm_dmg();
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,507 +0,0 @@
|
||||
/*
|
||||
REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "trial_of_the_crusader.h"
|
||||
#include "SpellScript.h"
|
||||
#include "SpellAuras.h"
|
||||
|
||||
enum JaraxxusTexts
|
||||
{
|
||||
SAY_INTRO = 0,
|
||||
SAY_AGGRO = 1,
|
||||
EMOTE_LEGION_FLAME = 2,
|
||||
EMOTE_NETHER_PORTAL = 3,
|
||||
SAY_MISTRESS_OF_PAIN = 4,
|
||||
EMOTE_INCINERATE = 5,
|
||||
SAY_INCINERATE = 6,
|
||||
EMOTE_INFERNAL_ERUPTION = 7,
|
||||
SAY_INFERNAL_ERUPTION = 8,
|
||||
SAY_KILL_PLAYER = 9,
|
||||
SAY_DEATH = 10,
|
||||
SAY_BERSERK = 11,
|
||||
};
|
||||
|
||||
enum JaraxxusNPCs
|
||||
{
|
||||
NPC_LEGION_FLAME = 34784,
|
||||
NPC_INFERNAL_VOLCANO = 34813,
|
||||
NPC_FEL_INFERNAL = 34815,
|
||||
NPC_NETHER_PORTAL = 34825,
|
||||
NPC_MISTRESS_OF_PAIN = 34826,
|
||||
};
|
||||
|
||||
enum JaraxxusSpells
|
||||
{
|
||||
SPELL_NETHER_POWER = 66228,
|
||||
SPELL_INCINERATE_FLESH = 66237,
|
||||
SPELL_FEL_FIREBALL = 66532,
|
||||
SPELL_FEL_LIGHTNING = 66528,
|
||||
SPELL_TOUCH_OF_JARAXXUS = 66209,
|
||||
SPELL_LEGION_FLAME = 66197,
|
||||
SPELL_LEGION_FLAME_NPC_AURA = 66201,
|
||||
SPELL_SUMMON_VOLCANO = 66258,
|
||||
SPELL_SUMMON_NETHER_PORTAL = 66269,
|
||||
|
||||
SPELL_FEL_STEAK = 66494,
|
||||
SPELL_FEL_STEAK_MORPH = 66493,
|
||||
|
||||
SPELL_SHIVAN_SLASH = 66378,
|
||||
SPELL_SPINNING_PAIN_SPIKE = 66283,
|
||||
SPELL_MISTRESS_KISS = 66336,
|
||||
SPELL_MISTRESS_KISS_PERIODIC_DUMMY = 66334, // also 67905, 67906, 67907
|
||||
SPELL_MISTRESS_KISS_INTERRUPT = 66359,
|
||||
|
||||
SPELL_CHAINS = 67924,
|
||||
SPELL_BERSERK = 64238,
|
||||
};
|
||||
|
||||
enum JaraxxusEvents
|
||||
{
|
||||
EVENT_SPELL_FEL_FIREBALL = 1,
|
||||
EVENT_SPELL_FEL_LIGHTNING,
|
||||
EVENT_SPELL_INCINERATE_FLESH,
|
||||
EVENT_SPELL_NETHER_POWER,
|
||||
EVENT_SPELL_LEGION_FLAME,
|
||||
EVENT_SPELL_TOUCH_OF_JARAXXUS,
|
||||
EVENT_SUMMON_VOLCANO,
|
||||
EVENT_SUMMON_NETHER_PORTAL,
|
||||
|
||||
EVENT_SPELL_FEL_STEAK,
|
||||
|
||||
EVENT_SPELL_SHIVAN_SLASH,
|
||||
EVENT_SPELL_SPINNING_PAIN_SPIKE,
|
||||
EVENT_SPELL_MISTRESS_KISS,
|
||||
};
|
||||
|
||||
|
||||
class boss_jaraxxus : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_jaraxxus() : CreatureScript("boss_jaraxxus") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_jaraxxusAI(pCreature);
|
||||
}
|
||||
|
||||
struct boss_jaraxxusAI : public ScriptedAI
|
||||
{
|
||||
boss_jaraxxusAI(Creature* pCreature) : ScriptedAI(pCreature), summons(pCreature)
|
||||
{
|
||||
pInstance = pCreature->GetInstanceScript();
|
||||
me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
if( pInstance )
|
||||
pInstance->SetData(TYPE_JARAXXUS, NOT_STARTED);
|
||||
|
||||
// checked for safety
|
||||
while( Creature* c = me->FindNearestCreature(NPC_INFERNAL_VOLCANO, 500.0f, true) )
|
||||
c->DespawnOrUnsummon();
|
||||
while( Creature* c = me->FindNearestCreature(NPC_NETHER_PORTAL, 500.0f, true) )
|
||||
c->DespawnOrUnsummon();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
me->setActive(true);
|
||||
events.Reset();
|
||||
events.RescheduleEvent(EVENT_SPELL_FEL_FIREBALL, 5000);
|
||||
events.RescheduleEvent(EVENT_SPELL_FEL_LIGHTNING, urand(10000,15000));
|
||||
events.RescheduleEvent(EVENT_SPELL_INCINERATE_FLESH, urand(24000,26000));
|
||||
events.RescheduleEvent(EVENT_SPELL_NETHER_POWER, urand(25000,45000));
|
||||
events.RescheduleEvent(EVENT_SPELL_LEGION_FLAME, 30000);
|
||||
//if( GetDifficulty() == RAID_DIFFICULTY_25MAN_HEROIC )
|
||||
// events.RescheduleEvent(EVENT_SPELL_TOUCH_OF_JARAXXUS, urand(10000,15000));
|
||||
events.RescheduleEvent(EVENT_SUMMON_NETHER_PORTAL, 20000); // it schedules EVENT_SUMMON_VOLCANO
|
||||
|
||||
me->RemoveAura(SPELL_CHAINS);
|
||||
Talk(SAY_AGGRO);
|
||||
DoZoneInCombat();
|
||||
if( pInstance )
|
||||
pInstance->SetData(TYPE_JARAXXUS, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void SpellHit(Unit* caster, const SpellInfo* spell)
|
||||
{
|
||||
switch( spell->Id )
|
||||
{
|
||||
case 66228:
|
||||
case 67106:
|
||||
case 67107:
|
||||
case 67108:
|
||||
if( Aura* a = me->GetAura(spell->Id) )
|
||||
a->SetStackAmount(spell->StackAmount);
|
||||
break;
|
||||
case 30449:
|
||||
{
|
||||
if( !caster )
|
||||
return;
|
||||
uint32 id = 0;
|
||||
switch( me->GetMap()->GetDifficulty() )
|
||||
{
|
||||
case 0: id = 66228; break;
|
||||
case 1: id = 67106; break;
|
||||
case 2: id = 67107; break;
|
||||
case 3: id = 67108; break;
|
||||
}
|
||||
if( Aura* a = me->GetAura(id) )
|
||||
{
|
||||
if( a->GetStackAmount() > 1 )
|
||||
a->ModStackAmount(-1);
|
||||
else
|
||||
a->Remove();
|
||||
caster->CastSpell(caster, SPELL_NETHER_POWER, true);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if( !UpdateVictim() )
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if( me->HasUnitState(UNIT_STATE_CASTING) )
|
||||
return;
|
||||
|
||||
switch( events.GetEvent() )
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case EVENT_SPELL_FEL_FIREBALL:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_FEL_FIREBALL, false);
|
||||
events.RepeatEvent(urand(10000,15000));
|
||||
break;
|
||||
case EVENT_SPELL_FEL_LIGHTNING:
|
||||
if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true) )
|
||||
me->CastSpell(target, SPELL_FEL_LIGHTNING, false);
|
||||
events.RepeatEvent(urand(10000,15000));
|
||||
break;
|
||||
case EVENT_SPELL_INCINERATE_FLESH:
|
||||
if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true) )
|
||||
{
|
||||
Talk(EMOTE_INCINERATE, target);
|
||||
Talk(SAY_INCINERATE);
|
||||
me->CastSpell(target, SPELL_INCINERATE_FLESH, false);
|
||||
}
|
||||
events.RepeatEvent(urand(20000,25000));
|
||||
break;
|
||||
case EVENT_SPELL_NETHER_POWER:
|
||||
me->CastSpell(me, SPELL_NETHER_POWER, false);
|
||||
events.DelayEvents(5000);
|
||||
events.RepeatEvent(urand(25000,45000));
|
||||
break;
|
||||
case EVENT_SPELL_LEGION_FLAME:
|
||||
if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true) )
|
||||
{
|
||||
Talk(EMOTE_LEGION_FLAME, target);
|
||||
me->CastSpell(target, SPELL_LEGION_FLAME, false);
|
||||
}
|
||||
events.RepeatEvent(30000);
|
||||
break;
|
||||
case EVENT_SPELL_TOUCH_OF_JARAXXUS:
|
||||
if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true) )
|
||||
me->CastSpell(target, SPELL_TOUCH_OF_JARAXXUS, false);
|
||||
events.RepeatEvent(urand(10000,15000));
|
||||
break;
|
||||
case EVENT_SUMMON_NETHER_PORTAL:
|
||||
Talk(EMOTE_NETHER_PORTAL);
|
||||
Talk(SAY_MISTRESS_OF_PAIN);
|
||||
me->CastSpell((Unit*)NULL, SPELL_SUMMON_NETHER_PORTAL, false);
|
||||
events.PopEvent();
|
||||
events.RescheduleEvent(EVENT_SUMMON_VOLCANO, 60000);
|
||||
break;
|
||||
case EVENT_SUMMON_VOLCANO:
|
||||
Talk(EMOTE_INFERNAL_ERUPTION);
|
||||
Talk(SAY_INFERNAL_ERUPTION);
|
||||
me->CastSpell((Unit*)NULL, SPELL_SUMMON_VOLCANO, false);
|
||||
events.PopEvent();
|
||||
events.RescheduleEvent(EVENT_SUMMON_NETHER_PORTAL, 60000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*pKiller*/)
|
||||
{
|
||||
summons.DespawnAll();
|
||||
Talk(SAY_DEATH);
|
||||
if( pInstance )
|
||||
pInstance->SetData(TYPE_JARAXXUS, DONE);
|
||||
}
|
||||
|
||||
void JustReachedHome()
|
||||
{
|
||||
me->setActive(false);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
}
|
||||
|
||||
void EnterEvadeMode()
|
||||
{
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
if( pInstance )
|
||||
pInstance->SetData(TYPE_FAILED, 1);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* /*who*/) {}
|
||||
};
|
||||
};
|
||||
|
||||
class npc_fel_infernal : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_fel_infernal() : CreatureScript("npc_fel_infernal") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new npc_fel_infernalAI(pCreature);
|
||||
}
|
||||
|
||||
struct npc_fel_infernalAI : public ScriptedAI
|
||||
{
|
||||
npc_fel_infernalAI(Creature* pCreature) : ScriptedAI(pCreature) {}
|
||||
|
||||
EventMap events;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
if( Unit* target = me->SelectNearestTarget(200.0f) )
|
||||
{
|
||||
AttackStart(target);
|
||||
DoZoneInCombat();
|
||||
}
|
||||
events.Reset();
|
||||
events.RescheduleEvent(EVENT_SPELL_FEL_STEAK, urand(7000,20000));
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if( !UpdateVictim() )
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if( me->HasUnitState(UNIT_STATE_CASTING) )
|
||||
return;
|
||||
|
||||
switch( events.GetEvent() )
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case EVENT_SPELL_FEL_STEAK:
|
||||
if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 44.0f, true) )
|
||||
{
|
||||
DoResetThreat();
|
||||
me->AddThreat(target, 50000.0f);
|
||||
me->CastSpell(target, SPELL_FEL_STEAK_MORPH, true);
|
||||
me->CastSpell(target, SPELL_FEL_STEAK, true);
|
||||
events.RepeatEvent(30000);
|
||||
}
|
||||
else
|
||||
events.RepeatEvent(5000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
me->DespawnOrUnsummon(10000);
|
||||
}
|
||||
|
||||
void EnterEvadeMode()
|
||||
{
|
||||
me->DespawnOrUnsummon();
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
class npc_mistress_of_pain : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_mistress_of_pain() : CreatureScript("npc_mistress_of_pain") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new npc_mistress_of_painAI(pCreature);
|
||||
}
|
||||
|
||||
struct npc_mistress_of_painAI : public ScriptedAI
|
||||
{
|
||||
npc_mistress_of_painAI(Creature* pCreature) : ScriptedAI(pCreature) {}
|
||||
|
||||
EventMap events;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
if( Unit* target = me->SelectNearestTarget(200.0f) )
|
||||
{
|
||||
AttackStart(target);
|
||||
DoZoneInCombat();
|
||||
}
|
||||
events.Reset();
|
||||
events.RescheduleEvent(EVENT_SPELL_SHIVAN_SLASH, urand(10000,20000));
|
||||
events.RescheduleEvent(EVENT_SPELL_SPINNING_PAIN_SPIKE, urand(22000,30000));
|
||||
if( IsHeroic() )
|
||||
events.RescheduleEvent(EVENT_SPELL_MISTRESS_KISS, urand(10000,15000));
|
||||
}
|
||||
|
||||
void SpellHit(Unit* caster, const SpellInfo* spell)
|
||||
{
|
||||
//if (caster && spell && spell->Id == 66287 /*control vehicle*/)
|
||||
// caster->ClearUnitState(UNIT_STATE_ONVEHICLE);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if( !UpdateVictim() )
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if( me->HasUnitState(UNIT_STATE_CASTING) )
|
||||
return;
|
||||
|
||||
switch( events.GetEvent() )
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case EVENT_SPELL_SHIVAN_SLASH:
|
||||
if( me->GetVictim() )
|
||||
me->CastSpell(me->GetVictim(), SPELL_SHIVAN_SLASH, false);
|
||||
events.RepeatEvent(urand(15000,25000));
|
||||
break;
|
||||
case EVENT_SPELL_SPINNING_PAIN_SPIKE:
|
||||
if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 140.0f, true) )
|
||||
me->CastSpell(target, SPELL_SPINNING_PAIN_SPIKE, false);
|
||||
events.RepeatEvent(urand(25000,30000));
|
||||
break;
|
||||
case EVENT_SPELL_MISTRESS_KISS:
|
||||
me->CastSpell((Unit*)NULL, SPELL_MISTRESS_KISS, false);
|
||||
events.RepeatEvent(urand(25000,35000));
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
me->DespawnOrUnsummon(10000);
|
||||
}
|
||||
|
||||
void EnterEvadeMode()
|
||||
{
|
||||
me->DespawnOrUnsummon();
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
class spell_toc25_mistress_kiss : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_toc25_mistress_kiss() : SpellScriptLoader("spell_toc25_mistress_kiss") { }
|
||||
|
||||
class spell_toc25_mistress_kiss_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_toc25_mistress_kiss_AuraScript)
|
||||
|
||||
void HandleEffectPeriodic(AuraEffect const * aurEff)
|
||||
{
|
||||
if (Unit* caster = GetCaster())
|
||||
if (Unit* target = GetTarget())
|
||||
if( target->HasUnitState(UNIT_STATE_CASTING) )
|
||||
{
|
||||
caster->CastSpell(target, 66359, true);
|
||||
SetDuration(0);
|
||||
}
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_toc25_mistress_kiss_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript *GetAuraScript() const
|
||||
{
|
||||
return new spell_toc25_mistress_kiss_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_mistress_kiss_area : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_mistress_kiss_area() : SpellScriptLoader("spell_mistress_kiss_area") {}
|
||||
|
||||
class spell_mistress_kiss_area_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_mistress_kiss_area_SpellScript)
|
||||
|
||||
void FilterTargets(std::list<WorldObject*>& targets)
|
||||
{
|
||||
// get a list of players with mana
|
||||
targets.remove_if(Trinity::ObjectTypeIdCheck(TYPEID_PLAYER, false));
|
||||
targets.remove_if(Trinity::PowerCheck(POWER_MANA, false));
|
||||
if (targets.empty())
|
||||
return;
|
||||
|
||||
WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets);
|
||||
targets.clear();
|
||||
targets.push_back(target);
|
||||
}
|
||||
|
||||
void HandleScript(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mistress_kiss_area_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
|
||||
OnEffectHitTarget += SpellEffectFn(spell_mistress_kiss_area_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const
|
||||
{
|
||||
return new spell_mistress_kiss_area_SpellScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_jaraxxus()
|
||||
{
|
||||
new boss_jaraxxus();
|
||||
new npc_fel_infernal();
|
||||
new npc_mistress_of_pain();
|
||||
new spell_toc25_mistress_kiss();
|
||||
new spell_mistress_kiss_area();
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,909 +0,0 @@
|
||||
/*
|
||||
REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
|
||||
(!) ACTUALLY FJOLA CONTROLLS THE WHOLE FIGHT (SPECIAL ABILITIES, SHARED HEALTH, ETC.) SINCE THEY DIE SIMULTANEOUSLY
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptedGossip.h"
|
||||
#include "trial_of_the_crusader.h"
|
||||
#include "SpellScript.h"
|
||||
#include "PassiveAI.h"
|
||||
#include "SpellAuras.h"
|
||||
#include "Player.h"
|
||||
|
||||
enum Yells
|
||||
{
|
||||
SAY_AGGRO = 0,
|
||||
SAY_NIGHT = 2,
|
||||
SAY_LIGHT = 1,
|
||||
EMOTE_VORTEX = 3,
|
||||
EMOTE_TWINK_PACT = 4,
|
||||
SAY_TWINK_PACT = 5,
|
||||
SAY_KILL_PLAYER_1 = 6,
|
||||
SAY_BERSERK = 7,
|
||||
SAY_DEATH = 8,
|
||||
SAY_KILL_PLAYER_2 = 9,
|
||||
};
|
||||
|
||||
enum Equipment
|
||||
{
|
||||
EQUIP_MAIN_1 = 49303,
|
||||
EQUIP_OFFHAND_1 = 47146,
|
||||
EQUIP_RANGED_1 = 47267,
|
||||
EQUIP_MAIN_2 = 45990,
|
||||
EQUIP_OFFHAND_2 = 47470,
|
||||
EQUIP_RANGED_2 = 47267,
|
||||
};
|
||||
|
||||
enum ValkyrNPCs
|
||||
{
|
||||
NPC_DARK_ESSENCE = 34567,
|
||||
NPC_LIGHT_ESSENCE = 34568,
|
||||
NPC_CONCENTRATED_DARK = 34628,
|
||||
NPC_CONCENTRATED_LIGHT= 34630,
|
||||
};
|
||||
|
||||
enum ValkyrSpells
|
||||
{
|
||||
SPELL_LIGHT_ESSENCE = 65686,
|
||||
SPELL_LIGHT_ESSENCE_2 = 65811,
|
||||
SPELL_DARK_ESSENCE = 65684,
|
||||
SPELL_DARK_ESSENCE_2 = 65827,
|
||||
|
||||
SPELL_UNLEASHED_DARK = 65808,
|
||||
SPELL_UNLEASHED_LIGHT = 65795,
|
||||
SPELL_POWERING_UP = 67590,
|
||||
SPELL_EMPOWERED_DARK = 65724,
|
||||
SPELL_EMPOWERED_LIGHT = 65748,
|
||||
SPELL_SURGE_OF_SPEED = 65828,
|
||||
|
||||
SPELL_LIGHT_TWIN_SPIKE = 66075,
|
||||
SPELL_LIGHT_SURGE = 65766,
|
||||
SPELL_LIGHT_SHIELD = 65858,
|
||||
SPELL_LIGHT_TWIN_PACT = 65876,
|
||||
SPELL_LIGHT_VORTEX = 66046,
|
||||
SPELL_LIGHT_TOUCH = 67297,
|
||||
|
||||
SPELL_DARK_TWIN_SPIKE = 66069,
|
||||
SPELL_DARK_SURGE = 65768,
|
||||
SPELL_DARK_SHIELD = 65874,
|
||||
SPELL_DARK_TWIN_PACT = 65875,
|
||||
SPELL_DARK_VORTEX = 66058,
|
||||
SPELL_DARK_TOUCH = 67282,
|
||||
|
||||
SPELL_TWIN_POWER = 65916,
|
||||
SPELL_BERSERK = 64238,
|
||||
};
|
||||
|
||||
enum ValkyrEvents
|
||||
{
|
||||
EVENT_BERSERK = 1,
|
||||
EVENT_SUMMON_BALLS_1,
|
||||
EVENT_SUMMON_BALLS_2,
|
||||
EVENT_SUMMON_BALLS_3,
|
||||
EVENT_SPELL_SPIKE,
|
||||
EVENT_SPELL_TOUCH,
|
||||
EVENT_SPECIAL,
|
||||
EVENT_REMOVE_DUAL_WIELD,
|
||||
};
|
||||
|
||||
struct boss_twin_valkyrAI : public ScriptedAI
|
||||
{
|
||||
boss_twin_valkyrAI(Creature* pCreature) : ScriptedAI(pCreature), summons(me)
|
||||
{
|
||||
pInstance = pCreature->GetInstanceScript();
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetModifierValue(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_PCT, 1.0f);
|
||||
me->UpdateDamagePhysical(OFF_ATTACK);
|
||||
LastSynchroHP = (int32)me->GetMaxHealth();
|
||||
SpecialMask = 0;
|
||||
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_HASTE_SPELLS, true);
|
||||
|
||||
events.Reset();
|
||||
if( me->GetEntry() == NPC_LIGHTBANE )
|
||||
{
|
||||
if( pInstance )
|
||||
pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, 21853);
|
||||
|
||||
// special events here
|
||||
events.RescheduleEvent(EVENT_BERSERK, IsHeroic() ? 360000 : 600000);
|
||||
events.RescheduleEvent(EVENT_SUMMON_BALLS_1, urand(10000,15000));
|
||||
events.RescheduleEvent(EVENT_SPECIAL, 45000);
|
||||
}
|
||||
events.RescheduleEvent(EVENT_SPELL_SPIKE, urand(5000,8000));
|
||||
if( IsHeroic() )
|
||||
events.RescheduleEvent(EVENT_SPELL_TOUCH, urand(10000,25000), 1);
|
||||
|
||||
me->SetDisableGravity(true);
|
||||
me->SetHover(true);
|
||||
me->SetCanFly(true);
|
||||
}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
SummonList summons;
|
||||
EventMap events;
|
||||
int32 LastSynchroHP;
|
||||
uint8 SpecialMask;
|
||||
|
||||
void DoAction(int32 a)
|
||||
{
|
||||
switch( a )
|
||||
{
|
||||
case -1:
|
||||
summons.DespawnAll();
|
||||
if( pInstance && me->GetEntry() == NPC_LIGHTBANE )
|
||||
{
|
||||
uint32 essenceId1 = 0, empoweredId1 = 0, touchId1 = 0, essenceId2 = 0, empoweredId2 = 0, touchId2 = 0;
|
||||
switch( me->GetMap()->GetDifficulty() )
|
||||
{
|
||||
case 0:
|
||||
essenceId1 = 65684;
|
||||
empoweredId1 = 65724;
|
||||
touchId1 = 65950;
|
||||
essenceId2 = 65686;
|
||||
empoweredId2 = 65748;
|
||||
touchId2 = 66001;
|
||||
break;
|
||||
case 1:
|
||||
essenceId1 = 67176;
|
||||
empoweredId1 = 67213;
|
||||
touchId1 = 67296;
|
||||
essenceId2 = 67222;
|
||||
empoweredId2 = 67216;
|
||||
touchId2 = 67281;
|
||||
break;
|
||||
case 2:
|
||||
essenceId1 = 67177;
|
||||
empoweredId1 = 67214;
|
||||
touchId1 = 67297;
|
||||
essenceId2 = 67223;
|
||||
empoweredId2 = 67217;
|
||||
touchId2 = 67282;
|
||||
break;
|
||||
case 3:
|
||||
essenceId1 = 67178;
|
||||
empoweredId1 = 67215;
|
||||
touchId1 = 67298;
|
||||
essenceId2 = 67224;
|
||||
empoweredId2 = 67218;
|
||||
touchId2 = 67283;
|
||||
break;
|
||||
}
|
||||
pInstance->DoRemoveAurasDueToSpellOnPlayers(essenceId1);
|
||||
pInstance->DoRemoveAurasDueToSpellOnPlayers(empoweredId1);
|
||||
pInstance->DoRemoveAurasDueToSpellOnPlayers(touchId1);
|
||||
pInstance->DoRemoveAurasDueToSpellOnPlayers(essenceId2);
|
||||
pInstance->DoRemoveAurasDueToSpellOnPlayers(empoweredId2);
|
||||
pInstance->DoRemoveAurasDueToSpellOnPlayers(touchId2);
|
||||
}
|
||||
break;
|
||||
case -3:
|
||||
me->SetCanDualWield(true);
|
||||
me->CastSpell(me, SPELL_TWIN_POWER, true);
|
||||
events.RescheduleEvent(EVENT_REMOVE_DUAL_WIELD, 15000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Creature* GetSister()
|
||||
{
|
||||
return ObjectAccessor::GetCreature(*me, pInstance->GetData64(me->GetEntry()==NPC_DARKBANE ? NPC_LIGHTBANE : NPC_DARKBANE));
|
||||
}
|
||||
|
||||
/*void AttackStart(Unit* victim)
|
||||
{
|
||||
if( victim && me->Attack(victim, true) )
|
||||
me->GetMotionMaster()->MoveChase(victim, 0.0f, 0.0f, 6.0f);
|
||||
}*/
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
me->setActive(true);
|
||||
me->LowerPlayerDamageReq(me->GetMaxHealth());
|
||||
DoZoneInCombat();
|
||||
if( Creature* twin = GetSister() )
|
||||
if( !twin->IsInCombat() )
|
||||
if( Unit* target = twin->SelectNearestTarget(200.0f) )
|
||||
twin->AI()->AttackStart(target);
|
||||
|
||||
Talk(SAY_AGGRO);
|
||||
me->CastSpell(me, me->GetEntry() == NPC_LIGHTBANE ? SPELL_LIGHT_SURGE : SPELL_DARK_SURGE, true);
|
||||
|
||||
if( pInstance && me->GetEntry() == NPC_LIGHTBANE )
|
||||
pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, 21853);
|
||||
}
|
||||
|
||||
void JustReachedHome()
|
||||
{
|
||||
me->setActive(false);
|
||||
}
|
||||
|
||||
void myDoMeleeAttackIfReady()
|
||||
{
|
||||
DoMeleeAttackIfReady();
|
||||
return;
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
Unit *victim = me->GetVictim();
|
||||
if (!victim || !victim->IsInWorld())
|
||||
return;
|
||||
|
||||
float allowedDist = sqrt(MELEE_RANGE * MELEE_RANGE + 6.0f * 6.0f);
|
||||
if (!me->IsWithinMeleeRange(victim, allowedDist))
|
||||
return;
|
||||
|
||||
if (me->isAttackReady())
|
||||
{
|
||||
me->AttackerStateUpdate(victim);
|
||||
me->resetAttackTimer();
|
||||
}
|
||||
|
||||
if (me->haveOffhandWeapon() && me->isAttackReady(OFF_ATTACK))
|
||||
{
|
||||
me->AttackerStateUpdate(victim, OFF_ATTACK);
|
||||
me->resetAttackTimer(OFF_ATTACK);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateSharedHealth()
|
||||
{
|
||||
// lightbane synchronizes
|
||||
if( me->GetEntry() == NPC_LIGHTBANE )
|
||||
if( Creature* twin = GetSister() )
|
||||
if( twin->IsAlive() && me->IsAlive() )
|
||||
{
|
||||
int32 d = CAST_AI(boss_twin_valkyrAI, twin->AI())->LastSynchroHP - (int32)twin->GetHealth();
|
||||
int32 newhealth = (int32)me->GetHealth() - d;
|
||||
if( newhealth <= 0 )
|
||||
newhealth = 1;
|
||||
me->SetHealth( (uint32)newhealth );
|
||||
twin->SetHealth(me->GetHealth());
|
||||
CAST_AI(boss_twin_valkyrAI, twin->AI())->LastSynchroHP = (int32)twin->GetHealth();
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if( !UpdateVictim() )
|
||||
return;
|
||||
|
||||
UpdateSharedHealth();
|
||||
events.Update(diff);
|
||||
|
||||
if( me->HasUnitState(UNIT_STATE_CASTING) )
|
||||
return;
|
||||
|
||||
switch( events.GetEvent() )
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case EVENT_BERSERK:
|
||||
me->CastSpell(me, SPELL_BERSERK, true);
|
||||
Talk(SAY_BERSERK);
|
||||
if( Creature* twin = GetSister() )
|
||||
{
|
||||
twin->CastSpell(twin, SPELL_BERSERK, true);
|
||||
twin->AI()->Talk(SAY_BERSERK);
|
||||
}
|
||||
events.PopEvent();
|
||||
break;
|
||||
case EVENT_SUMMON_BALLS_1:
|
||||
case EVENT_SUMMON_BALLS_2:
|
||||
case EVENT_SUMMON_BALLS_3:
|
||||
{
|
||||
uint8 eventId = events.GetEvent();
|
||||
uint8 count = 0;
|
||||
if( IsHeroic() )
|
||||
count = eventId==EVENT_SUMMON_BALLS_3 ? 36 : 6;
|
||||
else
|
||||
count = eventId==EVENT_SUMMON_BALLS_3 ? 24 : 4;
|
||||
for( uint8 i=0; i<count; ++i )
|
||||
{
|
||||
float angle = rand_norm()*2*M_PI;
|
||||
if( Creature* ball = me->SummonCreature((i%2) ? NPC_CONCENTRATED_DARK : NPC_CONCENTRATED_LIGHT, Locs[LOC_CENTER].GetPositionX()+cos(angle)*47.0f, Locs[LOC_CENTER].GetPositionY()+sin(angle)*47.0f, Locs[LOC_CENTER].GetPositionZ()+1.5f, 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1500) )
|
||||
boss_twin_valkyrAI::JustSummoned(ball);
|
||||
}
|
||||
events.PopEvent();
|
||||
switch( eventId )
|
||||
{
|
||||
case EVENT_SUMMON_BALLS_1:
|
||||
events.RescheduleEvent(EVENT_SUMMON_BALLS_2, 8000);
|
||||
break;
|
||||
case EVENT_SUMMON_BALLS_2:
|
||||
events.RescheduleEvent(EVENT_SUMMON_BALLS_3, 8000);
|
||||
break;
|
||||
case EVENT_SUMMON_BALLS_3:
|
||||
events.RescheduleEvent(EVENT_SUMMON_BALLS_1, 15000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case EVENT_SPELL_SPIKE:
|
||||
me->CastSpell(me->GetVictim(), me->GetEntry()==NPC_LIGHTBANE ? SPELL_LIGHT_TWIN_SPIKE : SPELL_DARK_TWIN_SPIKE, false);
|
||||
events.RepeatEvent(urand(7000,10000));
|
||||
break;
|
||||
case EVENT_SPELL_TOUCH:
|
||||
{
|
||||
uint32 essenceId = 0;
|
||||
switch( me->GetEntry() )
|
||||
{
|
||||
case NPC_LIGHTBANE:
|
||||
switch( GetDifficulty() )
|
||||
{
|
||||
case 0:
|
||||
essenceId = 65684;
|
||||
break;
|
||||
case 1:
|
||||
essenceId = 67176;
|
||||
break;
|
||||
case 2:
|
||||
essenceId = 67177;
|
||||
break;
|
||||
case 3:
|
||||
essenceId = 67178;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case NPC_DARKBANE:
|
||||
switch( GetDifficulty() )
|
||||
{
|
||||
case 0:
|
||||
essenceId = 65686;
|
||||
break;
|
||||
case 1:
|
||||
essenceId = 67222;
|
||||
break;
|
||||
case 2:
|
||||
essenceId = 67223;
|
||||
break;
|
||||
case 3:
|
||||
essenceId = 67224;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, essenceId) )
|
||||
me->CastSpell(target, me->GetEntry()==NPC_LIGHTBANE ? SPELL_LIGHT_TOUCH : SPELL_DARK_TOUCH, false);
|
||||
events.RepeatEvent(urand(45000,50000));
|
||||
*/
|
||||
|
||||
std::vector<uint64> tList;
|
||||
Map::PlayerList const &pList = me->GetMap()->GetPlayers();
|
||||
if (pList.getSize())
|
||||
{
|
||||
for (Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr)
|
||||
if (Player* plr = itr->GetSource())
|
||||
if (Creature* sister = GetSister())
|
||||
if ((!me->GetVictim() || me->GetVictim()->GetGUID() != plr->GetGUID()) && (!sister->GetVictim() || sister->GetVictim()->GetGUID() != plr->GetGUID()) && plr->HasAura(essenceId))
|
||||
tList.push_back(plr->GetGUID());
|
||||
|
||||
if (!tList.empty())
|
||||
if (Player* target = ObjectAccessor::GetPlayer(*me, tList[urand(0,tList.size()-1)]))
|
||||
{
|
||||
me->CastSpell(target, me->GetEntry()==NPC_LIGHTBANE ? SPELL_LIGHT_TOUCH : SPELL_DARK_TOUCH, false);
|
||||
events.RepeatEvent(urand(45000,50000));
|
||||
break;
|
||||
}
|
||||
}
|
||||
events.RepeatEvent(10000);
|
||||
}
|
||||
break;
|
||||
case EVENT_SPECIAL:
|
||||
{
|
||||
uint8 s;
|
||||
do s=urand(0,3); while( SpecialMask & (1<<s) && (SpecialMask & 0xF) != 0xF );
|
||||
SpecialMask |= (1<<s);
|
||||
switch( s )
|
||||
{
|
||||
case 0: // light vortex
|
||||
me->CastSpell((Unit*)NULL, SPELL_LIGHT_VORTEX, false);
|
||||
Talk(EMOTE_VORTEX);
|
||||
Talk(SAY_LIGHT);
|
||||
if( Creature* twin = GetSister() )
|
||||
twin->AI()->Talk(SAY_LIGHT);
|
||||
break;
|
||||
case 1: // dark vortex
|
||||
if( Creature* twin = GetSister() )
|
||||
{
|
||||
twin->CastSpell((Unit*)NULL, SPELL_DARK_VORTEX, false);
|
||||
twin->AI()->Talk(EMOTE_VORTEX);
|
||||
twin->AI()->Talk(SAY_NIGHT);
|
||||
Talk(SAY_NIGHT);
|
||||
}
|
||||
break;
|
||||
case 2: // light pact
|
||||
Talk(EMOTE_TWINK_PACT);
|
||||
Talk(SAY_TWINK_PACT);
|
||||
if( Creature* twin = GetSister() )
|
||||
{
|
||||
twin->AI()->Talk(SAY_TWINK_PACT);
|
||||
twin->AI()->DoAction(-3);
|
||||
}
|
||||
me->CastSpell(me, SPELL_LIGHT_SHIELD, true);
|
||||
me->CastSpell(me, SPELL_LIGHT_TWIN_PACT, false);
|
||||
break;
|
||||
case 3: // dark pact
|
||||
if( Creature* twin = GetSister() )
|
||||
{
|
||||
twin->AI()->Talk(EMOTE_TWINK_PACT);
|
||||
twin->AI()->Talk(SAY_TWINK_PACT);
|
||||
Talk(SAY_TWINK_PACT);
|
||||
twin->CastSpell(twin, SPELL_DARK_SHIELD, true);
|
||||
twin->CastSpell(twin, SPELL_DARK_TWIN_PACT, false);
|
||||
DoAction(-3);
|
||||
}
|
||||
break;
|
||||
}
|
||||
if( (SpecialMask & 0xF) == 0xF )
|
||||
SpecialMask = 0;
|
||||
events.RepeatEvent(45000);
|
||||
events.DelayEventsToMax(15000, 1); // no touch of light/darkness during special abilities!
|
||||
}
|
||||
break;
|
||||
case EVENT_REMOVE_DUAL_WIELD:
|
||||
me->SetCanDualWield(false);
|
||||
events.PopEvent();
|
||||
break;
|
||||
}
|
||||
|
||||
myDoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*pKiller*/)
|
||||
{
|
||||
DoAction(-1);
|
||||
Talk(SAY_DEATH);
|
||||
if( pInstance )
|
||||
{
|
||||
pInstance->SetData(TYPE_VALKYR, DONE);
|
||||
pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POWERING_UP);
|
||||
}
|
||||
if( Creature* twin = GetSister() )
|
||||
if( twin->IsAlive() )
|
||||
{
|
||||
twin->SetHealth(1);
|
||||
Unit::Kill(twin, twin);
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* s)
|
||||
{
|
||||
summons.Summon(s);
|
||||
}
|
||||
|
||||
void SummonedCreatureDespawn(Creature* s)
|
||||
{
|
||||
summons.Despawn(s);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who)
|
||||
{
|
||||
if( who->GetTypeId() == TYPEID_PLAYER )
|
||||
{
|
||||
int32 id = urand(0,1) ? SAY_KILL_PLAYER_1 : SAY_KILL_PLAYER_2;
|
||||
Talk(id);
|
||||
if( Creature* twin = GetSister() )
|
||||
twin->AI()->Talk(id);
|
||||
}
|
||||
}
|
||||
|
||||
void EnterEvadeMode()
|
||||
{
|
||||
if( pInstance )
|
||||
pInstance->SetData(TYPE_FAILED, 0);
|
||||
}
|
||||
};
|
||||
|
||||
class boss_eydis : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_eydis() : CreatureScript("boss_eydis") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_eydisAI(pCreature);
|
||||
}
|
||||
|
||||
struct boss_eydisAI : public boss_twin_valkyrAI
|
||||
{
|
||||
boss_eydisAI(Creature* pCreature) : boss_twin_valkyrAI(pCreature)
|
||||
{
|
||||
me->SetFlag(UNIT_FIELD_AURASTATE, 1<<(19-1));
|
||||
SetEquipmentSlots(false, EQUIP_MAIN_2, EQUIP_OFFHAND_2, EQUIP_RANGED_2);
|
||||
if( Creature* c = me->SummonCreature(NPC_DARK_ESSENCE, Locs[LOC_DARKESS_1]) )
|
||||
boss_twin_valkyrAI::JustSummoned(c);
|
||||
if( Creature* c = me->SummonCreature(NPC_DARK_ESSENCE, Locs[LOC_DARKESS_2]) )
|
||||
boss_twin_valkyrAI::JustSummoned(c);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* s) {}
|
||||
};
|
||||
};
|
||||
|
||||
class boss_fjola : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_fjola() : CreatureScript("boss_fjola") {}
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_fjolaAI(pCreature);
|
||||
}
|
||||
|
||||
struct boss_fjolaAI : public boss_twin_valkyrAI
|
||||
{
|
||||
boss_fjolaAI(Creature* pCreature) : boss_twin_valkyrAI(pCreature)
|
||||
{
|
||||
me->SetFlag(UNIT_FIELD_AURASTATE, 1<<(22-1));
|
||||
SetEquipmentSlots(false, EQUIP_MAIN_1, EQUIP_OFFHAND_1, EQUIP_RANGED_1);
|
||||
if( Creature* c = me->SummonCreature(NPC_LIGHT_ESSENCE, Locs[LOC_LIGHTESS_1]) )
|
||||
boss_twin_valkyrAI::JustSummoned(c);
|
||||
if( Creature* c = me->SummonCreature(NPC_LIGHT_ESSENCE, Locs[LOC_LIGHTESS_2]) )
|
||||
boss_twin_valkyrAI::JustSummoned(c);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* s) {}
|
||||
};
|
||||
};
|
||||
|
||||
class npc_essence_of_twin : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_essence_of_twin() : CreatureScript("npc_essence_of_twin") { }
|
||||
|
||||
bool OnGossipHello(Player* player, Creature* creature)
|
||||
{
|
||||
switch( creature->GetEntry() )
|
||||
{
|
||||
case NPC_LIGHT_ESSENCE:
|
||||
{
|
||||
uint32 essenceId = 0;
|
||||
uint32 effect2Id = 0;
|
||||
uint32 empoweredId = 0;
|
||||
uint32 touchId1 = 0;
|
||||
uint32 touchId2 = 0;
|
||||
switch( creature->GetMap()->GetDifficulty() )
|
||||
{
|
||||
case 0:
|
||||
essenceId = 65684;
|
||||
empoweredId = 65724;
|
||||
touchId1 = 65950;
|
||||
touchId2 = 66001;
|
||||
effect2Id = 65827;
|
||||
break;
|
||||
case 1:
|
||||
essenceId = 67176;
|
||||
empoweredId = 67213;
|
||||
touchId1 = 67296;
|
||||
touchId2 = 67281;
|
||||
effect2Id = 67179;
|
||||
break;
|
||||
case 2:
|
||||
essenceId = 67177;
|
||||
empoweredId = 67214;
|
||||
touchId1 = 67297;
|
||||
touchId2 = 67282;
|
||||
effect2Id = 67180;
|
||||
break;
|
||||
case 3:
|
||||
essenceId = 67178;
|
||||
empoweredId = 67215;
|
||||
touchId1 = 67298;
|
||||
touchId2 = 67283;
|
||||
effect2Id = 67181;
|
||||
break;
|
||||
}
|
||||
player->RemoveAura(essenceId);
|
||||
player->RemoveAura(effect2Id);
|
||||
player->RemoveAura(touchId1);
|
||||
//player->RemoveAura(touchId2); // dont remove black touch here - only white can have black touch - so white changing to white - so no change of color
|
||||
//player->RemoveAura(empoweredId); // apply new empowered?
|
||||
player->CastSpell(player, SPELL_LIGHT_ESSENCE, true);
|
||||
}
|
||||
break;
|
||||
case NPC_DARK_ESSENCE:
|
||||
{
|
||||
uint32 essenceId = 0;
|
||||
uint32 effect2Id = 0;
|
||||
uint32 empoweredId = 0;
|
||||
uint32 touchId1 = 0;
|
||||
uint32 touchId2 = 0;
|
||||
switch( creature->GetMap()->GetDifficulty() )
|
||||
{
|
||||
case 0:
|
||||
essenceId = 65686;
|
||||
empoweredId = 65748;
|
||||
touchId1 = 65950;
|
||||
touchId2 = 66001;
|
||||
effect2Id = 65811;
|
||||
break;
|
||||
case 1:
|
||||
essenceId = 67222;
|
||||
empoweredId = 67216;
|
||||
touchId1 = 67296;
|
||||
touchId2 = 67281;
|
||||
effect2Id = 67511;
|
||||
break;
|
||||
case 2:
|
||||
essenceId = 67223;
|
||||
empoweredId = 67217;
|
||||
touchId1 = 67297;
|
||||
touchId2 = 67282;
|
||||
effect2Id = 67512;
|
||||
break;
|
||||
case 3:
|
||||
essenceId = 67224;
|
||||
empoweredId = 67218;
|
||||
touchId1 = 67298;
|
||||
touchId2 = 67283;
|
||||
effect2Id = 67513;
|
||||
break;
|
||||
}
|
||||
player->RemoveAura(essenceId);
|
||||
player->RemoveAura(effect2Id);
|
||||
//player->RemoveAura(touchId1); // dont remove white touch here - only black can have white touch - so black changing to black - so no change of color
|
||||
player->RemoveAura(touchId2);
|
||||
//player->RemoveAura(empoweredId); // apply new empowered?
|
||||
player->CastSpell(player, SPELL_DARK_ESSENCE, true);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
player->CLOSE_GOSSIP_MENU();
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class npc_concentrated_ball : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_concentrated_ball() : CreatureScript("npc_concentrated_ball") { }
|
||||
|
||||
CreatureAI* GetAI(Creature *pCreature) const
|
||||
{
|
||||
return new npc_concentrated_ballAI(pCreature);
|
||||
}
|
||||
|
||||
struct npc_concentrated_ballAI : public NullCreatureAI
|
||||
{
|
||||
npc_concentrated_ballAI(Creature *pCreature) : NullCreatureAI(pCreature)
|
||||
{
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetCanFly(true);
|
||||
me->SetDisableGravity(true);
|
||||
me->CastSpell(me, 100101, true); // custom periodic dummy spell
|
||||
despawning = false;
|
||||
}
|
||||
|
||||
bool despawning;
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if (param == 1)
|
||||
despawning = true;
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id)
|
||||
{
|
||||
if( type != POINT_MOTION_TYPE || id != 0 )
|
||||
return;
|
||||
|
||||
if( urand(0,2) )
|
||||
me->DespawnOrUnsummon(0);
|
||||
}
|
||||
|
||||
void MoveToNextPoint()
|
||||
{
|
||||
float angle = rand_norm()*2*M_PI;
|
||||
me->GetMotionMaster()->MovePoint(0, Locs[LOC_CENTER].GetPositionX()+cos(angle)*47.0f, Locs[LOC_CENTER].GetPositionY()+sin(angle)*47.0f, me->GetPositionZ());
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if( despawning )
|
||||
return;
|
||||
|
||||
if( me->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE )
|
||||
MoveToNextPoint();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class spell_valkyr_essence : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_valkyr_essence() : SpellScriptLoader("spell_valkyr_essence") { }
|
||||
|
||||
class spell_valkyr_essence_auraAuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_valkyr_essence_auraAuraScript)
|
||||
|
||||
void HandleAfterEffectAbsorb(AuraEffect * /*aurEff*/, DamageInfo & /*dmgInfo*/, uint32 & absorbAmount)
|
||||
{
|
||||
uint16 count = absorbAmount/1000;
|
||||
if( !count || !GetOwner() )
|
||||
return;
|
||||
|
||||
if( const SpellInfo* se = GetAura()->GetSpellInfo() )
|
||||
if( Unit* owner = GetOwner()->ToUnit() )
|
||||
{
|
||||
uint32 auraId = 0;
|
||||
uint32 empoweredId = 0;
|
||||
switch( se->Id )
|
||||
{
|
||||
case 65686:
|
||||
auraId = 67590;
|
||||
empoweredId = 65748;
|
||||
break;
|
||||
case 65684:
|
||||
auraId = 67590;
|
||||
empoweredId = 65724;
|
||||
break;
|
||||
case 67222:
|
||||
auraId = 67602;
|
||||
empoweredId = 65748;
|
||||
break;
|
||||
case 67176:
|
||||
auraId = 67602;
|
||||
empoweredId = 65724;
|
||||
break;
|
||||
case 67223:
|
||||
auraId = 67603;
|
||||
empoweredId = 65748;
|
||||
break;
|
||||
case 67177:
|
||||
auraId = 67603;
|
||||
empoweredId = 65724;
|
||||
break;
|
||||
case 67224:
|
||||
auraId = 67604;
|
||||
empoweredId = 65748;
|
||||
break;
|
||||
case 67178:
|
||||
auraId = 67604;
|
||||
empoweredId = 65724;
|
||||
break;
|
||||
}
|
||||
if( !owner->HasAura(auraId) )
|
||||
{
|
||||
owner->CastSpell(owner, SPELL_POWERING_UP, true);
|
||||
if( --count == 0 )
|
||||
return;
|
||||
}
|
||||
if( Aura* aur = owner->GetAura(auraId) )
|
||||
{
|
||||
if( aur->GetStackAmount()+count < 100 )
|
||||
{
|
||||
aur->ModStackAmount(count);
|
||||
|
||||
if (roll_chance_i(30)) // 30% chance to gain extra speed for collecting
|
||||
owner->CastSpell(owner, SPELL_SURGE_OF_SPEED, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
owner->CastSpell(owner, empoweredId, true);
|
||||
aur->Remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
AfterEffectAbsorb += AuraEffectAbsorbFn(spell_valkyr_essence_auraAuraScript::HandleAfterEffectAbsorb, EFFECT_0);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript *GetAuraScript() const
|
||||
{
|
||||
return new spell_valkyr_essence_auraAuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_valkyr_touch : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_valkyr_touch() : SpellScriptLoader("spell_valkyr_touch") { }
|
||||
|
||||
class spell_valkyr_touchAuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_valkyr_touchAuraScript)
|
||||
|
||||
void HandleEffectPeriodic(AuraEffect const * aurEff)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
Unit* caster = GetCaster();
|
||||
if( !caster )
|
||||
return;
|
||||
if( caster->GetMap()->GetId() == 649 )
|
||||
{
|
||||
uint32 excludedID = GetSpellInfo()->ExcludeTargetAuraSpell;
|
||||
Map::PlayerList const &pl = caster->GetMap()->GetPlayers();
|
||||
for( Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr )
|
||||
if( Player* plr = itr->GetSource() )
|
||||
if( plr->IsAlive() && !plr->HasAura(excludedID) && !plr->HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION) )
|
||||
{
|
||||
uint32 absorb=0;
|
||||
uint32 resist=0;
|
||||
CleanDamage cleanDamage = CleanDamage(0, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
|
||||
int32 dmg = urand(2925,3075)*(caster->GetMap()->GetDifficulty()-1);
|
||||
if (caster->CanApplyResilience())
|
||||
Unit::ApplyResilience(plr, NULL, &dmg, false, CR_CRIT_TAKEN_SPELL);
|
||||
uint32 damage = dmg;
|
||||
Unit::CalcAbsorbResist(caster, plr, GetSpellInfo()->GetSchoolMask(), DOT, damage, &absorb, &resist, GetSpellInfo());
|
||||
Unit::DealDamageMods(plr,damage,&absorb);
|
||||
int32 overkill = damage - plr->GetHealth();
|
||||
if (overkill < 0)
|
||||
overkill = 0;
|
||||
SpellPeriodicAuraLogInfo pInfo(aurEff, damage, overkill, absorb, resist, 0.0f, false);
|
||||
plr->SendPeriodicAuraLog(&pInfo);
|
||||
Unit::DealDamage(caster, plr, damage, 0, DOT, GetSpellInfo()->GetSchoolMask(), GetSpellInfo(), true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_valkyr_touchAuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript *GetAuraScript() const
|
||||
{
|
||||
return new spell_valkyr_touchAuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
class spell_valkyr_ball_periodic_dummy : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_valkyr_ball_periodic_dummy() : SpellScriptLoader("spell_valkyr_ball_periodic_dummy") { }
|
||||
|
||||
class spell_valkyr_ball_periodic_dummyAuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_valkyr_ball_periodic_dummyAuraScript)
|
||||
|
||||
void HandleEffectPeriodic(AuraEffect const * aurEff)
|
||||
{
|
||||
if (Unit* target = GetTarget())
|
||||
if (target->GetDisplayId() != 11686)
|
||||
if (Creature* me = target->ToCreature())
|
||||
if (Player* p = me->SelectNearestPlayer(2.75f))
|
||||
if (me->GetExactDist2d(p) <= 2.75f)
|
||||
{
|
||||
me->AI()->DoAction(1); // despawning = true;
|
||||
me->GetMotionMaster()->MoveIdle();
|
||||
me->CastSpell((Unit*)NULL, me->GetEntry()==NPC_CONCENTRATED_LIGHT ? SPELL_UNLEASHED_LIGHT : SPELL_UNLEASHED_DARK, false);
|
||||
me->SetDisplayId(11686);
|
||||
me->DespawnOrUnsummon(1500);
|
||||
}
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_valkyr_ball_periodic_dummyAuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript *GetAuraScript() const
|
||||
{
|
||||
return new spell_valkyr_ball_periodic_dummyAuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_twin_valkyr()
|
||||
{
|
||||
new boss_fjola();
|
||||
new boss_eydis();
|
||||
new npc_essence_of_twin();
|
||||
new npc_concentrated_ball();
|
||||
new spell_valkyr_essence();
|
||||
new spell_valkyr_touch();
|
||||
new spell_valkyr_ball_periodic_dummy();
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,83 +0,0 @@
|
||||
/*
|
||||
REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptedGossip.h"
|
||||
#include "trial_of_the_crusader.h"
|
||||
#include "Player.h"
|
||||
|
||||
enum MenuTexts
|
||||
{
|
||||
MSG_TESTED = 724001,
|
||||
MSG_NEXT_STAGE = 724002,
|
||||
MSG_CRUSADERS = 724003,
|
||||
MSG_ANUBARAK = 724005,
|
||||
};
|
||||
|
||||
class npc_announcer_toc10 : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_announcer_toc10() : CreatureScript("npc_announcer_toc10") { }
|
||||
|
||||
bool OnGossipHello(Player* pPlayer, Creature* pCreature)
|
||||
{
|
||||
if( !pCreature->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP) )
|
||||
return true;
|
||||
|
||||
InstanceScript* pInstance = pCreature->GetInstanceScript();
|
||||
if( !pInstance )
|
||||
return true;
|
||||
|
||||
uint32 gossipTextId = 0;
|
||||
switch( pInstance->GetData(TYPE_INSTANCE_PROGRESS) )
|
||||
{
|
||||
case INSTANCE_PROGRESS_INITIAL:
|
||||
gossipTextId = MSG_TESTED;
|
||||
break;
|
||||
case INSTANCE_PROGRESS_INTRO_DONE:
|
||||
case INSTANCE_PROGRESS_BEASTS_DEAD:
|
||||
case INSTANCE_PROGRESS_FACTION_CHAMPIONS_DEAD:
|
||||
case INSTANCE_PROGRESS_VALKYR_DEAD:
|
||||
gossipTextId = MSG_NEXT_STAGE;
|
||||
break;
|
||||
case INSTANCE_PROGRESS_JARAXXUS_DEAD:
|
||||
gossipTextId = MSG_CRUSADERS;
|
||||
break;
|
||||
case INSTANCE_PROGRESS_DONE:
|
||||
pCreature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
return true;
|
||||
default:
|
||||
return true;
|
||||
}
|
||||
|
||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "We are ready!", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1337);
|
||||
pPlayer->SEND_GOSSIP_MENU(gossipTextId, pCreature->GetGUID());
|
||||
return true;
|
||||
}
|
||||
|
||||
bool OnGossipSelect(Player* pPlayer, Creature* pCreature, uint32 /*sender*/, uint32 uiAction)
|
||||
{
|
||||
if( !pCreature->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP) )
|
||||
return true;
|
||||
|
||||
InstanceScript* pInstance = pCreature->GetInstanceScript();
|
||||
if( !pInstance )
|
||||
return true;
|
||||
|
||||
if( uiAction == GOSSIP_ACTION_INFO_DEF+1337 )
|
||||
{
|
||||
pInstance->SetData(TYPE_ANNOUNCER_GOSSIP_SELECT, 0);
|
||||
pCreature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
}
|
||||
|
||||
pPlayer->CLOSE_GOSSIP_MENU();
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_trial_of_the_crusader()
|
||||
{
|
||||
new npc_announcer_toc10();
|
||||
}
|
||||
@@ -1,384 +0,0 @@
|
||||
/*
|
||||
REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
|
||||
*/
|
||||
|
||||
#ifndef DEF_CRUSADER_H
|
||||
#define DEF_CRUSADER_H
|
||||
|
||||
enum DataTypes
|
||||
{
|
||||
TYPE_NONE = 0,
|
||||
TYPE_INSTANCE_PROGRESS,
|
||||
TYPE_ANNOUNCER_GOSSIP_SELECT,
|
||||
TYPE_FAILED,
|
||||
|
||||
TYPE_GORMOK,
|
||||
TYPE_JORMUNGAR,
|
||||
TYPE_DREADSCALE,
|
||||
TYPE_ACIDMAW,
|
||||
TYPE_ICEHOWL,
|
||||
TYPE_JARAXXUS,
|
||||
TYPE_FACTION_CHAMPIONS,
|
||||
TYPE_FACTION_CHAMPIONS_PLAYER_DIED,
|
||||
TYPE_VALKYR,
|
||||
TYPE_ANUBARAK,
|
||||
|
||||
TYPE_FACTION_CHAMPIONS_START,
|
||||
TYPE_NORTHREND_BEASTS_ALL,
|
||||
};
|
||||
|
||||
enum Progress
|
||||
{
|
||||
INSTANCE_PROGRESS_INITIAL = 0,
|
||||
INSTANCE_PROGRESS_INTRO_DONE,
|
||||
INSTANCE_PROGRESS_BEASTS_DEAD,
|
||||
INSTANCE_PROGRESS_JARAXXUS_INTRO_DONE,
|
||||
INSTANCE_PROGRESS_JARAXXUS_DEAD,
|
||||
INSTANCE_PROGRESS_FACTION_CHAMPIONS_DEAD = 6,
|
||||
INSTANCE_PROGRESS_VALKYR_DEAD = 8,
|
||||
INSTANCE_PROGRESS_DONE = 10,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_CHECK_PLAYERS = 1,
|
||||
EVENT_OPEN_GATE,
|
||||
EVENT_CLOSE_GATE,
|
||||
|
||||
EVENT_SCENE_001,
|
||||
EVENT_SCENE_002,
|
||||
EVENT_SCENE_003,
|
||||
EVENT_SCENE_004,
|
||||
EVENT_SUMMON_GORMOK,
|
||||
EVENT_GORMOK_ATTACK,
|
||||
EVENT_SCENE_005,
|
||||
EVENT_SCENE_005_2,
|
||||
EVENT_SUMMON_ACIDMAW_AND_DREADSCALE,
|
||||
EVENT_ACIDMAW_AND_DREADSCALE_ATTACK,
|
||||
EVENT_SCENE_006,
|
||||
EVENT_SUMMON_ICEHOWL,
|
||||
EVENT_ICEHOWL_ATTACK,
|
||||
EVENT_SCENE_BEASTS_DONE,
|
||||
EVENT_NORTHREND_BEASTS_ENRAGE,
|
||||
|
||||
EVENT_SCENE_101,
|
||||
EVENT_SCENE_102,
|
||||
EVENT_SCENE_103,
|
||||
EVENT_SCENE_104,
|
||||
EVENT_SUMMON_JARAXXUS,
|
||||
EVENT_SCENE_105,
|
||||
EVENT_SCENE_106,
|
||||
EVENT_SCENE_107,
|
||||
EVENT_SCENE_108,
|
||||
EVENT_SCENE_109,
|
||||
EVENT_JARAXXUS_ATTACK,
|
||||
EVENT_SCENE_110,
|
||||
EVENT_SCENE_111,
|
||||
EVENT_SCENE_112,
|
||||
EVENT_SCENE_113,
|
||||
|
||||
EVENT_SCENE_201,
|
||||
EVENT_SCENE_202,
|
||||
EVENT_SCENE_203,
|
||||
EVENT_SCENE_204,
|
||||
EVENT_SCENE_205,
|
||||
EVENT_SUMMON_CHAMPIONS,
|
||||
EVENT_CHAMPIONS_ATTACK,
|
||||
EVENT_SCENE_FACTION_CHAMPIONS_DEAD,
|
||||
|
||||
EVENT_SCENE_301,
|
||||
EVENT_SCENE_302,
|
||||
EVENT_SCENE_303,
|
||||
EVENT_SCENE_304,
|
||||
EVENT_VALKYRIES_ATTACK,
|
||||
EVENT_SCENE_VALKYR_DEAD,
|
||||
|
||||
EVENT_SCENE_401,
|
||||
EVENT_SCENE_402,
|
||||
EVENT_SCENE_403,
|
||||
EVENT_SCENE_404,
|
||||
EVENT_SCENE_405,
|
||||
EVENT_SCENE_406,
|
||||
EVENT_SCENE_406_2,
|
||||
EVENT_SCENE_407,
|
||||
EVENT_SCENE_408,
|
||||
EVENT_SCENE_409,
|
||||
EVENT_SCENE_410,
|
||||
EVENT_SCENE_501,
|
||||
EVENT_SCENE_502,
|
||||
};
|
||||
|
||||
enum NPCs
|
||||
{
|
||||
NPC_BARRENT = 34816,
|
||||
NPC_TIRION = 34996,
|
||||
NPC_GARROSH = 34995,
|
||||
NPC_THRALL = 34994,
|
||||
NPC_VARIAN = 34990,
|
||||
NPC_PROUDMOORE = 34992,
|
||||
NPC_ARGENT_MAGE = 36097,
|
||||
|
||||
NPC_FIZZLEBANG = 35458,
|
||||
NPC_LICH_KING = 35877,
|
||||
|
||||
NPC_GORMOK = 34796,
|
||||
NPC_DREADSCALE = 34799,
|
||||
NPC_ACIDMAW = 35144,
|
||||
NPC_ICEHOWL = 34797,
|
||||
NPC_JARAXXUS = 34780,
|
||||
|
||||
NPC_PURPLE_GROUND = 35651,
|
||||
NPC_WORLD_TRIGGER = 18721,
|
||||
|
||||
NPC_ALLIANCE_DEATH_KNIGHT = 34461,
|
||||
NPC_ALLIANCE_DRUID_BALANCE = 34460,
|
||||
NPC_ALLIANCE_DRUID_RESTORATION = 34469,
|
||||
NPC_ALLIANCE_HUNTER = 34467,
|
||||
NPC_ALLIANCE_MAGE = 34468,
|
||||
NPC_ALLIANCE_PALADIN_HOLY = 34465,
|
||||
NPC_ALLIANCE_PALADIN_RETRIBUTION = 34471,
|
||||
NPC_ALLIANCE_PRIEST_DISCIPLINE = 34466,
|
||||
NPC_ALLIANCE_PRIEST_SHADOW = 34473,
|
||||
NPC_ALLIANCE_ROGUE = 34472,
|
||||
NPC_ALLIANCE_SHAMAN_ENHANCEMENT = 34463,
|
||||
NPC_ALLIANCE_SHAMAN_RESTORATION = 34470,
|
||||
NPC_ALLIANCE_WARLOCK = 34474,
|
||||
NPC_ALLIANCE_WARRIOR = 34475,
|
||||
|
||||
NPC_HORDE_DEATH_KNIGHT = 34458,
|
||||
NPC_HORDE_DRUID_BALANCE = 34451,
|
||||
NPC_HORDE_DRUID_RESTORATION = 34459,
|
||||
NPC_HORDE_HUNTER = 34448,
|
||||
NPC_HORDE_MAGE = 34449,
|
||||
NPC_HORDE_PALADIN_HOLY = 34445,
|
||||
NPC_HORDE_PALADIN_RETRIBUTION = 34456,
|
||||
NPC_HORDE_PRIEST_DISCIPLINE = 34447,
|
||||
NPC_HORDE_PRIEST_SHADOW = 34441,
|
||||
NPC_HORDE_ROGUE = 34454,
|
||||
NPC_HORDE_SHAMAN_ENHANCEMENT = 34455,
|
||||
NPC_HORDE_SHAMAN_RESTORATION = 34444,
|
||||
NPC_HORDE_WARLOCK = 34450,
|
||||
NPC_HORDE_WARRIOR = 34453,
|
||||
|
||||
NPC_LIGHTBANE = 34497,
|
||||
NPC_DARKBANE = 34496,
|
||||
|
||||
NPC_ANUBARAK = 34564,
|
||||
};
|
||||
|
||||
enum GOs
|
||||
{
|
||||
GO_ARGENT_COLISEUM_FLOOR = 195527,
|
||||
GO_MAIN_GATE_DOOR = 195647,
|
||||
GO_WEB_DOOR = 195485,
|
||||
GO_EAST_PORTCULLIS = 195648,
|
||||
GO_SOUTH_PORTCULLIS = 195649,
|
||||
GO_NORTH_PORTCULLIS = 195650,
|
||||
|
||||
GO_CRUSADERS_CACHE_10 = 195631,
|
||||
GO_CRUSADERS_CACHE_25 = 195632,
|
||||
GO_CRUSADERS_CACHE_10_H = 195633,
|
||||
GO_CRUSADERS_CACHE_25_H = 195635,
|
||||
|
||||
// Tribute Chest (heroic)
|
||||
GO_TRIBUTE_CHEST_10H_25 = 195668, // 10man 01-24 attempts
|
||||
GO_TRIBUTE_CHEST_10H_45 = 195667, // 10man 25-44 attempts
|
||||
GO_TRIBUTE_CHEST_10H_50 = 195666, // 10man 45-49 attempts
|
||||
GO_TRIBUTE_CHEST_10H_99 = 195665, // 10man 50 attempts
|
||||
GO_TRIBUTE_CHEST_25H_25 = 195672, // 25man 01-24 attempts
|
||||
GO_TRIBUTE_CHEST_25H_45 = 195671, // 25man 25-44 attempts
|
||||
GO_TRIBUTE_CHEST_25H_50 = 195670, // 25man 45-49 attempts
|
||||
GO_TRIBUTE_CHEST_25H_99 = 195669, // 25man 50 attempts
|
||||
};
|
||||
|
||||
enum eTexts
|
||||
{
|
||||
// Highlord Tirion Fordring - 34996
|
||||
SAY_STAGE_0_01 = 0,
|
||||
SAY_STAGE_0_02 = 1,
|
||||
SAY_STAGE_0_04 = 2,
|
||||
SAY_STAGE_0_05 = 3,
|
||||
SAY_STAGE_0_06 = 4,
|
||||
SAY_STAGE_0_WIPE = 5,
|
||||
SAY_STAGE_1_01 = 6,
|
||||
SAY_STAGE_1_07 = 7,
|
||||
SAY_STAGE_1_08 = 8,
|
||||
SAY_STAGE_1_11 = 9,
|
||||
SAY_STAGE_2_01 = 10,
|
||||
SAY_STAGE_2_03 = 11,
|
||||
SAY_STAGE_2_06 = 12,
|
||||
SAY_STAGE_3_01 = 13,
|
||||
SAY_STAGE_3_02 = 14,
|
||||
SAY_STAGE_4_01 = 15,
|
||||
SAY_STAGE_4_03 = 16,
|
||||
|
||||
// Varian Wrynn
|
||||
SAY_STAGE_0_03a = 0,
|
||||
SAY_STAGE_1_10 = 1,
|
||||
SAY_STAGE_2_02a = 2,
|
||||
SAY_STAGE_2_04a = 3,
|
||||
SAY_STAGE_2_05a = 4,
|
||||
SAY_STAGE_3_03a = 5,
|
||||
SAY_VARIAN_KILL_HORDE_PLAYER_1 = 6,
|
||||
|
||||
// Garrosh
|
||||
SAY_STAGE_0_03h = 0,
|
||||
SAY_STAGE_1_09 = 1,
|
||||
SAY_STAGE_2_02h = 2,
|
||||
SAY_STAGE_2_04h = 3,
|
||||
SAY_STAGE_2_05h = 4,
|
||||
SAY_STAGE_3_03h = 5,
|
||||
SAY_GARROSH_KILL_ALLIANCE_PLAYER_1 = 6,
|
||||
|
||||
// Wilfred Fizzlebang
|
||||
SAY_STAGE_1_02 = 0,
|
||||
SAY_STAGE_1_03 = 1,
|
||||
SAY_STAGE_1_04 = 2,
|
||||
SAY_STAGE_1_06 = 3,
|
||||
|
||||
// Lord Jaraxxus
|
||||
SAY_STAGE_1_05 = 0,
|
||||
|
||||
// The Lich King
|
||||
SAY_STAGE_4_02 = 0,
|
||||
SAY_STAGE_4_05 = 1,
|
||||
SAY_STAGE_4_04 = 2,
|
||||
|
||||
// Highlord Tirion Fordring - 36095
|
||||
SAY_STAGE_4_06 = 17,
|
||||
SAY_STAGE_4_07 = 18,
|
||||
};
|
||||
|
||||
const Position Locs[] =
|
||||
{
|
||||
{563.8f, 216.1f, 395.1f, 3*M_PI/2}, // 0
|
||||
{563.93f, 178.37f, 394.49f, 3*M_PI/2}, // 1
|
||||
{575.74f, 171.5f, 394.75f, 3*M_PI/2}, // 2
|
||||
{549.93f, 171.5f, 394.75f, 3*M_PI/2}, // 3
|
||||
{563.672974f, 139.571f, 393.837006f, 3*M_PI/2}, // 4
|
||||
{577.347839f, 210.0f, 395.14f /*+ 6.0f*/, 3*M_PI/2}, // 5
|
||||
{550.955933f, 210.0f, 395.14f /*+ 6.0f*/, 3*M_PI/2}, // 6
|
||||
{573.5f, 180.5f, 395.14f /*+ 6.0f*/, 0}, // 7
|
||||
{553.5f, 180.5f, 395.14f /*+ 6.0f*/, 0}, // 8
|
||||
{585.5f, 170.0f, 395.14f /*+ 6.0f*/, 0}, // 9
|
||||
{545.5f, 170.0f, 395.14f /*+ 6.0f*/, 0}, // 10
|
||||
{563.833008f, 179.244995f, 394.5f, 3*M_PI/2}, // 11
|
||||
{563.547f, 141.613f, 393.908f, 0}, // 12
|
||||
{586.060242f, 117.514809f, 394.314026f, 0}, // 13 - Dark essence 1
|
||||
{541.602112f, 161.879837f, 394.587952f, 0}, // 14 - Dark essence 2
|
||||
{541.021118f, 117.262932f, 395.314819f, 0}, // 15 - Light essence 1
|
||||
{586.200562f, 162.145523f, 394.626129f, 0}, // 16 - Light essence 2
|
||||
{785.90f, 133.42f, 142.612f, M_PI}, // 17
|
||||
{665.04f, 139.25f, 142.2f, 0.0f}, // 18
|
||||
{664.75f, 135.0f, 142.2f, 0.0f}
|
||||
};
|
||||
|
||||
enum LocNames
|
||||
{
|
||||
LOC_BEHIND_GATE = 0,
|
||||
LOC_GATE_FRONT,
|
||||
LOC_DREADSCALE,
|
||||
LOC_ACIDMAW,
|
||||
LOC_CENTER,
|
||||
LOC_VALKYR_RIGHT,
|
||||
LOC_VALKYR_LEFT,
|
||||
LOC_VALKYR_DEST_RIGHT,
|
||||
LOC_VALKYR_DEST_LEFT,
|
||||
LOC_VALKYR_DEST_2_RIGHT,
|
||||
LOC_VALKYR_DEST_2_LEFT,
|
||||
LOC_ARTHAS_PORTAL,
|
||||
LOC_ARTHAS,
|
||||
LOC_DARKESS_1,
|
||||
LOC_DARKESS_2,
|
||||
LOC_LIGHTESS_1,
|
||||
LOC_LIGHTESS_2,
|
||||
LOC_ANUB,
|
||||
LOC_TIRION_FINAL,
|
||||
LOC_MAGE,
|
||||
};
|
||||
|
||||
const Position FactionChampionLoc[]=
|
||||
{
|
||||
{514.231f, 105.569f, 418.234f, 0}, // 0 - Horde Initial Pos 0
|
||||
{508.334f, 115.377f, 418.234f, 0}, // 1 - Horde Initial Pos 1
|
||||
{506.454f, 126.291f, 418.234f, 0}, // 2 - Horde Initial Pos 2
|
||||
{506.243f, 106.596f, 421.592f, 0}, // 3 - Horde Initial Pos 3
|
||||
{499.885f, 117.717f, 421.557f, 0}, // 4 - Horde Initial Pos 4
|
||||
|
||||
{613.127f, 100.443f, 419.74f, 0}, // 5 - Ally Initial Pos 0
|
||||
{621.126f, 128.042f, 418.231f, 0}, // 6 - Ally Initial Pos 1
|
||||
{618.829f, 113.606f, 418.232f, 0}, // 7 - Ally Initial Pos 2
|
||||
{625.845f, 112.914f, 421.575f, 0}, // 8 - Ally Initial Pos 3
|
||||
{615.566f, 109.653f, 418.234f, 0}, // 9 - Ally Initial Pos 4
|
||||
|
||||
{535.469f, 113.012f, 394.55f, 0}, // 10 - Final Pos 0
|
||||
{526.417f, 137.465f, 394.55f, 0}, // 11 - Final Pos 1
|
||||
{528.108f, 111.057f, 394.55f, 0}, // 12 - Final Pos 2
|
||||
{519.92f, 134.285f, 394.55f, 0}, // 13 - Final Pos 3
|
||||
{533.648f, 119.148f, 394.55f, 0}, // 14 - Final Pos 4
|
||||
{531.399f, 125.63f, 394.55f, 0}, // 15 - Final Pos 5
|
||||
{528.958f, 131.47f, 394.55f, 0}, // 16 - Final Pos 6
|
||||
{526.309f, 116.667f, 394.55f, 0}, // 17 - Final Pos 7
|
||||
{524.238f, 122.411f, 394.55f, 0}, // 18 - Final Pos 8
|
||||
{521.901f, 128.488f, 394.55f, 0}, // 19 - Final Pos 9
|
||||
};
|
||||
|
||||
enum EventSpells
|
||||
{
|
||||
SPELL_WILFRED_PORTAL = 68424,
|
||||
SPELL_JORMUNGAR_ACHIEV = 68523,
|
||||
SPELL_FACTION_CHAMPIONS_KILL_CREDIT = 68184,
|
||||
SPELL_RESILIENCE_WILL_FIX_IT_CREDIT = 68620,
|
||||
SPELL_TRAITOR_KING_10 = 68186,
|
||||
SPELL_TRAITOR_KING_25 = 68515,
|
||||
SPELL_PORTAL_TO_DALARAN = 53142,
|
||||
};
|
||||
|
||||
enum eAchievementCriteria
|
||||
{
|
||||
ACHIEV_CRITERIA_UPPER_BACK_PAIN_10_N = 11779,
|
||||
ACHIEV_CRITERIA_UPPER_BACK_PAIN_10_H = 11802,
|
||||
ACHIEV_CRITERIA_UPPER_BACK_PAIN_25_N = 11780,
|
||||
ACHIEV_CRITERIA_UPPER_BACK_PAIN_25_H = 11801,
|
||||
ACHIEV_CRITERIA_THREE_SIXTY_PAIN_SPIKE_10_N = 11838,
|
||||
ACHIEV_CRITERIA_THREE_SIXTY_PAIN_SPIKE_10_H = 11861,
|
||||
ACHIEV_CRITERIA_THREE_SIXTY_PAIN_SPIKE_25_N = 11839,
|
||||
ACHIEV_CRITERIA_THREE_SIXTY_PAIN_SPIKE_25_H = 11862,
|
||||
|
||||
ACHIEV_CRITERIA_A_TRIBUTE_TO_SKILL_10_PLAYER = 12344,
|
||||
ACHIEV_CRITERIA_A_TRIBUTE_TO_SKILL_25_PLAYER = 12338,
|
||||
ACHIEV_CRITERIA_A_TRIBUTE_TO_MAD_SKILL_10_PLAYER = 12347,
|
||||
ACHIEV_CRITERIA_A_TRIBUTE_TO_MAD_SKILL_25_PLAYER = 12341,
|
||||
ACHIEV_CRITERIA_A_TRIBUTE_TO_INSANITY_10_PLAYER = 12349,
|
||||
ACHIEV_CRITERIA_A_TRIBUTE_TO_INSANITY_25_PLAYER = 12343,
|
||||
ACHIEV_CRITERIA_A_TRIBUTE_TO_IMMORTALITY_HORDE = 12358,
|
||||
ACHIEV_CRITERIA_A_TRIBUTE_TO_IMMORTALITY_ALLIANCE = 12359,
|
||||
ACHIEV_CRITERIA_A_TRIBUTE_TO_DEDICATED_INSANITY = 12360,
|
||||
ACHIEV_CRITERIA_REALM_FIRST_GRAND_CRUSADER = 12350,
|
||||
};
|
||||
|
||||
|
||||
enum euiWorldStates
|
||||
{
|
||||
UPDATE_STATE_UI_SHOW = 4390,
|
||||
UPDATE_STATE_UI_COUNT = 4389,
|
||||
};
|
||||
|
||||
const uint32 dIIc = 405;
|
||||
const uint32 dedicatedInsanityItems[405] = {
|
||||
47658, 47659, 47660, 47661, 47662, 47664, 47665, 47666, 47667, 47668, 47670, 47671, 47672, 47673, 47674, 47675, 47677, 47678, 47681, 47682, 47684, 47685, 47686, 47687, 47688, 47689, 47690, 47691, 47692, 47693,
|
||||
47694, 47695, 47696, 47697, 47698, 47699, 47701, 47702, 47704, 47705, 47706, 47707, 47708, 47709, 47710, 47712, 47713, 47714, 47715, 47716, 47729, 47730, 47731, 47732, 47733, 47734, 47735, 47753, 47754, 47755,
|
||||
47756, 47757, 47768, 47769, 47770, 47771, 47772, 47778, 47779, 47780, 47781, 47782, 47803, 47804, 47805, 47806, 47807, 47915, 47916, 47917, 47918, 47919, 47920, 47921, 47922, 47923, 47924, 47925, 47926, 47927,
|
||||
47928, 47929, 47930, 47931, 47932, 47933, 47934, 47935, 47937, 47938, 47939, 47940, 47941, 47942, 47943, 47944, 47945, 47946, 47947, 47948, 47949, 47950, 47951, 47952, 47953, 47954, 47955, 47956, 47957, 47958,
|
||||
47959, 47960, 47961, 47962, 47963, 47964, 47965, 47966, 47967, 47968, 47969, 47970, 47971, 47972, 47973, 47974, 47975, 47976, 47977, 47978, 47979, 47983, 47984, 47985, 47986, 47987, 47988, 47989, 47990, 47991,
|
||||
47992, 47993, 47994, 47995, 47996, 47997, 47998, 47999, 48000, 48001, 48002, 48003, 48004, 48005, 48006, 48007, 48008, 48009, 48010, 48011, 48012, 48013, 48014, 48015, 48016, 48017, 48018, 48019, 48020, 48021,
|
||||
48022, 48023, 48024, 48025, 48026, 48027, 48028, 48030, 48032, 48034, 48036, 48038, 48039, 48040, 48041, 48042, 48043, 48044, 48045, 48046, 48047, 48048, 48049, 48050, 48051, 48052, 48053, 48054, 48055, 48056,
|
||||
48062, 48063, 48064, 48065, 48066, 48077, 48078, 48079, 48080, 48081, 48092, 48093, 48094, 48095, 48096, 48133, 48134, 48135, 48136, 48137, 48148, 48149, 48150, 48151, 48152, 48163, 48164, 48165, 48166, 48167,
|
||||
48178, 48179, 48180, 48181, 48182, 48193, 48194, 48195, 48196, 48197, 48208, 48209, 48210, 48211, 48212, 48223, 48224, 48225, 48226, 48227, 48238, 48239, 48240, 48241, 48242, 48255, 48256, 48257, 48258, 48259,
|
||||
48270, 48271, 48272, 48273, 48274, 48285, 48286, 48287, 48288, 48289, 48300, 48301, 48302, 48303, 48304, 48316, 48317, 48318, 48319, 48320, 48331, 48332, 48333, 48334, 48335, 48346, 48347, 48348, 48349, 48350,
|
||||
48361, 48362, 48363, 48364, 48365, 48376, 48377, 48378, 48379, 48380, 48391, 48392, 48393, 48394, 48395, 48430, 48446, 48450, 48452, 48454, 48461, 48462, 48463, 48464, 48465, 48481, 48482, 48483, 48484, 48485,
|
||||
48496, 48497, 48498, 48499, 48500, 48538, 48539, 48540, 48541, 48542, 48553, 48554, 48555, 48556, 48557, 48575, 48576, 48577, 48578, 48579, 48590, 48591, 48592, 48593, 48594, 48607, 48608, 48609, 48610, 48611,
|
||||
48622, 48623, 48624, 48625, 48626, 48637, 48638, 48639, 48640, 48641, 48657, 48658, 48659, 48660, 48661, 48666, 48667, 48668, 48669, 48670, 48671, 48672, 48673, 48674, 48675, 48693, 48695, 48697, 48699, 48701,
|
||||
48703, 48705, 48708, 48709, 48710, 48711, 48712, 48713, 48714, 48722, 48724, 49233, 49234, 49237, 49238 };
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user