All pastes #884793 Raw Edit

Unbenannt

public cpp v1 · immutable
#884793 ·published 2008-01-30 16:40 UTC
rendered paste body
/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>* This program is free software; you can redistribute it and/or modify* it under the terms of the GNU General Public License as published by* the Free Software Foundation; either version 2 of the License, or* (at your option) any later version.** This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the* GNU General Public License for more details.** You should have received a copy of the GNU General Public License* along with this program; if not, write to the Free Software* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA*/   #include "../../../sc_defines.h"#define SPELL_ARCANE_MISSLES                 33031                 #define SPELL_MARK_OF_THE_ASTROMANCER        42783#define SPELL_BLINDING_LIGHT                 33009#define SPELL_FEAR                           29321#define SPELL_VOID_BOLT                      39329#define SAY_PHASE1                           "Tal anu'men no Sin'dorei!"#define SAY_PHASE2                           "I will crush your delusions of grandeur!"#define SAY_PHASE21                          "Ha ha ha! You are hopelessly outmatched!"#define SAY_VOID                             "Enough of this! Now I call upon the fury of the cosmos itself."#define SAY_VOID1                            "I become ONE... with the VOID!"#define SAY_KILL1                            "Your soul belongs to the Abyss!"#define SAY_KILL2                            "By the blood of the Highborne!"#define SAY_KILL3                            "For the Sunwell!"#define SAY_DEATH                            "The warmth of the sun... awaits."#define POS1_X                               444.67  #define POS1_Y                               -365.50#define POS1_Z                               17.524 #define POS1_O                               2.2540#define POS2_X                               421.34#define POS2_Y                               -381.12#define POS2_Z                               17.327#define POS2_O                               1.8959#define POS3_X                               439.42#define POS3_Y                               -387.85#define POS3_Z                               17.196#define POS3_O                               2.0027#define SOLARIUM_AGENT                       18925#define SOLARIUM_PRIEST                      18806#define MODEL_VOIDWALKER                     17981#define MODEL_HUMAN                          18805struct MANGOS_DLL_DECL boss_high_astromancer_solarianAI : public ScriptedAI{	boss_high_astromancer_solarianAI(Creature *c) : ScriptedAI(c)	{		pInstance = (c->GetInstanceData()) ? ((ScriptedInstance*)c->GetInstanceData()) : NULL		Void = 0;		EnterEvadeMode();	}		ScriptedInstance *pInstance;		uint32 ArcaneMissles_Timer;	uint32 MarkOfTheAstromancer_Timer;	uint32 BlindingLight_Timer;	uint32 Fear_Timer;	uint32 VoidBolt_Timer;	uint32 Phase1_Timer;	uint32 Phase2_Timer;	uint32 Phase3_Timer;	uint32 Summon_Timer;		bool HumanForm;	bool VoidForm;	bool InCombat;		uint3 Phase;		uint64 Void;		void EnterEvadeMode(){		ArcaneMissles_Timer = 5000;		MarkOfTheAstromancer_Timer = 15000;		BlindingLight_Timer = 45000;		Fear_Timer = 20000;		VoidBolt_Timer = 10000;		Phase1_Timer = 50000;		Phase2_Timer = 10000;		Phase3_Timer = 15000;		Summon_Timer = 10000;		HumanForm = true;		InCombat = false;		VoidForm = false;		Phase = 1;				m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, MODEL_HUMAN)				m_creature->RemoveAllAuras();		m_creature->DeleteThreatList();		m_creature->CombatStop();		DoGoHome();				if(pInstance)			pInstance->SetData("HighAstromancerSolarianEvent", 0);					m_creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_INTERRUPT, true);	}		void StartEvent()	{		DoYell(SAY_PHASE1, LANG_UNIVERSAL, NULL);				if(pInstance)			pInstance->SetData("HighAstromancerSolarianEvent", 1);					InCombat = true;			}		void KIlledUnit(Unit *victim)	{		switch(rand()%3)		{			case 0:			DoYell(SAY_KILL1, LANG_UNIVERSAL, NULL);			break;						case 1:			DoYell(SAY_KILL2, LANG_UNIVERSAL, NULL);			break;						case 2:			DoYell(SAY_KILL3, LANG_UNIVERSAL, NULL);		}	}		void JustDied(Unit *victim)	{		DoYell(SAY_DEATH, LANG_UNIVERSAL, NULL);				if(pInstance)			pInstance->SetData("HighAstromancerSolarianEvent", 0);	}		void AttackStart(Unit *who)	{		if(!who && who !=m_creature)			return;					if (who->IsTargetableForAttack() && who!= m_creature)		{			//Begin melee attack if we are within range			DoStartMeleeAttack(who);						if(!InCombat)				StartEvent();		}	}		void MoveInLineOfSight(Unit *who)	{		if (!who || m_creature->getVictim())			return;					if (who->isTargetableForAttack() && who->IsInAccessablePlaceFor(m_creature) && m_creature->IsHostileTo(who))		{			float attackRadius = m_creature->GetAttackDistance(who);			if (m_creature->IsWithinDistInMan(who. attackRadius) && m_creature->GetDistanceZ(who) <= CREATURE_Z_ATTACK_RANGE && m_creature->IsWithinLOSInMap(who))			{				if(who->HasStealthAura())					who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);									DoStartMeleeAttack(who);								if(!InCombat)					StartEvent();			}		}	}		void UpdateAI(const uint32 diff)	{		//Return since we have no target		if(!m_creature->SelectHostilTarget() || !m_creature->getVictim() );			return;					if (Phase == 1)		{			//ArcaneMissles_Timer			if (ArcaneMissles_Timer < diff)			{				//Solarian casts Arcane Missiles on on random targets in the raid.				Unit *target = NULL;				target = SelectUnit(SELECT_TARGET_RANDOM, 0);								if(target)					DoCast(target, SPELL_ARCANE_MISSLES);									ArcaneMissles_Timer = 4000;			}else ArcaneMissles_Timer -= diff;						//MarkOfTheAstromancer_Timer			if (MarkOfTheAstromancer_Timer < diff)			{				//A debuff that lasts for 5 seconds, cast several times each phase on a random raid member, but not the main tank				Unit *target = NULL;				target = SelectUnit(SELECT_TARGET_RANDOM, 1);								if(target)					DoCast(target, SPELL_MARK_OF_THE_ASTROMANCER);									MarkOfTheAstromancer_Timer = 15000;			}else MarkOfTheAstromancer_Timer -= diff;						//BlindingLight_Timer			if (BlindingLight_Timer < diff)			{				//She casts this spell every 45 seconds. It is a kind of Moonfire spell, which she strikes down on the whole raid simultaneously. It hits everyone in the raid for 2280 to 2520 arcane damage.				DoCast(m_creature->getVictim(), SPELL_BLINDING_LIGHT);								BlindingLight_Timer = 45000;			}else BlindingLight_Timer -= diff;					//Phase1_Timer			if (Phase1_Timer < diff)			{				Phase = 2;				Phase1_Timer = 50000;				//After these 50 seconds she portals to the middle of the room and disappears, leaving 3 light portals behind.				m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);				m_creature->SetVisibility(VISIBILITY_OFF);								m_creature->RemoveAllAuras();								switch (rand()%2)				{					case 0:					DoYell(SAY_PHASE2, LANG_UNIVERSAL, NULL);					break;										case 1:					DoYell(SAY_PHASE21, LANG_UNIVERSAL, NULL);					break;				}			}		} else if(Phase == 2){							//10 seconds after Solarian disappears, 12 mobs spawn out of the three portals.				if (Phase2_Timer < diff)				{				  Phase = 3;				  Creature *Solarian_Agent;				  Solarian_Agent = m_creature->SummonCreature(SOLARIAN_AGENT, POS1_X, POS1_Y, POS1_Z, POS1_O, TEMPSUMMON_CORPSE_DESPAWN, 0);				  Solarian_Agent = m_creature->SummonCreature(SOLARIAN_AGENT, POS1_X, POS1_Y, POS1_Z, POS1_O, TEMPSUMMON_CORPSE_DESPAWN, 0);				  Solarian_Agent = m_creature->SummonCreature(SOLARIAN_AGENT, POS1_X, POS1_Y, POS1_Z, POS1_O, TEMPSUMMON_CORPSE_DESPAWN, 0);				  Solarian_Agent = m_creature->SummonCreature(SOLARIAN_AGENT, POS1_X, POS1_Y, POS1_Z, POS1_O, TEMPSUMMON_CORPSE_DESPAWN, 0);				  Solarian_Agent = m_creature->SummonCreature(SOLARIAN_AGENT, POS2_X, POS2_Y, POS2_Z, POS2_O, TEMPSUMMON_CORPSE_DESPAWN, 0);				  Solarian_Agent = m_creature->SummonCreature(SOLARIAN_AGENT, POS2_X, POS2_Y, POS2_Z, POS2_O, TEMPSUMMON_CORPSE_DESPAWN, 0);				  Solarian_Agent = m_creature->SummonCreature(SOLARIAN_AGENT, POS2_X, POS2_Y, POS2_Z, POS2_O, TEMPSUMMON_CORPSE_DESPAWN, 0);				  Solarian_Agent = m_creature->SummonCreature(SOLARIAN_AGENT, POS2_X, POS2_Y, POS2_Z, POS2_O, TEMPSUMMON_CORPSE_DESPAWN, 0);				  Solarian_Agent = m_creature->SummonCreature(SOLARIAN_AGENT, POS3_X, POS3_Y, POS3_Z, POS3_O, TEMPSUMMON_CORPSE_DESPAWN, 0);				  Solarian_Agent = m_creature->SummonCreature(SOLARIAN_AGENT, POS3_X, POS3_Y, POS3_Z, POS3_O, TEMPSUMMON_CORPSE_DESPAWN, 0);				  Solarian_Agent = m_creature->SummonCreature(SOLARIAN_AGENT, POS3_X, POS3_Y, POS3_Z, POS3_O, TEMPSUMMON_CORPSE_DESPAWN, 0);				  Solarian_Agent = m_creature->SummonCreature(SOLARIAN_AGENT, POS3_X, POS3_Y, POS3_Z, POS3_O, TEMPSUMMON_CORPSE_DESPAWN, 0);				  Phase2_Timer = 10000;				} else Phase2_Timer -= diff;		} else if(Phase == 3){								//Check Phase3_Timer				if(Phase3_Timer < diff)				{					m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);					m_creature->SetVisibility(VISIBILITY_ON);										DoYell(SAY_PHASE1, LANG_UNIVERSAL, NULL);										//15 seconds later Solarian reappears out of one of the 3 portals. Simultaneously, 2 healers appear in the two other portals.					switch(rand()%3)					{						case 0:						  m_creature->GetMotionMaster()->Clear();						  m_creature->Relocate(POS1_X, POS1_Y, POS1_Z, POS1_O);						  m_creature->SendMoveToPacket(POS1_X, POS1_Y, POS1_Z, POS1_O, false, 0);												  Creature *Solarian_Priest;						  Solarian_Priest = m_creature->SummonCreature(SOLARIAN_PRIEST, POS2_X, POS2_Y, POS2_Z, POS2_O, TEMPSUMMON_CORPSE_DESPAWN, 0);						  Solarian_Priest = m_creature->SummonCreature(SOLARIAN_PRIEST, POS3_X, POS3_Y, POS3_Z, POS3_O, TEMPSUMMON_CORPSE_DESPAWN, 0);												  break;												case 1:						  m_creature->GetMotionMaster()->Clear();						  m_creature->Relocate(POS2_X, POS2_Y, POS2_Z, POS2_O);						  m_creature->SendMoveToPacket(POS2_X, POS2_Y, POS2_Z, POS2_O, false, 0);												  Creature *Solarian_Priest;						  Solarian_Priest = m_creature->SummonCreature(SOLARIAN_PRIEST, POS1_X, POS1_Y, POS1_Z, POS1_O, TEMPSUMMON_CORPSE_DESPAWN, 0);						  Solarian_Priest = m_creature->SummonCreature(SOLARIAN_PRIEST, POS3_X, POS3_Y, POS3_Z, POS3_O, TEMPSUMMON_CORPSE_DESPAWN, 0);												  break;												case 2:						  m_creature->GetMotionMaster()->Clear();						  m_creature->Relocate(POS3_X, POS3_Y, POS3_Z, POS3_O);						  m_creature->SendMoveToPacket(POS3_X, POS3_Y, POS3_Z, POS3_O, false, 0);												  Creature *SolarianPriest;						  Solarian_Priest = m_creature->SummonCreature(SOLARIAN_PRIEST, POS1_X, POS1_Y, POS1_Z, POS1_O, TEMPSUMMON_CORPSE_DESPAWN, 0);						  Solarian_Priest = m_creature->SummonCreature(SOLARIAN_PRIEST, POS2_X, POS2_Y, POS2_Z, POS2_O, TEMPSUMMON_CORPSE_DESPAWN, 0);												  break;					}					Phase = 1;					Phase3_Timer = 25000;				}else Phase3_Timer -= diff;		  } else if(Phase == 4){			  //Fear_Timer				if (Fear_Timer < diff)				{					Unit *target = NULL;					target = SelectUnit(SELECT_TARGET_TOPAGGRO, 1);										if(target)					  DoCast(target, SPELL_FEAR);					Fear_Timer = 20000;				}else Fear_Timer -= diff;								//VoidBolt_Timer				if (VoidBolt_Timer < diff)				{					Unit *target = NULL;					target = SelectUnit(SELECT_TARGET_TOPAGGRO, 1);										if(target)					  DoCast(target, SPELL_VOID_BOLT);					VoidBolt_Timer = 10000;				}else VoidBolt_Timer -= diff;			}						//When Solarian reaches 20% she will transform into a huge void walker.			if(Phase != 4 && ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth())<20))			{									Phase = 4;										//To make sure she wont be invisible or not selecatble					m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);					m_creature->SetVisibility(VISIBILITY_ON);					m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, MODEL_VOIDWALKER);					m_creature->SetUInt32Value(UNIT_FIELD_ARMOR, 30000);					m_creature->SetFloatValue(UNIT_FIELD_SCALE_X, 3);					switch(rand()%2)					{						case 0:						DoYell(SAY_VOID, LANG_UNIVERSAL, NULL);						break;												case 1:						DoYell(SAY_VOID1, LANG_UNIVERSAL, NULL);						break;					}									}							DoMeleeAttackIfReady();			}		}	}};CreatureAI* GetAI_boss_high_astromancer_solarian(Creature *_Creature){	return new boss_high_astromancer_solarianAI (_Creature);}void AddSC_boss_high_astromancer_solarian(){	Script *newscript;	newscript = new Script;	newscript->Name="boss_high_astromancer_solarian";	newscript->GetAI = GetAI_boss_high_astromancer_solarian;	m_scripts[nrscripts++] = newscript;}