rendered paste body//WORK!!! but we have core bug, if u get damage the AURA_PLAYER_IS_TELEPORTED fades from you...//Note: Kalecgos (dragon form) and Sathrovarr (demon) need to be killed at the same time, so compare health percentages every once in a while.//todo://i dont find the wall around apex point//server crash when you deal more damage as shathrovarr hp in gm mode//flying away#define KALECAGOS_Z 53#define SHATHROVARR_Z -74#define fligh_up_x 1704#define fligh_up_y 928#define fligh_up_z 75#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//kalecgos spells:#define ARCANE_BUFFET 45018#define FROST_BREATH 44799#define HEROIC_STRIKE 45026#define TAIL_LASH 45122//kalecgos human form spells#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 KALECAGOS_TELEPORT 44866 //summon go, and dealdmg(currently) (spellname: spectral blast)#include "sc_creature.h"#include "GameObject.h"#include "SpellAuras.h"#include "sc_gossip.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; bool flight; uint32 flighttime; uint32 station; Unit *target; bool gameobject_spawned; uint64 shathrovarr; boss_kalecgosAI(Creature *c) : ScriptedAI(c) { Reset(); } void Reset(){ wild_magics[0] = 44978; wild_magics[1] = 45001; wild_magics[2] = 45002; wild_magics[3] = 45004; wild_magics[4] = 45006; wild_magics[5] = 45010; arcane_buffet_timer = 8000; frost_breath_timer = 25000; wild_magic_timer = 10000; spectral_blast_timer = 20000+5000; gameobject_despawn_timer = 2000; gameobject_spawned = false; flight = false; flighttime = 2000; station = 0; m_creature->setEmoteState(EMOTE_STATE_SLEEP); } void Aggro(Unit* who) { m_creature->setEmoteState(0); } void KilledUnit(Unit *victim) { } void UpdateAI(const uint32 diff) { 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<HostilReference *> t_list = m_creature->getThreatManager().getThreatList(); for(std::list<HostilReference *>::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, KALECAGOS_TELEPORT); spectral_blast_timer = 20000+(rand()%5000); gameobject_spawned = true; }else spectral_blast_timer -= diff; /*need correction... if(flight){ if(flighttime < diff){ if(station == 0){ m_creature->SendMonsterMove(fligh_up_x,fligh_up_y,fligh_up_z,0,0,2000); //need flags m_creature->Relocate(fligh_up_x,fligh_up_y,fligh_up_z); flighttime = 2000; station++; }else if(station == 1){ m_creature->SendMonsterMove(fligh_away_x,fligh_away_y,fligh_away_z,0,0,10000); //need flags m_creature->Relocate(fligh_away_x,fligh_away_y,fligh_away_z); station++; flighttime = 10000; }else if(station == 2){ m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); } }else flighttime -= diff; }*/ DoMeleeAttackIfReady(); }};struct MANGOS_DLL_DECL boss_kalecgos_humanAI : public ScriptedAI{ uint32 revitalize_timer; bool revitalize; boss_kalecgos_humanAI(Creature *c) : ScriptedAI(c) { Reset(); } void Reset(){ revitalize_timer = 10000; revitalize = false; } void Aggro(Unit* who) { } void JustDied(Unit *victim) { } void UpdateAI(const uint32 diff) { if (!m_creature->SelectHostilTarget() || !m_creature->getVictim()) return; 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 *kalecagos_human; uint32 refresh; std::list<HostilReference *> lastgroup; boss_SathrovarrAI(Creature *c) : ScriptedAI(c) { } void Reset(){ shadow_bolt_volley_timer = 5000; course_of_bundless_agony_timer = 20000; corruption_strike_timer = 13000; refresh = 1000; DoCast(m_creature,AURA_PLAYER_IS_TELEPORTED); } void Aggro(Unit* who) { summon_kacoegos_human(); } void JustDied(Unit *victim) { Unit *goback; for(std::list<HostilReference *>::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(),KALECAGOS_Z,goback->GetOrientation()); } } if(kalecagos_human) kalecagos_human->DealDamage(kalecagos_human, kalecagos_human->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); m_creature->Relocate(m_creature->GetPositionX(),m_creature->GetPositionY(),KALECAGOS_Z); //good } 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(refresh < diff){ Unit *goback; std::list<HostilReference *> t_list = m_creature->getThreatManager().getThreatList(); for(std::list<HostilReference *>::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)){ //relocating dont work good currently.. //m_creature->Say("iam on:".x."!",0,0); ((Player*)goback)->TeleportTo(goback->GetMapId(),goback->GetPositionX(),goback->GetPositionY(),KALECAGOS_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 != kalecagos_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 != kalecagos_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 != kalecagos_human && m_creature->GetDistance(target) < 5) break; } if(target) DoCast(target, CORRUPTING_STRIKE); corruption_strike_timer = 13000; }else corruption_strike_timer -= diff; //human form - i dont have idea...he speak &?:D /*if(kalecagos_human){ if(m_creature->getVictim() != kalecagos_human) ((boss_kalecgos_humanAI*)kalecagos_human->AI())->revitalize = true;*/ /*if(!kalecagos_human->isAlive()){ //end of fight(kill all player in 2.dimension) Unit *target; std::list<HostilReference *> t_list = m_creature->getThreatManager().getThreatList(); for(std::list<HostilReference *>::iterator itr = t_list.begin(); itr!= t_list.end(); ++itr) { target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid()); m_creature->DealDamage(target, target->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); } }*/ DoMeleeAttackIfReady(); lastgroup = m_creature->getThreatManager().getThreatList(); } void summon_kacoegos_human() { kalecagos_human = DoSpawnCreature(KALECGOS_HUMAN_FORM_ID, 0, 0, 0, 0, TEMPSUMMON_DEAD_DESPAWN, 500000); kalecagos_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;}