Code:
/*
* ArcScripts for ArcEmu MMORPG Server
* Copyright (C) 2009 ArcEmu Team <http://www.arcemu.org/>
*
* 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 3 of the License, or
* 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, see <http://www.gnu.org/licenses/>.
*/
#include "StdAfx.h"
#include "Setup.h"
#include "../Common/Base.h"
static Coords RoomPoints[]=
{
{ 1646.411499f, -280.270538f, 417.321686f },
{ 1654.442139f, -296.619995f, 417.321686f },
{ 1649.935181f, -312.869995f, 417.321991f },
{ 1635.889160f, -323.114960f, 417.321991f },
{ 1626.588257f, -334.422952f, 417.321991f },
{ 1609.273315f, -325.008759f, 417.321991f },
{ 1613.084351f, -311.113373f, 417.321991f },
{ 1608.645264f, -300.140015f, 417.321991f },
{ 1611.737549f, -287.944885f, 417.321991f },
{ 1622.536509f, -289.462799f, 417.321991f },
{ 1634.319824f, -276.142670f, 417.321991f },
{ 1642.059082f, -288.031097f, 417.321991f },
{ 1654.436279f, -286.942200f, 417.321991f }
};
static Coords BlackHoleSpawns[]=
{
{ 1640.192749f, -313.252136f, 417.321686f, 2.244802f },
{ 1621.535767f, -311.449310f, 417.321686f, 0.723486f },
{ 1625.286743f, -291.989807f, 417.321686f, 5.373048f },
{ 1643.084351f, -301.061035f, 417.321686f, 3.614546f }
};
static Coords BronzebeardWaypoint[]=
{
{ 1632.451904f, -173.976532f, 427.262726f, 4.693232f, 0 },
{ 1631.937988f, -221.072922f, 418.409332f, 4.693232f, 0 }
};
static Coords LivingConstellationWP[]=
{
{ 1618.260010f, -303.169342f, 420.658508f, 6.241804f },
{ 1631.825928f, -319.399384f, 421.392365f, 1.560456f },
{ 1642.386353f, -305.013702f, 421.466583f, 3.218021f }
};
static Coords LivingConstellationSpawn[]=
{
{ 1678.458862f, -306.932587f, 438.095001f, 3.126851f },
{ 1588.860718f, -312.406250f, 536.889526f, 6.256645f },
{ 1633.562012f, -355.855469f, 434.713654f, 1.860765f }
};
static Coords AlgalonEndEvent[]=
{
{ 1632.140381f, -302.678314f, 417.321106f, 1.604511f },
{ 1632.315308f, -307.865356f, 417.321106f, 1.604511f }
};
enum ALGALON_DEFINES
{
// Game Objects
Doodad_UL_SigilDoor_01 = 194767,
Doodad_UL_UniverseGlobe_01 = 194148,
Doodad_UL_UniverseFloor_01 = 194715,
Doodad_UL_UniverseFloor_02 = 194716,
Doodad_UL_TrapDoor_03 = 194253,
Doodad_UL_SigilDoor_03 = 194910,
UL_GIFT_OF_THE_OBSERVER = 194821,
// Creatures
CN_ALGALON = 32871,
CN_BRANN = 33235, // used at intro scene
CN_AZEROTH = 34246,
CN_COLLAPSING_STAR = 32955,
CN_BLACK_HOLE = 32953,
CN_LIVING_CONSTELLATION = 33052,
CN_DARK_MATTER = 33089,
CN_UNLEASEHED_DARK_MATTER = 34097,
// Algalon Spells
ALGALON_QUANTUM_STRIKE_10 = 64395,
ALGALON_QUANTUM_STRIKE_25 = 64592,
ALGALON_BIG_BANG_10 = 64443,
ALGALON_BIG_BANG_25 = 64584,
ALGALON_BERSEK = 47008,
ALGALON_PHASE_PUNCH = 64412,
ALGALON_ASCEND_TO_HEAVENS = 64487,
// Stars spells
STAR_EXPLODE = 64122, // used on stars death
STAR_SUMMON_BLACK_HOLE = 62189,
// phase related spells
BLACK_HOLE_DAMAGE_AURA = 62169,
BLACK_HOLE_PHASE_AURA = 64417,
BLACK_HOLE_VISUAL_VOID_ZONE = 64017,
// Living Constellation spells
ARCANE_BARRAGE = 64599,
// thanks to Compboy for this 2 ids, start event spells
ALGALON_CHANNEL = 64996,
ALGALON_ARRIVAL = 64997,
// achievement killcredit spell
ALGALON_KILLCREDIT = 65184,
// Algalon Sound ids
UR_ALGALON_SUMMON01 = 15405, //UR_Algalon_Summon01.wav
UR_ALGALON_SUMMON02 = 15406, //UR_Algalon_Summon02.wav
UR_ALGALON_SUMMON03 = 15407, //UR_Algalon_Summon03.wav
UR_ALGALON_AGGRO01 = 15386, //UR_Algalon_Aggro01.wav
UR_ALGALON_ADDS01 = 15392, //UR_Algalon_Adds01.wav
UR_ALGALON_BHOLE01 = 15391, //UR_Algalon_BHole01.wav
UR_ALGALON_SPECIAL01 = 15396, //UR_Algalon_Special01.wav
UR_ALGALON_SPACE01 = 15390, //UR_Algalon_Space01.wav
UR_ALGALON_BERSERK01 = 15394, //UR_Algalon_Berzerk01.wav
// Branns sound ids
UR_BRANN_ALGALONSUMMONED01 = 15824, //UR_Brann_AlgalonSummoned01.wav
UR_BRANN_ALGALONSUMMONED02 = 15825, //UR_Brann_AlgalonSummoned02.wav
// timer macros
TIMER_STAR_01 = 15000,
TIMER_STAR_02 = 40000,
TIMER_START_DELAY = 12000,
TIMER_BIG_BANG = 90000,
TIMER_BIG_BANG_CAST = 8000,
TIMER_ENRAGE = 360000,
TIMER_SUMMON_DARK_MATTER = 30000,
TIMER_LIVING_CONSTELLATION_JOIN = 38000,
};
typedef std::vector<Creature*> EncounterArray;
class AlgalonAI : public MoonScriptBossAI
{
public:
MOONSCRIPT_FACTORY_FUNCTION(AlgalonAI, MoonScriptBossAI);
AlgalonAI(Creature* pCreature) : MoonScriptBossAI(pCreature)
{
AddPhaseSpell( 2, AddSpell( ALGALON_QUANTUM_STRIKE_10, Target_Current, 50, 0, 6 ) );
AddPhaseSpell( 2, AddSpell( ALGALON_PHASE_PUNCH, Target_Current, 99, 0, 12 ) );
AddPhaseSpell( 3, AddSpell( ALGALON_QUANTUM_STRIKE_10, Target_Current, 50, 0, 6 ) );
AddPhaseSpell( 3, AddSpell( ALGALON_PHASE_PUNCH, Target_Current, 99, 0, 12 ) );
mEnrage = AddSpell( ALGALON_BERSEK, Target_Self, 0, 0, 0 ); // 6 minutes enrage
AddEmote( Event_OnCombatStart, "Your actions are illogical. All possible results for this encounter have been calculated. The pantheon will receive the observer's message regardless outcome.", Text_Yell, UR_ALGALON_AGGRO01 );
SetCanEnterCombat( false );
SetFlyMode( true );
mIntro = true;
mFirstEncounter = true;
mEndScene = false;
mScene = 0;
mTimer = 0;
pAzeroth = NULL;
_bigBang = false;
mEnrageTimer = INVALIDATE_TIMER;
mAddTimer = INVALIDATE_TIMER;
mTimeoutTimer = INVALIDATE_TIMER;
mBigBangTimer = INVALIDATE_TIMER;
RegisterAIUpdateEvent( 1000 );
};
void OnCombatStart(Unit* pTarget)
{
// additional spell timers
mAddTimer = AddTimer( TIMER_STAR_01 + TIMER_START_DELAY ); // star timer
mBigBangTimer = AddTimer( TIMER_BIG_BANG + TIMER_START_DELAY ); //90 seconds + 12 seconds
mEnrageTimer = AddTimer( TIMER_ENRAGE ); // 6 minutes
_bigBang = false;
// add timers and stop him from doing anything
mTimeoutTimer = AddTimer( TIMER_START_DELAY );
DelayNextAttack( TIMER_START_DELAY );
_unit->SetUInt64Value( UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_9 );
SetAllowMelee( false );
SetAllowSpell( false );
SetAllowTargeting( false );
SetCanMove( false );
TriggerCooldownOnAllSpells();
ParentClass::OnCombatStart( pTarget );
};
void AIUpdate()
{
if( mIntro )
{
++mTimer;
switch( mTimer )
{
case 1:
case 5:
case 9:
case 12:
case 19:
case 29:
case 34:
IntroScene();
break;
};
}
if( GetHealthPercent() <= 3 && GetPhase() == 3 )
{
// lets set him out of combat
mEndScene = true;
SetCanEnterCombat(false);
_unit->GetAIInterface()->HandleEvent( EVENT_LEAVECOMBAT, _unit, 0 );
AddWaypoint(CreateWaypoint( 1, 0, Flag_Run, AlgalonEndEvent[1] ));
ForceWaypointMove( 1 );
};
if( GetHealthPercent() <= 20 && GetPhase() == 2 )
PhaseThree();
if( IsTimerFinished( mEnrageTimer ) )
{
CastSpellNowNoScheduling( mEnrage );
Emote( "You are... out of time.", Text_Yell, UR_ALGALON_BERSERK01 );
RemoveTimer( mEnrageTimer );
};
if( IsTimerFinished( mTimeoutTimer ) )
StartHandler();
if( IsTimerFinished( mAddTimer ) )
SummonStars();
if( IsTimerFinished( mBigBangTimer ) )
BigBang();
ParentClass::AIUpdate();
};
void OnCombatStop(Unit* pTarget)
{
DespawnAllEncounterCreatures();
if( pPlanet != NULL && pPlanet->GetState() == 0)
pPlanet->SetState(1);
if( pFloor1 != NULL && pFloor1->GetState() == 1)
pFloor1->SetState(0);
if( pFloor2 != NULL && pFloor2->GetState() == 0)
pFloor2->SetState(1);
if( pTrapDoor != NULL && pTrapDoor->GetState() == 0 )
pTrapDoor->SetState(1);
if( pLimitDoor != NULL && pFloor2->GetState() == 1 )
pLimitDoor->SetState(0);
ParentClass::OnCombatStop( pTarget );
if( !mEndScene )
{
/* to prevent possible bugs */
mFirstEncounter = false;
RemoveAIUpdateEvent();
_unit->SetUInt64Value( UNIT_FIELD_FLAGS, 0 );
}
};
void OnReachWP(uint32 iWaypointId, bool bForwards )
{
if ( iWaypointId == 1 )
{
/*for( set<Player*>::iterator PlayerIter = _unit->GetInRangePlayerSetBegin(); PlayerIter != _unit->GetInRangePlayerSetEnd(); ++PlayerIter )
{
(*PlayerIter)->CastSpell( (*PlayerIter), ALGALON_KILLCREDIT, true );
}*/
_unit->GetMapMgr()->GetInterface()->SpawnGameObject( UL_GIFT_OF_THE_OBSERVER, AlgalonEndEvent[0].mX, AlgalonEndEvent[0].mY, AlgalonEndEvent[0].mZ, AlgalonEndEvent[0].mO, false, 0, 0, 1 );
//RegisterAIUpdate( 1000 );
//_unit->CombatStatus.TryToClearAttackTargets();
};
};
void IntroScene()
{
if( mScene != 7 )
{
switch( mScene )
{
case 0:
_unit->CastSpell( _unit, ALGALON_ARRIVAL, true );
break;
case 1:
Emote( "Translocation complete. Commencing planetary analysis of Azeroth.", Text_Say, UR_ALGALON_SUMMON01 );
break;
case 2:
_unit->Emote( EMOTE_ONESHOT_SPELLCAST_OMNI );
SpawnCreature( CN_AZEROTH, 1631.762817f, -293.814301f, 417.321106f, 1.573153f );
break;
case 3:
Emote( "Stand back mortals. I am not here to fight you.", Text_Say, UR_ALGALON_SUMMON02 );
SetFlyMode( false );
pAzeroth = static_cast<Creature*>( ForceCreatureFind(CN_AZEROTH, 1631.762817f, -293.814301f, 417.321106f ) );
if( pAzeroth != NULL )
SetTargetToChannel( pAzeroth, ALGALON_CHANNEL );
break;
case 4:
Emote( "It is in the universe's best interest to re-originate this planet, should my analysis find systemic corruption. Do not interfere.", Text_Say, UR_ALGALON_SUMMON03 );
break;
case 5:
SetTargetToChannel( NULL, 0 );
pAzeroth->Despawn(0, 0);
break;
case 6:
SetCanEnterCombat( true );
mIntro = false;
RemoveAIUpdateEvent();
break;
}
++mScene;
}
};
void StartHandler()
{
if( mFirstEncounter )
{
Emote( "See your world through my eyes: A universe so vast as to be immeasurable - incomprehensible even to your greatest minds.", Text_Yell, UR_ALGALON_SPACE01 );
mFirstEncounter = false;
};
_unit->SetUInt64Value( UNIT_FIELD_FLAGS, 0 );
SetAllowMelee( true );
SetAllowSpell( true );
SetAllowTargeting( true );
SetCanMove( true );
TriggerCooldownOnAllSpells();
pPlanet = GetNearestGameObject( Doodad_UL_UniverseGlobe_01 );
if( pPlanet != NULL && pPlanet->GetState() == 1 )
pPlanet->SetState( 0 );
pFloor1 = GetNearestGameObject( Doodad_UL_UniverseFloor_01 );
if( pFloor1 != NULL && pFloor1->GetState() == 0 )
pFloor1->SetState( 1 );
pFloor2 = GetNearestGameObject( Doodad_UL_UniverseFloor_02 );
if( pFloor2 != NULL && pFloor2->GetState() == 1 )
pFloor2->SetState( 0 );
pTrapDoor = _unit->GetMapMgr()->GetInterface()->GetGameObjectNearestCoords( 1632.324585f, -246.840393f, 417.323151f, Doodad_UL_TrapDoor_03 );
if( pTrapDoor != NULL && pFloor2->GetState() == 1 )
pTrapDoor->SetState( 0 );
pLimitDoor = _unit->GetMapMgr()->GetInterface()->GetGameObjectNearestCoords( 1632.324585f, -246.840393f, 417.323151f, Doodad_UL_SigilDoor_03 );
if( pLimitDoor != NULL && pFloor2->GetState() == 0 )
pLimitDoor->SetState( 1 );
for( int i=0; i < 3; i++ )
{
SpawnCreature( CN_LIVING_CONSTELLATION, LivingConstellationSpawn[i].mX, LivingConstellationSpawn[i].mY, LivingConstellationSpawn[i].mZ, LivingConstellationSpawn[i].mO, 1 );
};
SetPhase( 2 );
RemoveTimer( mTimeoutTimer );
};
void SummonStars()
{
_unit->SendChatMessage(CHAT_MSG_RAID_BOSS_EMOTE, LANG_UNIVERSAL, "Algalon the Observer begins to Summon Collapsing Stars!" );
Emote( "The stars come to my aid.", Text_Yell, UR_ALGALON_ADDS01 );
uint32 mRandom = 0;
for( int i = 0; i < 4; i++ )
{
mRandom = RandomUInt( 11 );
SpawnCreature( CN_COLLAPSING_STAR, RoomPoints[mRandom].mX, RoomPoints[mRandom].mY, RoomPoints[mRandom].mZ, 0, true, 1 );
};
ResetTimer( mAddTimer, TIMER_STAR_02 );
};
void BigBang()
{
if( !_bigBang )
{
_unit->CastSpell( _unit, dbcSpell.LookupEntryForced(ALGALON_BIG_BANG_10), false );
_unit->SendChatMessage(CHAT_MSG_RAID_BOSS_EMOTE, LANG_UNIVERSAL, "Algalon the Observer begins to cast Big Bang!" );
Emote( "Witness the fury of cosmos!", Text_Yell, UR_ALGALON_SPECIAL01 );
_bigBang = true;
ResetTimer( mBigBangTimer, TIMER_BIG_BANG_CAST ); //8 seconds cast time
}
else
{
bool mPhasedPlayer = false;
for( set<Player*>::iterator PlayerIter = _unit->GetInRangePlayerSetBegin(); PlayerIter != _unit->GetInRangePlayerSetEnd(); ++PlayerIter )
{
if( (*PlayerIter)->GetPhase() == 1 )
mPhasedPlayer = true;
else
(*PlayerIter)->RemoveAura( BLACK_HOLE_PHASE_AURA );
}
if( mPhasedPlayer == false )
_unit->CastSpell( _unit, ALGALON_ASCEND_TO_HEAVENS, false ); // wipe raid
_bigBang = false;
ResetTimer( mBigBangTimer, TIMER_BIG_BANG );
};
};
void PhaseThree()
{
DespawnAllEncounterCreatures();
for( int i = 0; i < 4; ++i )
{
SpawnCreature( CN_BLACK_HOLE, BlackHoleSpawns[i].mX, BlackHoleSpawns[i].mY, BlackHoleSpawns[i].mZ, BlackHoleSpawns[i].mO, false );
};
Emote("Beware!", Text_Yell, UR_ALGALON_BHOLE01);
RemoveTimer( mAddTimer );
RemoveTimer( mBigBangTimer );
SetPhase( 3 );
};
void AddEncounterCreature( Creature* pCreature )
{
mEncounterArray.push_back( pCreature );
};
void DespawnAllEncounterCreatures()
{
for( vector<Creature*>::iterator CreatureIter = mEncounterArray.begin(); CreatureIter != mEncounterArray.end(); ++CreatureIter )
{
if( (*CreatureIter) != NULL )
(*CreatureIter)->Despawn( 0, 0);
};
mEncounterArray.clear();
};
void Destroy()
{
delete this;
};
// Vars:
// Game Objects
GameObject* pPlanet;
GameObject* pFloor1;
GameObject* pFloor2;
GameObject* pTrapDoor;
GameObject* pLimitDoor;
// Spell Desc
SpellDesc* mEnrage;
// Creature pointer
Creature* pAzeroth;
// boolean
bool mIntro;
bool mFirstEncounter;
bool mEndScene;
bool _bigBang;
// counters
uint32 mScene;
uint32 mTimer;
// timers
int32 mEnrageTimer;
int32 mAddTimer;
int32 mTimeoutTimer;
int32 mBigBangTimer;
private:
EncounterArray mEncounterArray;
};
class AlgalonDoorGO : public GameObjectAIScript
{
public:
AlgalonDoorGO(GameObject* goinstance) : GameObjectAIScript(goinstance) {}
static GameObjectAIScript *Create(GameObject* GO) { return new AlgalonDoorGO(GO); }
void OnActivate(Player* pPlayer)
{
RegisterAIUpdateEvent( 45000 );
_gameobject->GetMapMgr()->GetInterface()->SpawnCreature( CN_BRANN, BronzebeardWaypoint[0].mX, BronzebeardWaypoint[0].mY, BronzebeardWaypoint[0].mZ, BronzebeardWaypoint[0].mO, true, true, NULL, NULL, 1);
};
void AIUpdate()
{
_gameobject->GetMapMgr()->GetInterface()->SpawnCreature( CN_ALGALON, 1631.954712f, -303.857910f, 417.321167f, 1.482785f, true, true, NULL, NULL, 1);
_gameobject->Despawn( 1000, 0 );
};
void Destroy()
{
delete this;
};
};
class AzerothAI : public CreatureAIScript
{
public:
ADD_CREATURE_FACTORY_FUNCTION(AzerothAI);
AzerothAI(Creature* pCreature) : CreatureAIScript(pCreature) {};
void OnLoad()
{
_unit->SetUInt64Value( UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE );
_unit->GetAIInterface()->SetAllowedToEnterCombat( false );
};
void Destroy()
{
delete this;
};
};
class CollapsingStarAI : public MoonScriptCreatureAI
{
MOONSCRIPT_FACTORY_FUNCTION(CollapsingStarAI, MoonScriptCreatureAI);
CollapsingStarAI(Creature* pCreature) : MoonScriptCreatureAI(pCreature){}
void OnLoad()
{
RegisterAIUpdateEvent( 1000 );
_unit->GetAIInterface()->SetAllowedToEnterCombat( false );
SetAllowTargeting( false );
uint32 mRandom = RandomUInt( 11 );
MoveTo(RoomPoints[mRandom].mX, RoomPoints[mRandom].mY, RoomPoints[mRandom].mZ, false);
mMoveCounter = 0;
AlgalonAI* mAlgalon = NULL;
Creature* pAlgalon = static_cast<Creature*>(ForceCreatureFind( CN_ALGALON, 1632.250000f, -307.548004f, 416.264008f));
if ( pAlgalon != NULL && pAlgalon->GetScript() != NULL )
{
mAlgalon = (AlgalonAI*)(pAlgalon->GetScript());
mAlgalon->AddEncounterCreature( _unit );
}
pAlgalon = NULL;
mAlgalon = NULL;
};
void AIUpdate()
{
++mMoveCounter;
uint32 mHealth = _unit->GetUInt32Value(UNIT_FIELD_HEALTH);
_unit->SetUInt32Value( UNIT_FIELD_HEALTH, mHealth - ( mHealth / 100 ) ); // loose 1 pct every sec
if(mMoveCounter == 5)
{
uint32 mRandom = RandomUInt( 11 );
MoveTo(RoomPoints[mRandom].mX, RoomPoints[mRandom].mY, RoomPoints[mRandom].mZ, false);
mMoveCounter = 0;
};
ParentClass::AIUpdate();
};
void OnDied(Unit* pUnit)
{
_unit->CastSpell(_unit, STAR_EXPLODE, true );
_unit->CastSpell(_unit, STAR_SUMMON_BLACK_HOLE, true );
CancelAllSpells();
CancelAllTimers();
RemoveAllAuras();
Despawn( 1000, 0 );
};
void Destroy()
{
delete this;
};
private:
uint32 mMoveCounter;
};
class BlackHoleAI : public MoonScriptCreatureAI
{
MOONSCRIPT_FACTORY_FUNCTION(BlackHoleAI, MoonScriptCreatureAI);
BlackHoleAI(Creature* pCreature) : MoonScriptCreatureAI(pCreature){}
void OnLoad()
{
_unit->SetUInt64Value( UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE );
_unit->GetAIInterface()->SetAllowedToEnterCombat( false );
mVoidZone = false;
Creature* pAlgalon = static_cast<Creature*>(ForceCreatureFind( CN_ALGALON, 1632.250000f, -307.548004f, 416.264008f));
AlgalonAI* mAlgalon = NULL;
if ( pAlgalon != NULL && pAlgalon->GetScript() != NULL )
{
mAlgalon = (AlgalonAI*)(pAlgalon->GetScript());
mAlgalon->AddEncounterCreature( _unit );
if( mAlgalon->GetPhase() == 3 )
mPhaseTwo = true;
}
pAlgalon = NULL;
mAlgalon = NULL;
RegisterAIUpdateEvent( 100 );
};
void AIUpdate()
{
Unit* pPlayer = GetNearestPlayer();
if( pPlayer != NULL && pPlayer->isAlive() == true && pPlayer->GetDistance2dSq(static_cast<Object*>(_unit)) <= 3.5f )
{
if( !pPlayer->HasAura( BLACK_HOLE_PHASE_AURA ) )
{
_unit->CastSpell( pPlayer, BLACK_HOLE_DAMAGE_AURA, true);
pPlayer->CastSpell( pPlayer, BLACK_HOLE_PHASE_AURA, true);
}
};
Creature* pLivingConstellation = _unit->GetMapMgr()->GetInterface()->GetCreatureNearestCoords(_unit->GetPositionX(), _unit->GetPositionY(), _unit->GetPositionZ(), CN_LIVING_CONSTELLATION);
if( pLivingConstellation != NULL && pLivingConstellation->GetDistance2dSq(static_cast<Object*>(_unit)) <= 3.5f )
{
pLivingConstellation->Despawn( 0, 0 );
Despawn();
};
if( mPhaseTwo )
mSummonTimer = AddTimer( TIMER_SUMMON_DARK_MATTER );
if( IsTimerFinished( mSummonTimer ) )
{
SpawnCreature( CN_UNLEASEHED_DARK_MATTER );
ResetTimer( mSummonTimer, TIMER_SUMMON_DARK_MATTER );
}
if( !mVoidZone )
ApplyAura( BLACK_HOLE_VISUAL_VOID_ZONE );
};
void Destroy()
{
delete this;
};
private:
bool mVoidZone;
bool mPhaseTwo;
int32 mSummonTimer;
};
class LivingConstellationAI : public MoonScriptBossAI
{
MOONSCRIPT_FACTORY_FUNCTION(LivingConstellationAI, MoonScriptBossAI);
LivingConstellationAI(Creature* pCreature) : MoonScriptBossAI(pCreature)
{
AddPhaseSpell( 2, AddSpell( ARCANE_BARRAGE, Target_RandomPlayer, 100, 2, 5, 0, 60 ) );
SetFlyMode( true );
SetCanEnterCombat( false );
SetAllowMelee( false );
SetAllowSpell( false );
SetAllowTargeting( false);
SetCanMove( false );
};
void OnLoad()
{
Creature* pAlgalon = static_cast<Creature*>(ForceCreatureFind( CN_ALGALON, 1632.250000f, -307.548004f, 416.264008f));
AlgalonAI* mAlgalon = NULL;
if ( pAlgalon != NULL && pAlgalon->GetScript() != NULL )
{
mAlgalon = (AlgalonAI*)(pAlgalon->GetScript());
mAlgalon->AddEncounterCreature( _unit );
}
pAlgalon = NULL;
mAlgalon = NULL;
SetPhase( 1 );
mJoinTimer = AddTimer( TIMER_LIVING_CONSTELLATION_JOIN );
RegisterAIUpdateEvent( 1000 );
};
void AIUpdate()
{
if( GetPhase() == 1 )
{
if( IsTimerFinished( mJoinTimer ) )
{
SpawnCreature( CN_LIVING_CONSTELLATION );
RemoveTimer( mJoinTimer );
SetCanEnterCombat( true );
SetAllowSpell( true );
SetAllowTargeting( true );
SetCanMove( true );
SetPhase( 2 );
uint32 mRandom = RandomUInt( 2 );
AddWaypoint( CreateWaypoint( 1, 0, Flag_Fly, LivingConstellationWP[mRandom] ) );
ForceWaypointMove( 1 );
}
};
ParentClass::AIUpdate();
};
void OnDied(Unit* pKiller)
{
Despawn( 1000, 0 );
};
void OnReachWP(uint32 iWaypoinyId, bool bForwards)
{
if( !IsInCombat() )
AggroNearestPlayer(1);
};
void Destroy()
{
delete this;
};
int32 mJoinTimer;
};
class BrannBronzebeardAI : public MoonScriptCreatureAI
{
MOONSCRIPT_FACTORY_FUNCTION(BrannBronzebeardAI, MoonScriptCreatureAI);
BrannBronzebeardAI(Creature* pCreature) : MoonScriptCreatureAI(pCreature){}
void OnLoad()
{
mScene = 0;
RegisterAIUpdateEvent( 8000 );
};
void OnReachWP(uint32 iWaypointId, bool bForwards)
{
if(iWaypointId == 1)
{
Emote( "We did it lads! We got here before Algalon's arrival! Maybe we can rig the systems to interfere with his analysis.", Text_Yell, UR_BRANN_ALGALONSUMMONED01);
_unit->Emote(EMOTE_ONESHOT_TALK);
RegisterAIUpdateEvent(8000);
}
};
void AIUpdate()
{
if(mScene == 0)
{
for( int i=0; i < 2; i++ )
{
AddWaypoint(CreateWaypoint( i, 0, Flag_Walk, BronzebeardWaypoint[i]));
}
++mScene;
ForceWaypointMove(1);
RemoveAIUpdateEvent();
}
else if( mScene == 1)
{
Emote( "I'll head back to the Archivum and see if I can jam his signal. I might be able to buy us some time while you take care of him.", Text_Yell, UR_BRANN_ALGALONSUMMONED02);
_unit->Emote(EMOTE_ONESHOT_TALK);
RemoveAIUpdateEvent();
Despawn();
}
};
void Destroy()
{
delete this;
};
private:
int32 mScene;
};
class UnleashedDarkMatterAI : public MoonScriptCreatureAI
{
MOONSCRIPT_FACTORY_FUNCTION(UnleashedDarkMatterAI, MoonScriptCreatureAI);
UnleashedDarkMatterAI(Creature* pCreature) : MoonScriptCreatureAI(pCreature){}
void OnLoad()
{
Creature* pAlgalon = static_cast<Creature*>(ForceCreatureFind( CN_ALGALON, 1632.250000f, -307.548004f, 416.264008f));
AlgalonAI* mAlgalon = NULL;
if ( pAlgalon != NULL && pAlgalon->GetScript() != NULL )
{
mAlgalon = (AlgalonAI*)(pAlgalon->GetScript());
mAlgalon->AddEncounterCreature( _unit );
}
pAlgalon = NULL;
mAlgalon = NULL;
};
};
class PhasePunchAI : public SpellScript
{
public:
ADD_SPELL_FACTORY_FUNCTION(PhasePunchAI);
PhasePunchAI(Spell* spellinstance) : SpellScript(spellinstance) {};
void OnCast()
{
if( _spell->GetUnitTarget() && _spell->GetUnitTarget()->IsPlayer())
{
Player* pVictim = static_cast<Player*>(_spell->GetUnitTarget());
if ( pVictim->GetAuraStackCount( ALGALON_PHASE_PUNCH ) == 5 )
{
pVictim->RemoveAllAuraById( ALGALON_PHASE_PUNCH );
Aura* pAura = new Aura( dbcSpell.LookupEntryForced(BLACK_HOLE_PHASE_AURA), 10000, pVictim, pVictim, true);
if( pAura != NULL )
pVictim->AddAura(pAura, NULL);
};
}
};
};
void SetupAlgalon(ScriptMgr * mgr)
{
mgr->register_creature_script( CN_ALGALON, &AlgalonAI::Create);
mgr->register_creature_script( CN_AZEROTH, &AzerothAI::Create);
mgr->register_creature_script( CN_COLLAPSING_STAR, &CollapsingStarAI::Create);
mgr->register_creature_script( CN_BLACK_HOLE, &BlackHoleAI::Create);
mgr->register_creature_script( CN_BRANN, &BrannBronzebeardAI::Create);
mgr->register_creature_script( CN_LIVING_CONSTELLATION, &LivingConstellationAI::Create);
mgr->register_creature_script( CN_UNLEASEHED_DARK_MATTER, &UnleashedDarkMatterAI::Create );
mgr->register_gameobject_script( Doodad_UL_SigilDoor_01, &AlgalonDoorGO::Create);
//mgr->register_spell_script( ALGALON_PHASE_PUNCH, &PhasePunchAI::Create);
};
Please report BUGS and CRASHES here, i am using WhyDB, i will add queries tomorrow!