//WORK!!! but we have core bug, if u get damage the AURA_PLAYER_IS_TELEPORTED fades from you... //todo: - need mooore dataaa //cleanup && redesign main project:D //EndOfFight(); //KALEC_SAY_FRIENDLY_ON_NEAR_LOSING - why wo where because?:D //say @ spellcasting //i find the go but i cant spawn.. the wall:) //server crash when you deal more damage as shathrovarr hp in gm mode - bug@threat list #define KALEC_SAY_NON_FRIENDLY_ON_AGGRO "No longer will I be a slave to Malygos! Challenge me and you will be destroyed!" #define KALEC_SAY_NON_FRIENDLY_ON_KILL_1 "In the name of Kil'jaeden!" #define KALEC_SAY_NON_FRIENDLY_ON_KILL_2 "You were warned!" #define KALEC_SAY_NON_FRIENDLY_BEFORE_FLY_AWAY "My awakening is complete! You shall all perish!" #define KALEC_SAY_NON_FRIENDLY_ON_SPELL_1 "I will purge you!" #define KALEC_SAY_NON_FRIENDLY_ON_SPELL_2 "Your pain has only begun!" #define KALEC_SAY_FRIENDLY_ON_AGGRO "I need... your help... Cannot... resist him... much longer..." #define KALEC_SAY_FRIENDLY_ON_LOSING "Aaahhh! Help me, before I lose my mind!" #define KALEC_SAY_FRIENDLY_ON_NEAR_LOSING "Hurry! There is not much of me left!" //??? #define KALEC_SAY_FRIENDLY_AT_END "I am forever in your debt. Once we have triumphed over Kil'jaeden, this entire world will be in your debt as well." #define SHAT_SAY_ON_AGGRO "Gyahaha... There will be no reprieve. My work here is nearly finished." #define SHAT_SAY_ON_KILL_1 "Pitious mortal!" #define SHAT_SAY_ON_KILL_2 "Haven't you heard? I always win!" #define SHAT_SAY_ON_ENRANGE "I have toyed with you long enough!" #define SHAT_SAY_ON_DIE "I'm... never on... the losing... side..." #define SHAT_SAY_ON_SPELL_1 "Your misery is my delight!" #define SHAT_SAY_ON_SPELL_2 "I will watch you bleed!" #define WALL_AROUND_APEX_POINT 188421 #define KALECGOS_Z 53 #define SHATHROVARR_Z -74 #define fligh_away_x 1551 #define fligh_away_y 788 #define fligh_away_z 121 #define TELEPORT_GO 187055 #define KALECGOS_HUMAN_FORM_ID 24891 #define SPELL_BANISH 40370 #define BERSERK 0 //kalecgos spells: #define ARCANE_BUFFET 45018 #define FROST_BREATH 44799 #define TAIL_LASH 45122 //kalecgos human form spells #define HEROIC_STRIKE 45026 //aggro..:) #define REVITALIZE 45027 //Shathrovarr spells #define CORRUPTING_STRIKE 45029 #define COURSE_OF_BUNDLESS_AGONY 45032 #define SHADOW_BOLT_VOLLEY 45031 //realmswitching #define AURA_PLAYER_NOT_ABLE_TO_TELEPORT 44867 #define AURA_PLAYER_IS_TELEPORTED 46021 //if we get damage this fades...(i think bug@invisibility:) #define KALECGOS_TELEPORT 44866 //summon go, and dealdmg(currently) (spellname: spectral blast) #include "sc_creature.h" #include "GameObject.h" #include "sc_gossip.h" #include "PointMovementGenerator.h" #include "def_sunwell_plateau.h" struct MANGOS_DLL_DECL boss_kalecgosAI : public ScriptedAI { uint32 wild_magics[6]; uint32 arcane_buffet_timer; uint32 frost_breath_timer; uint32 wild_magic_timer; uint32 spectral_blast_timer; uint32 gameobject_despawn_timer; uint32 checktimer ; bool flight; Unit *target; ScriptedInstance *pInstance; Unit *tempunit; boss_kalecgosAI(Creature *c) : ScriptedAI(c) { pInstance = (c->GetInstanceData()) ? ((ScriptedInstance*)c->GetInstanceData()) : NULL; Reset(); } void Reset(){ m_creature->setFaction(14); wild_magics[0] = 44978; wild_magics[1] = 45001; wild_magics[2] = 45002; wild_magics[3] = 45004; wild_magics[4] = 45006; wild_magics[5] = 45010; pInstance->SetData(DATA_KALEC_FLY,0); checktimer = 10000; arcane_buffet_timer = 8000; frost_breath_timer = 25000; wild_magic_timer = 10000; spectral_blast_timer = 20000+5000; flight = false; } void Aggro(Unit* who) { m_creature->setEmoteState(0); DoYell(KALEC_SAY_NON_FRIENDLY_ON_AGGRO,LANG_UNIVERSAL,NULL); } void KilledUnit(Unit *victim) { switch(rand()%2){ case 0: DoYell(KALEC_SAY_NON_FRIENDLY_ON_KILL_1,LANG_UNIVERSAL,NULL); break; case 1: DoYell(KALEC_SAY_NON_FRIENDLY_ON_KILL_2,LANG_UNIVERSAL,NULL); break; } } void JustDied(Unit *victim){ tempunit = Unit::GetUnit((*m_creature),pInstance->GetData64(DATA_SHATHROVARR)); if(tempunit) if(tempunit->isAlive()){ EndOfFight(); } //he can't die...but...:) } void UpdateAI(const uint32 diff) { if(pInstance->GetData(DATA_KALEC_FLY) == 1 && flight == false){ m_creature->AttackStop(); flight = true; m_creature->setFaction(35); //friendly DoYell(KALEC_SAY_NON_FRIENDLY_BEFORE_FLY_AWAY,LANG_UNIVERSAL,NULL); m_creature->GetMotionMaster()->Mutate(new PointMovementGenerator(0, fligh_away_x, fligh_away_y, fligh_away_z)); }else{ if (!m_creature->SelectHostilTarget() || !m_creature->getVictim()) return; if(arcane_buffet_timer < diff) { DoCast(m_creature->getVictim(), ARCANE_BUFFET); arcane_buffet_timer = 8000; } else arcane_buffet_timer -= diff; if(arcane_buffet_timer < diff) { DoCast(m_creature->getVictim(), FROST_BREATH); arcane_buffet_timer = 25000; } else arcane_buffet_timer -= diff; if(wild_magic_timer < diff) { Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 0); int wild_num = rand()%5; DoCast(target, wild_magics[wild_num]); wild_magic_timer = 10000; } else wild_magic_timer -= diff; if(spectral_blast_timer < diff) { Unit *goback; std::list t_list = m_creature->getThreatManager().getThreatList(); for(std::list::iterator itr = t_list.begin(); itr!= t_list.end(); ++itr) { goback = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid()); if(goback->GetTypeId() == TYPEID_PLAYER){ if(!goback->HasAura(AURA_PLAYER_NOT_ABLE_TO_TELEPORT,0) && goback != m_creature->getVictim()){ target = goback; } } } if(target) DoCast(target, KALECGOS_TELEPORT); spectral_blast_timer = 20000+(rand()%5000); }else spectral_blast_timer -= diff; if(checktimer < diff){ tempunit = Unit::GetUnit((*m_creature),pInstance->GetData64(DATA_SHATHROVARR)); if(!tempunit) return; uint32 percent_shat = (tempunit->GetHealth()*100)/tempunit->GetMaxHealth(); uint32 percent_kalec = (m_creature->GetHealth()*100)/m_creature->GetMaxHealth(); if(!(percent_shat-percent_kalec < 5 && percent_shat-percent_kalec > -5)) // 5% is tipp EndOfFight(); if(percent_kalec < 2 && percent_shat > 1) DoCast(m_creature,SPELL_BANISH); checktimer = 10000; }else checktimer -= diff; DoMeleeAttackIfReady(); } } void EndOfFight(){ //...need more data DoYell(KALEC_SAY_FRIENDLY_ON_LOSING,LANG_UNIVERSAL,NULL); } }; struct MANGOS_DLL_DECL boss_kalecgos_humanAI : public ScriptedAI { uint32 revitalize_timer; uint32 heroic_timer; bool revitalize; boss_kalecgos_humanAI(Creature *c) : ScriptedAI(c) { Reset(); } void Reset(){ DoCast(m_creature,44670);//transform to kalec:) revitalize_timer = 10000; heroic_timer = 1000; revitalize = false; } void Aggro(Unit* who) { DoYell(KALEC_SAY_FRIENDLY_ON_AGGRO,LANG_UNIVERSAL,NULL); } void JustDied(Unit *victim) { DoYell(KALEC_SAY_FRIENDLY_ON_LOSING,LANG_UNIVERSAL,NULL); } void UpdateAI(const uint32 diff) { if(!m_creature->HasAura(AURA_PLAYER_IS_TELEPORTED,0)) DoCast(m_creature,AURA_PLAYER_IS_TELEPORTED); if (!m_creature->SelectHostilTarget() || !m_creature->getVictim()) return; if(!revitalize && heroic_timer < diff){ DoCast(m_creature->getVictim(),HEROIC_STRIKE); heroic_timer = 1000; }else heroic_timer -= diff; if(revitalize_timer < diff && revitalize){ DoCast(m_creature,REVITALIZE); revitalize_timer = 10000; }else revitalize_timer -= diff; if(revitalize){ m_creature->AttackStop(); }else{DoMeleeAttackIfReady();} } }; struct MANGOS_DLL_DECL boss_SathrovarrAI : public ScriptedAI { uint32 corruption_strike_timer; uint32 course_of_bundless_agony_timer; uint32 shadow_bolt_volley_timer; Creature *kalecgos_human; uint32 refresh; std::list lastgroup; ScriptedInstance *pInstance; bool kalecgos_unsummoned; Unit *tempunit; boss_SathrovarrAI(Creature *c) : ScriptedAI(c) { Reset(); pInstance = (c->GetInstanceData()) ? ((ScriptedInstance*)c->GetInstanceData()) : NULL; } void Reset(){ shadow_bolt_volley_timer = 5000; kalecgos_unsummoned = true; course_of_bundless_agony_timer = 20000; corruption_strike_timer = 13000; refresh = 1000; DoCast(m_creature,AURA_PLAYER_IS_TELEPORTED); } void Aggro(Unit* who) { DoYell(SHAT_SAY_ON_AGGRO,LANG_UNIVERSAL,NULL); } void KilledUnit(Unit *){ switch(rand()%2){ case 0: DoYell(SHAT_SAY_ON_KILL_1,LANG_UNIVERSAL,NULL); break; case 1: DoYell(SHAT_SAY_ON_KILL_2,LANG_UNIVERSAL,NULL); break; } } void JustDied(Unit *victim) { m_creature->SetCorpseDelay(600000); DoYell(SHAT_SAY_ON_DIE,LANG_UNIVERSAL,NULL); Unit *goback; tempunit = Unit::GetUnit((*m_creature),pInstance->GetData64(DATA_KALECGOS)); if(tempunit){ lastgroup = tempunit->getThreatManager().getThreatList(); for(std::list::iterator itr = lastgroup.begin(); itr!= lastgroup.end(); ++itr) { goback = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid()); if(goback->GetTypeId() == TYPEID_PLAYER){ ((Player*)goback)->TeleportTo(goback->GetMapId(),goback->GetPositionX(),goback->GetPositionY(),KALECGOS_Z,goback->GetOrientation()); } } } if(kalecgos_human){ ((boss_kalecgos_humanAI*)kalecgos_human->AI())->DoYell(KALEC_SAY_FRIENDLY_AT_END,LANG_UNIVERSAL,NULL); kalecgos_human->DealDamage(kalecgos_human, kalecgos_human->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); kalecgos_human->RemoveCorpse(); } m_creature->Relocate(m_creature->GetPositionX(),m_creature->GetPositionY(),KALECGOS_Z); pInstance->SetData(DATA_KALEC_FLY,1); //flymodeon:) } void UpdateAI(const uint32 diff) { if(kalecgos_unsummoned){ summon_kalecgos_human(); kalecgos_unsummoned = false; } if(!m_creature->HasAura(AURA_PLAYER_IS_TELEPORTED,0)) DoCast(m_creature,AURA_PLAYER_IS_TELEPORTED); if (!m_creature->SelectHostilTarget() || !m_creature->getVictim()) return; if(refresh < diff){ Unit *goback; std::list t_list = m_creature->getThreatManager().getThreatList(); for(std::list::iterator itr = t_list.begin(); itr!= t_list.end(); ++itr) { goback = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid()); if(goback->GetTypeId() == TYPEID_PLAYER){ if(!goback->HasAura(AURA_PLAYER_IS_TELEPORTED,0)){ ((Player*)goback)->TeleportTo(goback->GetMapId(),goback->GetPositionX(),goback->GetPositionY(),KALECGOS_Z,goback->GetOrientation()); goback->CastSpell(goback,AURA_PLAYER_NOT_ABLE_TO_TELEPORT,false); m_creature->getThreatManager().getThreatList().remove((*itr)); } } } refresh = 1000; }else refresh -= diff; if(shadow_bolt_volley_timer< diff) { Unit *target; for(int i = 0; i<10; ++i){ target = SelectUnit(SELECT_TARGET_RANDOM, 0); if(target != kalecgos_human) break; } if(target) DoCast(target, SHADOW_BOLT_VOLLEY); shadow_bolt_volley_timer = 10000+(rand()%5000); }else shadow_bolt_volley_timer -= diff; if(course_of_bundless_agony_timer < diff) { Unit *target; for(int i = 0; i<10; ++i){ target = SelectUnit(SELECT_TARGET_RANDOM, 0); if(target != kalecgos_human) break; } if(target) DoCast(target, COURSE_OF_BUNDLESS_AGONY); course_of_bundless_agony_timer = 20000; }else course_of_bundless_agony_timer -= diff; if(corruption_strike_timer < diff) { Unit *target; for(int i = 0; i<10; ++i){ target = SelectUnit(SELECT_TARGET_RANDOM, 0); if(target != kalecgos_human && m_creature->GetDistance(target) < 5) break; } if(target) DoCast(target, CORRUPTING_STRIKE); corruption_strike_timer = 13000; }else corruption_strike_timer -= diff; if(kalecgos_human){ if(m_creature->getVictim() != kalecgos_human){ ((boss_kalecgos_humanAI*)kalecgos_human->AI())->revitalize = true; }else{ ((boss_kalecgos_humanAI*)kalecgos_human->AI())->revitalize = false; } } if((m_creature->GetHealth()*100)/m_creature->GetMaxHealth() < 5){ //enrange kalecgos DoYell(SHAT_SAY_ON_ENRANGE,LANG_UNIVERSAL,NULL); tempunit = Unit::GetUnit((*m_creature),pInstance->GetData64(DATA_KALECGOS)); if(tempunit) DoCast(tempunit,BERSERK); } DoMeleeAttackIfReady(); } void summon_kalecgos_human() { kalecgos_human = DoSpawnCreature(KALECGOS_HUMAN_FORM_ID, 0, 0, 0, 0, TEMPSUMMON_DEAD_DESPAWN, 500000); kalecgos_human ->Attack(m_creature); } }; CreatureAI* GetAI_boss_kalecgos(Creature *_Creature) { return new boss_kalecgosAI (_Creature); } CreatureAI* GetAI_boss_Sathrovarr(Creature *_Creature) { return new boss_SathrovarrAI (_Creature); } CreatureAI* GetAI_boss_kalecgos_human(Creature *_Creature) { return new boss_kalecgos_humanAI (_Creature); } bool GOkalocegos_teleporter(Player *player, GameObject* _GO) { if(player->HasAura(AURA_PLAYER_NOT_ABLE_TO_TELEPORT,0)) return false; ((Player*)player)->TeleportTo(player->GetMapId(),player->GetPositionX(),player->GetPositionY(),SHATHROVARR_Z,player->GetOrientation()); player->CastSpell(player,AURA_PLAYER_IS_TELEPORTED,true); return false; } void AddSC_boss_kalecgos() { Script *newscript; newscript = new Script; newscript->Name="boss_kalecgos"; newscript->GetAI = GetAI_boss_kalecgos; m_scripts[nrscripts++] = newscript; newscript = new Script; newscript->Name="boss_Sathrovarr"; newscript->GetAI = GetAI_boss_Sathrovarr; m_scripts[nrscripts++] = newscript; newscript = new Script; newscript->Name="boss_kalecgos_human"; newscript->GetAI = GetAI_boss_kalecgos_human; m_scripts[nrscripts++] = newscript; newscript = new Script; newscript->Name="kalocegos_teleporter"; newscript->pGOHello = GOkalocegos_teleporter; m_scripts[nrscripts++] = newscript; }