#include "StdAfx.h" #include "Setup.h" /************************************************************************/ /* Instance_Scholomance.cpp Script */ /************************************************************************/ /*****************************/ /* */ /* Boss AIs */ /* */ /*****************************/ // Doctor Theolen KrastinovAI #define CN_DOCTOR_THEOLEN_KRASTINOV 11261 //+ #define REND 18106 #define KRASTINOVCLEAVE 15584 #define FRENZY 28371 class DoctorTheolenKrastinovAI : public CreatureAIScript { public: ADD_CREATURE_FACTORY_FUNCTION(DoctorTheolenKrastinovAI); SP_AI_Spell spells[3]; bool m_spellcheck[3]; DoctorTheolenKrastinovAI(Creature* pCreature) : CreatureAIScript(pCreature) { FRENZY_LIMITER = 0; nrspells = 3; for(int i=0;iGetUInt32Value(UNIT_FIELD_BASEATTACKTIME)); } void OnCombatStop(Unit *mTarget) { FRENZY_LIMITER = 0; _unit->GetAIInterface()->setCurrentAgent(AGENT_NULL); _unit->GetAIInterface()->SetAIState(STATE_IDLE); RemoveAIUpdateEvent(); } void OnDied(Unit * mKiller) { FRENZY_LIMITER = 0; RemoveAIUpdateEvent(); } void AIUpdate() { if(_unit->GetHealthPct() <= 50 && FRENZY_LIMITER == 0) { // FRENZY _unit->CastSpell(_unit, spells[2].info, spells[2].instant); FRENZY_LIMITER = 1; } else { float val = sRand.rand(100.0f); SpellCast(val); } } void SpellCast(float val) { if(_unit->GetCurrentSpell() == NULL && _unit->GetAIInterface()->GetNextTarget()) { float comulativeperc = 0; Unit *target = NULL; for(int i=0;iGetAIInterface()->GetNextTarget(); switch(spells[i].targettype) { target = _unit->GetAIInterface()->GetNextTarget(); case TARGET_SELF: case TARGET_VARIOUS: _unit->CastSpell(_unit, spells[i].info, spells[i].instant); case TARGET_ATTACKING: _unit->CastSpell(target, spells[i].info, spells[i].instant); break; case TARGET_DESTINATION: _unit->CastSpellAoF(target->GetPositionX(),target->GetPositionY(),target->GetPositionZ(), spells[i].info, spells[i].instant); break; } m_spellcheck[i] = false; return; } if(val > comulativeperc && val <= (comulativeperc + spells[i].perctrigger)) { _unit->setAttackTimer(spells[i].attackstoptimer, false); m_spellcheck[i] = true; } comulativeperc += spells[i].perctrigger; } } } protected: uint32 FRENZY_LIMITER; int nrspells; }; // Instructor MaliciaAI #define CN_INSTRUCTOR_MALICIA 10505 //+ #define CALL_OF_GRAVE 17831 #define CORRUPTION 11672 #define FLASH_HEAL 17138 //10917 #define RENEW 10929 #define HEAL 15586 // not sure class InstructorMaliciaAI : public CreatureAIScript { public: ADD_CREATURE_FACTORY_FUNCTION(InstructorMaliciaAI); SP_AI_Spell spells[5]; bool m_spellcheck[5]; InstructorMaliciaAI(Creature* pCreature) : CreatureAIScript(pCreature) { nrspells = 5; for(int i=0;iGetUInt32Value(UNIT_FIELD_BASEATTACKTIME)); } void OnCombatStop(Unit *mTarget) { _unit->GetAIInterface()->setCurrentAgent(AGENT_NULL); _unit->GetAIInterface()->SetAIState(STATE_IDLE); RemoveAIUpdateEvent(); } void OnDied(Unit * mKiller) { RemoveAIUpdateEvent(); } void AIUpdate() { float val = sRand.rand(100.0f); SpellCast(val); } void SpellCast(float val) { if(_unit->GetCurrentSpell() == NULL && _unit->GetAIInterface()->GetNextTarget()) { float comulativeperc = 0; Unit *target = NULL; for(int i=0;iGetAIInterface()->GetNextTarget(); switch(spells[i].targettype) { target = _unit->GetAIInterface()->GetNextTarget(); case TARGET_SELF: case TARGET_VARIOUS: _unit->CastSpell(_unit, spells[i].info, spells[i].instant); case TARGET_ATTACKING: _unit->CastSpell(target, spells[i].info, spells[i].instant); break; case TARGET_DESTINATION: _unit->CastSpellAoF(target->GetPositionX(),target->GetPositionY(),target->GetPositionZ(), spells[i].info, spells[i].instant); break; } m_spellcheck[i] = false; return; } if(val > comulativeperc && val <= (comulativeperc + spells[i].perctrigger)) { _unit->setAttackTimer(spells[i].attackstoptimer, false); m_spellcheck[i] = true; } comulativeperc += spells[i].perctrigger; } } } protected: int nrspells; }; // The RavenianAI #define CN_THE_RAVENIAN 10507 //+ #define TRAMPLE 15550 #define RAVENIANCLEAVE 20691 #define SUNDERINCLEAVE 25174 #define KNOCKAWAY 10101 class TheRavenianAI : public CreatureAIScript { public: ADD_CREATURE_FACTORY_FUNCTION(TheRavenianAI); SP_AI_Spell spells[4]; bool m_spellcheck[4]; TheRavenianAI(Creature* pCreature) : CreatureAIScript(pCreature) { nrspells = 4; for(int i=0;iGetUInt32Value(UNIT_FIELD_BASEATTACKTIME)); } void OnCombatStop(Unit *mTarget) { _unit->GetAIInterface()->setCurrentAgent(AGENT_NULL); _unit->GetAIInterface()->SetAIState(STATE_IDLE); RemoveAIUpdateEvent(); } void OnDied(Unit * mKiller) { RemoveAIUpdateEvent(); } void AIUpdate() { float val = sRand.rand(100.0f); SpellCast(val); } void SpellCast(float val) { if(_unit->GetCurrentSpell() == NULL && _unit->GetAIInterface()->GetNextTarget()) { float comulativeperc = 0; Unit *target = NULL; for(int i=0;iGetAIInterface()->GetNextTarget(); switch(spells[i].targettype) { target = _unit->GetAIInterface()->GetNextTarget(); case TARGET_SELF: case TARGET_VARIOUS: _unit->CastSpell(_unit, spells[i].info, spells[i].instant); case TARGET_ATTACKING: _unit->CastSpell(target, spells[i].info, spells[i].instant); break; case TARGET_DESTINATION: _unit->CastSpellAoF(target->GetPositionX(),target->GetPositionY(),target->GetPositionZ(), spells[i].info, spells[i].instant); break; } m_spellcheck[i] = false; return; } if(val > comulativeperc && val <= (comulativeperc + spells[i].perctrigger)) { _unit->setAttackTimer(spells[i].attackstoptimer, false); m_spellcheck[i] = true; } comulativeperc += spells[i].perctrigger; } } } protected: int nrspells; }; // Lady Illucia BarovAI #define CN_LADY_ILLUCIA_BAROV 10502 //+ #define CURSE_OF_AGONY 18671 //+ #define SHADOW_SHOCK 20603 //+ #define SILENCE 15487 //+ #define ILLUCIA_FEAR 26580 //26661 //+ #define DOMINATE_MIND 20740 //+ class LadyIlluciaBarovAI : public CreatureAIScript { public: ADD_CREATURE_FACTORY_FUNCTION(LadyIlluciaBarovAI); SP_AI_Spell spells[5]; bool m_spellcheck[5]; LadyIlluciaBarovAI(Creature* pCreature) : CreatureAIScript(pCreature) { nrspells = 5; for(int i=0;iGetUInt32Value(UNIT_FIELD_BASEATTACKTIME)); } void OnCombatStop(Unit *mTarget) { _unit->GetAIInterface()->setCurrentAgent(AGENT_NULL); _unit->GetAIInterface()->SetAIState(STATE_IDLE); RemoveAIUpdateEvent(); } void OnDied(Unit * mKiller) { RemoveAIUpdateEvent(); } void AIUpdate() { float val = sRand.rand(100.0f); SpellCast(val); } void SpellCast(float val) { if(_unit->GetCurrentSpell() == NULL && _unit->GetAIInterface()->GetNextTarget()) { float comulativeperc = 0; Unit *target = NULL; for(int i=0;iGetAIInterface()->GetNextTarget(); switch(spells[i].targettype) { target = _unit->GetAIInterface()->GetNextTarget(); case TARGET_SELF: case TARGET_VARIOUS: _unit->CastSpell(_unit, spells[i].info, spells[i].instant); case TARGET_ATTACKING: _unit->CastSpell(target, spells[i].info, spells[i].instant); break; case TARGET_DESTINATION: _unit->CastSpellAoF(target->GetPositionX(),target->GetPositionY(),target->GetPositionZ(), spells[i].info, spells[i].instant); break; } m_spellcheck[i] = false; return; } if(val > comulativeperc && val <= (comulativeperc + spells[i].perctrigger)) { _unit->setAttackTimer(spells[i].attackstoptimer, false); m_spellcheck[i] = true; } comulativeperc += spells[i].perctrigger; } } } protected: int nrspells; }; // Ras ForstwhisperAI #define CN_RAS_FORSTWHISPER 10508 //+ #define FROSTBOLT 21369 //+ #define ICE_ARMOR 18100 //+ #define FREEZE 18763 //+ #define RAS_FEAR 26070 //+ #define CHILL_NOVA 18099 //+ #define FROSTBOLT_VOLLEY 22643 //8398 class RasForstwhisperAI : public CreatureAIScript { public: ADD_CREATURE_FACTORY_FUNCTION(RasForstwhisperAI); SP_AI_Spell spells[6]; bool m_spellcheck[6]; RasForstwhisperAI(Creature* pCreature) : CreatureAIScript(pCreature) { nrspells = 6; for(int i=0;iGetUInt32Value(UNIT_FIELD_BASEATTACKTIME)); _unit->CastSpell(_unit, spells[1].info, spells[1].instant); } void OnCombatStop(Unit *mTarget) { _unit->GetAIInterface()->setCurrentAgent(AGENT_NULL); _unit->GetAIInterface()->SetAIState(STATE_IDLE); RemoveAIUpdateEvent(); } void OnDied(Unit * mKiller) { RemoveAIUpdateEvent(); } void AIUpdate() { float val = sRand.rand(100.0f); SpellCast(val); } void SpellCast(float val) { if(_unit->GetCurrentSpell() == NULL && _unit->GetAIInterface()->GetNextTarget()) { float comulativeperc = 0; Unit *target = NULL; for(int i=0;iGetAIInterface()->GetNextTarget(); switch(spells[i].targettype) { target = _unit->GetAIInterface()->GetNextTarget(); case TARGET_SELF: case TARGET_VARIOUS: _unit->CastSpell(_unit, spells[i].info, spells[i].instant); case TARGET_ATTACKING: _unit->CastSpell(target, spells[i].info, spells[i].instant); break; case TARGET_DESTINATION: _unit->CastSpellAoF(target->GetPositionX(),target->GetPositionY(),target->GetPositionZ(), spells[i].info, spells[i].instant); break; } m_spellcheck[i] = false; return; } if(val > comulativeperc && val <= (comulativeperc + spells[i].perctrigger)) { _unit->setAttackTimer(spells[i].attackstoptimer, false); m_spellcheck[i] = true; } comulativeperc += spells[i].perctrigger; } } } protected: int nrspells; }; // Jandice BarovAI #define CN_JANDICE_BAROV 10503 //+ #define CURSE_OF_BLOOD 24673 #define SUMMON_ILLUSION 17773 #define BANISH 39674 // not sure //8994 class JandiceBarovAI : public CreatureAIScript { public: ADD_CREATURE_FACTORY_FUNCTION(JandiceBarovAI); SP_AI_Spell spells[3]; bool m_spellcheck[3]; JandiceBarovAI(Creature* pCreature) : CreatureAIScript(pCreature) { nrspells = 3; for(int i=0;iGetUInt32Value(UNIT_FIELD_BASEATTACKTIME)); } void OnCombatStop(Unit *mTarget) { _unit->GetAIInterface()->setCurrentAgent(AGENT_NULL); _unit->GetAIInterface()->SetAIState(STATE_IDLE); RemoveAIUpdateEvent(); } void OnDied(Unit * mKiller) { RemoveAIUpdateEvent(); } void AIUpdate() { float val = sRand.rand(100.0f); SpellCast(val); } void SpellCast(float val) { if(_unit->GetCurrentSpell() == NULL && _unit->GetAIInterface()->GetNextTarget()) { float comulativeperc = 0; Unit *target = NULL; for(int i=0;iGetAIInterface()->GetNextTarget(); switch(spells[i].targettype) { target = _unit->GetAIInterface()->GetNextTarget(); case TARGET_SELF: case TARGET_VARIOUS: _unit->CastSpell(_unit, spells[i].info, spells[i].instant); case TARGET_ATTACKING: _unit->CastSpell(target, spells[i].info, spells[i].instant); break; case TARGET_DESTINATION: _unit->CastSpellAoF(target->GetPositionX(),target->GetPositionY(),target->GetPositionZ(), spells[i].info, spells[i].instant); break; } m_spellcheck[i] = false; return; } if(val > comulativeperc && val <= (comulativeperc + spells[i].perctrigger)) { _unit->setAttackTimer(spells[i].attackstoptimer, false); m_spellcheck[i] = true; } comulativeperc += spells[i].perctrigger; } } } protected: int nrspells; }; // KormokAI #define CN_KORMOK 14491 //+ #define SHADOW_BOLT_VOLLEY 20741 #define BONE_SHIELD 27688 #define SUMMON_RISEY_LACKEY 17618 // not sure class KormokAI : public CreatureAIScript { public: ADD_CREATURE_FACTORY_FUNCTION(KormokAI); SP_AI_Spell spells[3]; bool m_spellcheck[3]; KormokAI(Creature* pCreature) : CreatureAIScript(pCreature) { nrspells = 3; for(int i=0;iGetUInt32Value(UNIT_FIELD_BASEATTACKTIME)); _unit->CastSpell(_unit, spells[1].info, spells[1].instant); } void OnCombatStop(Unit *mTarget) { _unit->GetAIInterface()->setCurrentAgent(AGENT_NULL); _unit->GetAIInterface()->SetAIState(STATE_IDLE); RemoveAIUpdateEvent(); } void OnDied(Unit * mKiller) { RemoveAIUpdateEvent(); } void AIUpdate() { float val = sRand.rand(100.0f); SpellCast(val); } void SpellCast(float val) { if(_unit->GetCurrentSpell() == NULL && _unit->GetAIInterface()->GetNextTarget()) { float comulativeperc = 0; Unit *target = NULL; for(int i=0;iGetAIInterface()->GetNextTarget(); switch(spells[i].targettype) { target = _unit->GetAIInterface()->GetNextTarget(); case TARGET_SELF: case TARGET_VARIOUS: _unit->CastSpell(_unit, spells[i].info, spells[i].instant); case TARGET_ATTACKING: _unit->CastSpell(target, spells[i].info, spells[i].instant); break; case TARGET_DESTINATION: _unit->CastSpellAoF(target->GetPositionX(),target->GetPositionY(),target->GetPositionZ(), spells[i].info, spells[i].instant); break; } m_spellcheck[i] = false; return; } if(val > comulativeperc && val <= (comulativeperc + spells[i].perctrigger)) { _unit->setAttackTimer(spells[i].attackstoptimer, false); m_spellcheck[i] = true; } comulativeperc += spells[i].perctrigger; } } } protected: int nrspells; }; // VectusAI #define CN_VECTUS 10432 //+ #define FIRE_SHIELD 19627 #define BLAST_WAVE 13021 #define FRENZY 28371 class VectusAI : public CreatureAIScript { public: ADD_CREATURE_FACTORY_FUNCTION(VectusAI); SP_AI_Spell spells[3]; bool m_spellcheck[3]; VectusAI(Creature* pCreature) : CreatureAIScript(pCreature) { FRENZY_LIMITER = 0; nrspells = 3; for(int i=0;iGetUInt32Value(UNIT_FIELD_BASEATTACKTIME)); _unit->CastSpell(_unit, spells[1].info, spells[1].instant); } void OnCombatStop(Unit *mTarget) { FRENZY_LIMITER = 0; _unit->GetAIInterface()->setCurrentAgent(AGENT_NULL); _unit->GetAIInterface()->SetAIState(STATE_IDLE); RemoveAIUpdateEvent(); } void OnDied(Unit * mKiller) { FRENZY_LIMITER = 0; RemoveAIUpdateEvent(); } void AIUpdate() { if(_unit->GetHealthPct() <= 25 && !FRENZY_LIMITER) { _unit->CastSpell(_unit, spells[2].info, spells[2].instant); FRENZY_LIMITER = 1; } float val = sRand.rand(100.0f); SpellCast(val); } void SpellCast(float val) { if(_unit->GetCurrentSpell() == NULL && _unit->GetAIInterface()->GetNextTarget()) { float comulativeperc = 0; Unit *target = NULL; for(int i=0;iGetAIInterface()->GetNextTarget(); switch(spells[i].targettype) { target = _unit->GetAIInterface()->GetNextTarget(); case TARGET_SELF: case TARGET_VARIOUS: _unit->CastSpell(_unit, spells[i].info, spells[i].instant); case TARGET_ATTACKING: _unit->CastSpell(target, spells[i].info, spells[i].instant); break; case TARGET_DESTINATION: _unit->CastSpellAoF(target->GetPositionX(),target->GetPositionY(),target->GetPositionZ(), spells[i].info, spells[i].instant); break; } m_spellcheck[i] = false; return; } if(val > comulativeperc && val <= (comulativeperc + spells[i].perctrigger)) { _unit->setAttackTimer(spells[i].attackstoptimer, false); m_spellcheck[i] = true; } comulativeperc += spells[i].perctrigger; } } } protected: uint32 FRENZY_LIMITER; int nrspells; }; // Lord Alexei BarovAI #define CN_LORD_ALEXEI_BAROV 10504 //+ #define UNHOLY_AURA 17467 #define IMMOLATE 20294 #define VEIL_OF_SHADOW 17820 class LordAlexeiBarovAI : public CreatureAIScript { public: ADD_CREATURE_FACTORY_FUNCTION(LordAlexeiBarovAI); SP_AI_Spell spells[3]; bool m_spellcheck[3]; LordAlexeiBarovAI(Creature* pCreature) : CreatureAIScript(pCreature) { nrspells = 3; for(int i=0;iGetUInt32Value(UNIT_FIELD_BASEATTACKTIME)); _unit->CastSpell(_unit, spells[0].info, spells[0].instant); } void OnCombatStop(Unit *mTarget) { _unit->GetAIInterface()->setCurrentAgent(AGENT_NULL); _unit->GetAIInterface()->SetAIState(STATE_IDLE); RemoveAIUpdateEvent(); } void OnDied(Unit * mKiller) { RemoveAIUpdateEvent(); } void AIUpdate() { float val = sRand.rand(100.0f); SpellCast(val); } void SpellCast(float val) { if(_unit->GetCurrentSpell() == NULL && _unit->GetAIInterface()->GetNextTarget()) { float comulativeperc = 0; Unit *target = NULL; for(int i=0;iGetAIInterface()->GetNextTarget(); switch(spells[i].targettype) { target = _unit->GetAIInterface()->GetNextTarget(); case TARGET_SELF: case TARGET_VARIOUS: _unit->CastSpell(_unit, spells[i].info, spells[i].instant); case TARGET_ATTACKING: _unit->CastSpell(target, spells[i].info, spells[i].instant); break; case TARGET_DESTINATION: _unit->CastSpellAoF(target->GetPositionX(),target->GetPositionY(),target->GetPositionZ(), spells[i].info, spells[i].instant); break; } m_spellcheck[i] = false; return; } if(val > comulativeperc && val <= (comulativeperc + spells[i].perctrigger)) { _unit->setAttackTimer(spells[i].attackstoptimer, false); m_spellcheck[i] = true; } comulativeperc += spells[i].perctrigger; } } } protected: int nrspells; }; // Lorekeeper PolkeltAI #define CN_LOREKEEPER_POLKELT 10901 //+ #define VOLATILE_INFECTION 24928 // wrong id // can cause crashes as it is casted on caster too #define DARK_PLAGUE 18270 // sure it should be here? #define CORROSIVE_ACID 19463 // Added Corrosive Acid Spit; 16359 or 20667 or 19463 or 19463 // 23313 #define NOXIOUS_CATALYST 18151 class LorekeeperPolkeltAI : public CreatureAIScript { public: ADD_CREATURE_FACTORY_FUNCTION(LorekeeperPolkeltAI); SP_AI_Spell spells[4]; bool m_spellcheck[4]; LorekeeperPolkeltAI(Creature* pCreature) : CreatureAIScript(pCreature) { nrspells = 4; for(int i=0;iGetUInt32Value(UNIT_FIELD_BASEATTACKTIME)); } void OnCombatStop(Unit *mTarget) { _unit->GetAIInterface()->setCurrentAgent(AGENT_NULL); _unit->GetAIInterface()->SetAIState(STATE_IDLE); RemoveAIUpdateEvent(); } void OnDied(Unit * mKiller) { RemoveAIUpdateEvent(); } void AIUpdate() { float val = sRand.rand(100.0f); SpellCast(val); } void SpellCast(float val) { if(_unit->GetCurrentSpell() == NULL && _unit->GetAIInterface()->GetNextTarget()) { float comulativeperc = 0; Unit *target = NULL; for(int i=0;iGetAIInterface()->GetNextTarget(); switch(spells[i].targettype) { target = _unit->GetAIInterface()->GetNextTarget(); case TARGET_SELF: case TARGET_VARIOUS: _unit->CastSpell(_unit, spells[i].info, spells[i].instant); case TARGET_ATTACKING: _unit->CastSpell(target, spells[i].info, spells[i].instant); break; case TARGET_DESTINATION: _unit->CastSpellAoF(target->GetPositionX(),target->GetPositionY(),target->GetPositionZ(), spells[i].info, spells[i].instant); break; } m_spellcheck[i] = false; return; } if(val > comulativeperc && val <= (comulativeperc + spells[i].perctrigger)) { _unit->setAttackTimer(spells[i].attackstoptimer, false); m_spellcheck[i] = true; } comulativeperc += spells[i].perctrigger; } } } protected: int nrspells; }; // Darkmaster GandlingAI #define CN_DARKMASTER_GANDLING 1853 //+ #define ARCANE_MISSILES 25346 #define CURSE_OF_THE_DARKMASTER 18702 #define SHADOW_SHIELD 22417 class DarkmasterGandlingAI : public CreatureAIScript { public: ADD_CREATURE_FACTORY_FUNCTION(DarkmasterGandlingAI); SP_AI_Spell spells[3]; bool m_spellcheck[3]; DarkmasterGandlingAI(Creature* pCreature) : CreatureAIScript(pCreature) { nrspells = 3; // 4 ? for(int i=0;iGetUInt32Value(UNIT_FIELD_BASEATTACKTIME)); _unit->CastSpell(_unit, spells[2].info, spells[2].instant); } void OnCombatStop(Unit *mTarget) { _unit->GetAIInterface()->setCurrentAgent(AGENT_NULL); _unit->GetAIInterface()->SetAIState(STATE_IDLE); RemoveAIUpdateEvent(); } void OnDied(Unit * mKiller) { RemoveAIUpdateEvent(); } void AIUpdate() { float val = sRand.rand(100.0f); SpellCast(val); } void SpellCast(float val) { if(_unit->GetCurrentSpell() == NULL && _unit->GetAIInterface()->GetNextTarget()) { float comulativeperc = 0; Unit *target = NULL; for(int i=0;iGetAIInterface()->GetNextTarget(); switch(spells[i].targettype) { target = _unit->GetAIInterface()->GetNextTarget(); case TARGET_SELF: case TARGET_VARIOUS: _unit->CastSpell(_unit, spells[i].info, spells[i].instant); case TARGET_ATTACKING: _unit->CastSpell(target, spells[i].info, spells[i].instant); break; case TARGET_DESTINATION: _unit->CastSpellAoF(target->GetPositionX(),target->GetPositionY(),target->GetPositionZ(), spells[i].info, spells[i].instant); break; } m_spellcheck[i] = false; return; } if(val > comulativeperc && val <= (comulativeperc + spells[i].perctrigger)) { _unit->setAttackTimer(spells[i].attackstoptimer, false); m_spellcheck[i] = true; } comulativeperc += spells[i].perctrigger; } } } protected: int nrspells; }; void SetupScholomance(ScriptMgr * mgr) { mgr->register_creature_script(CN_DOCTOR_THEOLEN_KRASTINOV, &DoctorTheolenKrastinovAI::Create); mgr->register_creature_script(CN_INSTRUCTOR_MALICIA, &InstructorMaliciaAI::Create); mgr->register_creature_script(CN_THE_RAVENIAN, &TheRavenianAI::Create); mgr->register_creature_script(CN_LADY_ILLUCIA_BAROV, &LadyIlluciaBarovAI::Create); mgr->register_creature_script(CN_RAS_FORSTWHISPER, &RasForstwhisperAI::Create); mgr->register_creature_script(CN_JANDICE_BAROV, &JandiceBarovAI ::Create); mgr->register_creature_script(CN_KORMOK, &KormokAI::Create); mgr->register_creature_script(CN_VECTUS, &VectusAI::Create); mgr->register_creature_script(CN_LORD_ALEXEI_BAROV, &LordAlexeiBarovAI::Create); mgr->register_creature_script(CN_LOREKEEPER_POLKELT, &LorekeeperPolkeltAI::Create); mgr->register_creature_script(CN_DARKMASTER_GANDLING, &DarkmasterGandlingAI::Create); } // Who should be added ? // *Kirtonos the Herald // *Death Knight Darkreaver // *Lord Blackwood // *Marduk Blackpool // *Rattlegore