--HG--
branch : trunk
This commit is contained in:
megamage
2009-04-29 16:51:27 -05:00
16 changed files with 2969 additions and 880 deletions
@@ -405,17 +405,6 @@ void hyjalAI::Reset()
//Visibility
DoHide = true;
//CreatureList.clear();
//If Jaina evades, reset the visibility of all other creatures in the grid.
/*if(CreatureList.empty())
return;
for(std::list<uint64>::iterator itr = CreatureList.begin(); itr != CreatureList.end(); ++itr)
if(Creature* cr = (Unit::GetCreature(*m_creature, *itr)))
cr->SetVisibility(VISIBILITY_ON);
CreatureList.clear();*/
}
void hyjalAI::EnterEvadeMode()
@@ -505,9 +494,6 @@ void hyjalAI::SummonCreature(uint32 entry, float Base[4][3])
++EnemyCount;
pCreature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
//pCreature->GetMotionMaster()->MovePoint(0, AttackLoc[0],AttackLoc[1],AttackLoc[2]);
//pCreature->AddThreat(m_creature, 0.0f);
//DoZoneInCombat(pCreature);
pCreature->setActive(true);
switch(entry)
{
@@ -675,44 +661,10 @@ void hyjalAI::UpdateWorldState(uint32 id, uint32 state)
player->SendUpdateWorldState(id,state);
}
}else debug_log("TSCR: HyjalAI: UpdateWorldState, but PlayerList is empty");
//remove everything above this line only when/if the core patch for this is accepted and needed
//m_creature->GetMap()->UpdateWorldState(field, value);
}
void hyjalAI::Retreat()
{
/*CellPair pair(Trinity::ComputeCellPair(m_creature->GetPositionX(), m_creature->GetPositionY()));
Cell cell(pair);
cell.data.Part.reserved = ALL_DISTRICT;
cell.SetNoCreate();
// First get all creatures.
std::list<Creature*> creatures;
Trinity::AllFriendlyCreaturesInGrid creature_check(m_creature);
Trinity::CreatureListSearcher<Trinity::AllFriendlyCreaturesInGrid> creature_searcher(m_creature, creatures, creature_check);
TypeContainerVisitor
<Trinity::CreatureListSearcher<Trinity::AllFriendlyCreaturesInGrid>,
GridTypeMapContainer> creature_visitor(creature_searcher);
CellLock<GridReadGuard> cell_lock(cell, pair);
// Get Creatures
cell_lock->Visit(cell_lock, creature_visitor, *(m_creature->GetMap()));
CreatureList.clear();
if(!creatures.empty())
{
for(std::list<Creature*>::iterator itr = creatures.begin(); itr != creatures.end(); ++itr)
{
(*itr)->CastSpell(*itr, SPELL_TELEPORT_VISUAL, true);
(*itr)->setFaction(35);//make them friendly so mobs won't attack them
CreatureList.push_back((*itr)->GetGUID());
}
DoCast(m_creature, SPELL_TELEPORT_VISUAL);
bRetreat = true;
RetreatTimer = 1000;
}*/
{
if(pInstance)
{
if(Faction == 0)
@@ -732,8 +684,6 @@ void hyjalAI::Retreat()
JainaDummy->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
((hyjalAI*)JainaDummy->AI())->IsDummy = true;
DummyGuid = JainaDummy->GetGUID();
//((hyjalAI*)JainaDummy->AI())->MassTeleportTimer = 20000;
//((hyjalAI*)JainaDummy->AI())->DoMassTeleport = true;
}
AddWaypoint(0,JainaDummySpawn[1][0],JainaDummySpawn[1][1],JainaDummySpawn[1][2]);
Start(false, false, false);
@@ -867,11 +817,6 @@ void hyjalAI::UpdateAI(const uint32 diff)
}
if(Overrun)
DoOverrun(Faction, diff);
/* if(m_creature->GetEntry() == 17772)
{
if(!m_creature->HasAura(SPELL_BRILLIANCE_AURA,0))
DoCast(m_creature, SPELL_BRILLIANCE_AURA, true);
}*/
if(bRetreat)
{
if(RetreatTimer < diff)
@@ -890,14 +835,7 @@ void hyjalAI::UpdateAI(const uint32 diff)
HideNearPos(5603.75, -2853.12);
break;
}
m_creature->SetVisibility(VISIBILITY_OFF);
/*if(CreatureList.empty())
return;
for(std::list<uint64>::iterator itr = CreatureList.begin(); itr != CreatureList.end(); ++itr)
if(Unit* pUnit = Unit::GetUnit(*m_creature, *itr))
pUnit->SetVisibility(VISIBILITY_OFF);
CreatureList.clear();*/
m_creature->SetVisibility(VISIBILITY_OFF);
}else RetreatTimer -= diff;
}
@@ -1026,14 +964,12 @@ void hyjalAI::HideNearPos(float x, float y)
// Get Creatures
cell_lock->Visit(cell_lock, creature_visitor, *(m_creature->GetMap()));
//CreatureList.clear();
if(!creatures.empty())
{
for(std::list<Creature*>::iterator itr = creatures.begin(); itr != creatures.end(); ++itr)
{
(*itr)->SetVisibility(VISIBILITY_OFF);
(*itr)->setFaction(35);//make them friendly so mobs won't attack them
//CreatureList.push_back((*itr)->GetGUID());
}
}
}
@@ -78,20 +78,20 @@ float AllianceOverrunWP[55][3]=//waypoints in the alliance base used in the end
{5043.42,-1853.75,1324.52},//19
{5053.02,-1864.13,1330.36},//20
{5062.49,-1852.47,1330.49},//21
{5015.27, -1738.77, 1324.83},//35//start 22
{5027.97, -1775.25, 1321.87},//34 23
{5015.94, -1821.24, 1321.86},//33 24
{4983.25, -1857.4, 1320.48},//32 25
{4981.51, -1883.7, 1322.34},//31 26
{5002.33, -1893.98, 1325.88},//30 27
{5049.32, -1886.54, 1331.69},//29 28
{5089.68, -1846.88, 1328.99},//28 29
{5127.90, -1825.14, 1335.58},//27 30
{5163.27, -1789.08, 1337.04},//26 31
{5138.97, -1755.88, 1334.57},//25 32
{5096.63, -1742.22, 1329.61},//24 33
{5065.81, -1729.43, 1325.66},//23 34
{5049.32, -1726.31, 1320.64},//22 start
{5065.81, -1729.43, 1325.66},//23
{5096.63, -1742.22, 1329.61},//24
{5138.97, -1755.88, 1334.57},//25
{5163.27, -1789.08, 1337.04},//26
{5127.90, -1825.14, 1335.58},//27
{5089.68, -1846.88, 1328.99},//28
{5049.32, -1886.54, 1331.69},//29
{5002.33, -1893.98, 1325.88},//30
{4981.51, -1883.7, 1322.34},//31
{4983.25, -1857.4, 1320.48},//32
{5015.94, -1821.24, 1321.86},//33
{5027.97, -1775.25, 1321.87},//34
{5015.27, -1738.77, 1324.83},//35
{5081.07, -1902.10, 1346.36},//36 abo start
{5107.65, -1912.03, 1356.49},//37
{5132.83, -1927.07, 1362.42},//38
@@ -173,45 +173,9 @@ void hyjal_trashAI::UpdateAI(const uint32 diff)
{
if(m_creature->GetEntry() == GARGOYLE)
{
switch(OverrunType)
{
case 0:
{
DummyTarget[0] = AllianceOverrunWP[50][0];
DummyTarget[1] = AllianceOverrunWP[50][1];
DummyTarget[2] = AllianceOverrunWP[50][2];
}
break;
case 1:
{
DummyTarget[0] = AllianceOverrunWP[51][0];
DummyTarget[1] = AllianceOverrunWP[51][1];
DummyTarget[2] = AllianceOverrunWP[51][2];
}
break;
case 2:
{
DummyTarget[0] = AllianceOverrunWP[52][0];
DummyTarget[1] = AllianceOverrunWP[52][1];
DummyTarget[2] = AllianceOverrunWP[52][2];
}
break;
case 3:
{
DummyTarget[0] = AllianceOverrunWP[53][0];
DummyTarget[1] = AllianceOverrunWP[53][1];
DummyTarget[2] = AllianceOverrunWP[53][2];
}
break;
case 4:
{
DummyTarget[0] = AllianceOverrunWP[54][0];
DummyTarget[1] = AllianceOverrunWP[54][1];
DummyTarget[2] = AllianceOverrunWP[54][2];
}
break;
}
DummyTarget[0] = AllianceOverrunWP[50+OverrunType][0]; //+OverrunType 0 - 4
DummyTarget[1] = AllianceOverrunWP[50+OverrunType][1];
DummyTarget[2] = AllianceOverrunWP[50+OverrunType][2];
}
if(m_creature->GetEntry() == ABOMINATION)
{
@@ -220,13 +184,14 @@ void hyjal_trashAI::UpdateAI(const uint32 diff)
switch(OverrunType)
{
case 0:
AddWaypoint( 4, AllianceOverrunWP[35][0]+irand(-3,3), AllianceOverrunWP[35][1]+irand(-3,3), AllianceOverrunWP[35][2]);
AddWaypoint( 5, AllianceOverrunWP[34][0]+irand(-3,3), AllianceOverrunWP[34][1]+irand(-3,3), AllianceOverrunWP[34][2]);
AddWaypoint( 6, AllianceOverrunWP[33][0]+irand(-3,3), AllianceOverrunWP[33][1]+irand(-3,3), AllianceOverrunWP[33][2]);
AddWaypoint( 7, AllianceOverrunWP[32][0]+irand(-3,3), AllianceOverrunWP[32][1]+irand(-3,3), AllianceOverrunWP[32][2]);
AddWaypoint( 8, AllianceOverrunWP[31][0]+irand(-3,3), AllianceOverrunWP[31][1]+irand(-3,3), AllianceOverrunWP[31][2]);
AddWaypoint( 9, AllianceOverrunWP[30][0]+irand(-3,3), AllianceOverrunWP[30][1]+irand(-3,3), AllianceOverrunWP[30][2]);
AddWaypoint(10, AllianceOverrunWP[29][0]+irand(-3,3), AllianceOverrunWP[29][1]+irand(-3,3), AllianceOverrunWP[29][2]);
AddWaypoint( 4, AllianceOverrunWP[22][0]+irand(-3,3), AllianceOverrunWP[22][1]+irand(-3,3), AllianceOverrunWP[22][2]);
AddWaypoint( 5, AllianceOverrunWP[23][0]+irand(-3,3), AllianceOverrunWP[23][1]+irand(-3,3), AllianceOverrunWP[23][2]);
AddWaypoint( 6, AllianceOverrunWP[24][0]+irand(-3,3), AllianceOverrunWP[24][1]+irand(-3,3), AllianceOverrunWP[24][2]);
AddWaypoint( 7, AllianceOverrunWP[25][0]+irand(-3,3), AllianceOverrunWP[25][1]+irand(-3,3), AllianceOverrunWP[25][2]);
AddWaypoint( 8, AllianceOverrunWP[26][0]+irand(-3,3), AllianceOverrunWP[26][1]+irand(-3,3), AllianceOverrunWP[26][2]);
AddWaypoint( 9, AllianceOverrunWP[27][0]+irand(-3,3), AllianceOverrunWP[27][1]+irand(-3,3), AllianceOverrunWP[27][2]);
AddWaypoint(10, AllianceOverrunWP[28][0]+irand(-3,3), AllianceOverrunWP[28][1]+irand(-3,3), AllianceOverrunWP[28][2]);
AddWaypoint(11, AllianceOverrunWP[36][0]+irand(-3,3), AllianceOverrunWP[36][1]+irand(-3,3), AllianceOverrunWP[36][2]);
AddWaypoint(12, AllianceOverrunWP[37][0]+irand(-3,3), AllianceOverrunWP[37][1]+irand(-3,3), AllianceOverrunWP[37][2]);
AddWaypoint(13, AllianceOverrunWP[38][0]+irand(-3,3), AllianceOverrunWP[38][1]+irand(-3,3), AllianceOverrunWP[38][2]);
@@ -241,13 +206,14 @@ void hyjal_trashAI::UpdateAI(const uint32 diff)
Start(true, true, true);
break;
case 1:
AddWaypoint( 4, AllianceOverrunWP[35][0]+irand(-3,3), AllianceOverrunWP[35][1]+irand(-3,3), AllianceOverrunWP[35][2]);
AddWaypoint( 5, AllianceOverrunWP[34][0]+irand(-3,3), AllianceOverrunWP[34][1]+irand(-3,3), AllianceOverrunWP[34][2]);
AddWaypoint( 6, AllianceOverrunWP[33][0]+irand(-3,3), AllianceOverrunWP[33][1]+irand(-3,3), AllianceOverrunWP[33][2]);
AddWaypoint( 7, AllianceOverrunWP[32][0]+irand(-3,3), AllianceOverrunWP[32][1]+irand(-3,3), AllianceOverrunWP[32][2]);
AddWaypoint( 8, AllianceOverrunWP[31][0]+irand(-3,3), AllianceOverrunWP[31][1]+irand(-3,3), AllianceOverrunWP[31][2]);
AddWaypoint( 9, AllianceOverrunWP[30][0]+irand(-3,3), AllianceOverrunWP[30][1]+irand(-3,3), AllianceOverrunWP[30][2]);
AddWaypoint(10, AllianceOverrunWP[29][0]+irand(-3,3), AllianceOverrunWP[29][1]+irand(-3,3), AllianceOverrunWP[29][2]);
AddWaypoint( 4, AllianceOverrunWP[22][0]+irand(-3,3), AllianceOverrunWP[22][1]+irand(-3,3), AllianceOverrunWP[22][2]);
AddWaypoint( 5, AllianceOverrunWP[23][0]+irand(-3,3), AllianceOverrunWP[23][1]+irand(-3,3), AllianceOverrunWP[23][2]);
AddWaypoint( 6, AllianceOverrunWP[24][0]+irand(-3,3), AllianceOverrunWP[24][1]+irand(-3,3), AllianceOverrunWP[24][2]);
AddWaypoint( 7, AllianceOverrunWP[25][0]+irand(-3,3), AllianceOverrunWP[25][1]+irand(-3,3), AllianceOverrunWP[25][2]);
AddWaypoint( 8, AllianceOverrunWP[26][0]+irand(-3,3), AllianceOverrunWP[26][1]+irand(-3,3), AllianceOverrunWP[26][2]);
AddWaypoint( 9, AllianceOverrunWP[27][0]+irand(-3,3), AllianceOverrunWP[27][1]+irand(-3,3), AllianceOverrunWP[27][2]);
AddWaypoint(10, AllianceOverrunWP[28][0]+irand(-3,3), AllianceOverrunWP[28][1]+irand(-3,3), AllianceOverrunWP[28][2]);
AddWaypoint(11, AllianceOverrunWP[36][0]+irand(-3,3), AllianceOverrunWP[36][1]+irand(-3,3), AllianceOverrunWP[36][2]);
AddWaypoint(12, AllianceOverrunWP[37][0]+irand(-3,3), AllianceOverrunWP[37][1]+irand(-3,3), AllianceOverrunWP[37][2]);
AddWaypoint(13, AllianceOverrunWP[38][0]+irand(-3,3), AllianceOverrunWP[38][1]+irand(-3,3), AllianceOverrunWP[38][2]);
@@ -262,21 +228,9 @@ void hyjal_trashAI::UpdateAI(const uint32 diff)
Start(true, true, true);
break;
default:
AddWaypoint( 4, AllianceOverrunWP[35][0]+irand(-3,3), AllianceOverrunWP[35][1]+irand(-3,3), AllianceOverrunWP[35][2]);
AddWaypoint( 5, AllianceOverrunWP[34][0]+irand(-3,3), AllianceOverrunWP[34][1]+irand(-3,3), AllianceOverrunWP[34][2]);
AddWaypoint( 6, AllianceOverrunWP[33][0]+irand(-3,3), AllianceOverrunWP[33][1]+irand(-3,3), AllianceOverrunWP[33][2]);
AddWaypoint( 7, AllianceOverrunWP[32][0]+irand(-3,3), AllianceOverrunWP[32][1]+irand(-3,3), AllianceOverrunWP[32][2]);
AddWaypoint( 8, AllianceOverrunWP[31][0]+irand(-3,3), AllianceOverrunWP[31][1]+irand(-3,3), AllianceOverrunWP[31][2]);
AddWaypoint( 9, AllianceOverrunWP[30][0]+irand(-3,3), AllianceOverrunWP[30][1]+irand(-3,3), AllianceOverrunWP[30][2]);
AddWaypoint(10, AllianceOverrunWP[29][0]+irand(-3,3), AllianceOverrunWP[29][1]+irand(-3,3), AllianceOverrunWP[29][2]);
AddWaypoint(11, AllianceOverrunWP[28][0]+irand(-3,3), AllianceOverrunWP[28][1]+irand(-3,3), AllianceOverrunWP[28][2]);
AddWaypoint(12, AllianceOverrunWP[27][0]+irand(-3,3), AllianceOverrunWP[27][1]+irand(-3,3), AllianceOverrunWP[27][2]);
AddWaypoint(13, AllianceOverrunWP[26][0]+irand(-3,3), AllianceOverrunWP[26][1]+irand(-3,3), AllianceOverrunWP[26][2]);
AddWaypoint(14, AllianceOverrunWP[25][0]+irand(-3,3), AllianceOverrunWP[25][1]+irand(-3,3), AllianceOverrunWP[25][2]);
AddWaypoint(15, AllianceOverrunWP[24][0]+irand(-3,3), AllianceOverrunWP[24][1]+irand(-3,3), AllianceOverrunWP[24][2]);
AddWaypoint(16, AllianceOverrunWP[23][0]+irand(-3,3), AllianceOverrunWP[23][1]+irand(-3,3), AllianceOverrunWP[23][2]);
AddWaypoint(17, AllianceOverrunWP[22][0]+irand(-3,3), AllianceOverrunWP[22][1]+irand(-3,3), AllianceOverrunWP[22][2]);
//m_creature->SetHomePosition(AllianceOverrunWP[0][0]+irand(-3,3), AllianceOverrunWP[0][1]+irand(-3,3), AllianceOverrunWP[0][2],0);
for(uint8 i = 22; i < 36; i++)
AddWaypoint( i-18, AllianceOverrunWP[i][0]+irand(-3,3), AllianceOverrunWP[i][1]+irand(-3,3), AllianceOverrunWP[i][2]);
SetDespawnAtEnd(true);
LastOverronPos = 17;
Start(true, true, true);
@@ -347,21 +301,8 @@ void hyjal_trashAI::UpdateAI(const uint32 diff)
Start(true, true, true);
break;
default:
AddWaypoint( 4, AllianceOverrunWP[35][0]+irand(-3,3), AllianceOverrunWP[35][1]+irand(-3,3), AllianceOverrunWP[35][2]);
AddWaypoint( 5, AllianceOverrunWP[34][0]+irand(-3,3), AllianceOverrunWP[34][1]+irand(-3,3), AllianceOverrunWP[34][2]);
AddWaypoint( 6, AllianceOverrunWP[33][0]+irand(-3,3), AllianceOverrunWP[33][1]+irand(-3,3), AllianceOverrunWP[33][2]);
AddWaypoint( 7, AllianceOverrunWP[32][0]+irand(-3,3), AllianceOverrunWP[32][1]+irand(-3,3), AllianceOverrunWP[32][2]);
AddWaypoint( 8, AllianceOverrunWP[31][0]+irand(-3,3), AllianceOverrunWP[31][1]+irand(-3,3), AllianceOverrunWP[31][2]);
AddWaypoint( 9, AllianceOverrunWP[30][0]+irand(-3,3), AllianceOverrunWP[30][1]+irand(-3,3), AllianceOverrunWP[30][2]);
AddWaypoint(10, AllianceOverrunWP[29][0]+irand(-3,3), AllianceOverrunWP[29][1]+irand(-3,3), AllianceOverrunWP[29][2]);
AddWaypoint(11, AllianceOverrunWP[28][0]+irand(-3,3), AllianceOverrunWP[28][1]+irand(-3,3), AllianceOverrunWP[28][2]);
AddWaypoint(12, AllianceOverrunWP[27][0]+irand(-3,3), AllianceOverrunWP[27][1]+irand(-3,3), AllianceOverrunWP[27][2]);
AddWaypoint(13, AllianceOverrunWP[26][0]+irand(-3,3), AllianceOverrunWP[26][1]+irand(-3,3), AllianceOverrunWP[26][2]);
AddWaypoint(14, AllianceOverrunWP[25][0]+irand(-3,3), AllianceOverrunWP[25][1]+irand(-3,3), AllianceOverrunWP[25][2]);
AddWaypoint(15, AllianceOverrunWP[24][0]+irand(-3,3), AllianceOverrunWP[24][1]+irand(-3,3), AllianceOverrunWP[24][2]);
AddWaypoint(16, AllianceOverrunWP[23][0]+irand(-3,3), AllianceOverrunWP[23][1]+irand(-3,3), AllianceOverrunWP[23][2]);
AddWaypoint(17, AllianceOverrunWP[22][0]+irand(-3,3), AllianceOverrunWP[22][1]+irand(-3,3), AllianceOverrunWP[22][2]);
//m_creature->SetHomePosition(AllianceOverrunWP[0][0]+irand(-3,3), AllianceOverrunWP[0][1]+irand(-3,3), AllianceOverrunWP[0][2],0);
for(uint8 i = 22; i < 36; i++)
AddWaypoint( i-18, AllianceOverrunWP[i][0]+irand(-3,3), AllianceOverrunWP[i][1]+irand(-3,3), AllianceOverrunWP[i][2]);
SetDespawnAtEnd(true);
LastOverronPos = 17;
Start(true, true, true);
@@ -398,25 +339,10 @@ void hyjal_trashAI::UpdateAI(const uint32 diff)
Start(true, true, true);
break;
default:
AddWaypoint( 5, HordeOverrunWP[0][0]+irand(-10,10), HordeOverrunWP[0][1]+irand(-10,10), HordeOverrunWP[0][2]);
AddWaypoint( 6, HordeOverrunWP[1][0]+irand(-10,10), HordeOverrunWP[1][1]+irand(-10,10), HordeOverrunWP[1][2]);
AddWaypoint( 7, HordeOverrunWP[2][0]+irand(-10,10), HordeOverrunWP[2][1]+irand(-10,10), HordeOverrunWP[2][2]);
AddWaypoint( 8, HordeOverrunWP[3][0]+irand(-10,10), HordeOverrunWP[3][1]+irand(-10,10), HordeOverrunWP[3][2]);
AddWaypoint( 9, HordeOverrunWP[4][0]+irand(-10,10), HordeOverrunWP[4][1]+irand(-10,10), HordeOverrunWP[4][2]);
AddWaypoint(10, HordeOverrunWP[5][0]+irand(-10,10), HordeOverrunWP[5][1]+irand(-10,10), HordeOverrunWP[5][2]);
AddWaypoint(11, HordeOverrunWP[6][0]+irand(-10,10), HordeOverrunWP[6][1]+irand(-10,10), HordeOverrunWP[6][2]);
AddWaypoint(12, HordeOverrunWP[7][0]+irand(-10,10), HordeOverrunWP[7][1]+irand(-10,10), HordeOverrunWP[7][2]);
AddWaypoint(13, HordeOverrunWP[8][0]+irand(-10,10), HordeOverrunWP[8][1]+irand(-10,10), HordeOverrunWP[8][2]);
AddWaypoint(14, HordeOverrunWP[9][0]+irand(-10,10), HordeOverrunWP[9][1]+irand(-10,10), HordeOverrunWP[9][2]);
AddWaypoint(15, HordeOverrunWP[10][0]+irand(-10,10), HordeOverrunWP[10][1]+irand(-10,10), HordeOverrunWP[10][2]);
AddWaypoint(16, HordeOverrunWP[11][0]+irand(-10,10), HordeOverrunWP[11][1]+irand(-10,10), HordeOverrunWP[11][2]);
AddWaypoint(17, HordeOverrunWP[12][0]+irand(-10,10), HordeOverrunWP[12][1]+irand(-10,10), HordeOverrunWP[12][2]);
AddWaypoint(18, HordeOverrunWP[13][0]+irand(-10,10), HordeOverrunWP[13][1]+irand(-10,10), HordeOverrunWP[13][2]);
AddWaypoint(19, HordeOverrunWP[14][0]+irand(-10,10), HordeOverrunWP[14][1]+irand(-10,10), HordeOverrunWP[14][2]);
AddWaypoint(20, HordeOverrunWP[15][0]+irand(-10,10), HordeOverrunWP[15][1]+irand(-10,10), HordeOverrunWP[15][2]);
//m_creature->SetHomePosition(AllianceOverrunWP[2][0]+irand(-10,10), AllianceOverrunWP[2][1]+irand(-10,10), AllianceOverrunWP[2][2],0);
for(uint8 i = 0; i < 16; i++)
AddWaypoint( i+6, HordeOverrunWP[i][0]+irand(-10,10), HordeOverrunWP[i][1]+irand(-10,10), HordeOverrunWP[i][2]);
SetDespawnAtEnd(true);
LastOverronPos = 20;
LastOverronPos = 21;
Start(true, true, true);
break;
}
@@ -425,32 +351,11 @@ void hyjal_trashAI::UpdateAI(const uint32 diff)
{
for(uint8 i = 0; i < 6; i++)
AddWaypoint(i, HordeWPs[i][0]+irand(-10,10), HordeWPs[i][1]+irand(-10,10), HordeWPs[i][2]);
switch(OverrunType)
{
case 0:
default:
AddWaypoint( 5, HordeOverrunWP[0][0]+irand(-10,10), HordeOverrunWP[0][1]+irand(-10,10), HordeOverrunWP[0][2]);
AddWaypoint( 6, HordeOverrunWP[1][0]+irand(-10,10), HordeOverrunWP[1][1]+irand(-10,10), HordeOverrunWP[1][2]);
AddWaypoint( 7, HordeOverrunWP[2][0]+irand(-10,10), HordeOverrunWP[2][1]+irand(-10,10), HordeOverrunWP[2][2]);
AddWaypoint( 8, HordeOverrunWP[3][0]+irand(-10,10), HordeOverrunWP[3][1]+irand(-10,10), HordeOverrunWP[3][2]);
AddWaypoint( 9, HordeOverrunWP[4][0]+irand(-10,10), HordeOverrunWP[4][1]+irand(-10,10), HordeOverrunWP[4][2]);
AddWaypoint(10, HordeOverrunWP[5][0]+irand(-10,10), HordeOverrunWP[5][1]+irand(-10,10), HordeOverrunWP[5][2]);
AddWaypoint(11, HordeOverrunWP[6][0]+irand(-10,10), HordeOverrunWP[6][1]+irand(-10,10), HordeOverrunWP[6][2]);
AddWaypoint(12, HordeOverrunWP[7][0]+irand(-10,10), HordeOverrunWP[7][1]+irand(-10,10), HordeOverrunWP[7][2]);
AddWaypoint(13, HordeOverrunWP[8][0]+irand(-10,10), HordeOverrunWP[8][1]+irand(-10,10), HordeOverrunWP[8][2]);
AddWaypoint(14, HordeOverrunWP[9][0]+irand(-10,10), HordeOverrunWP[9][1]+irand(-10,10), HordeOverrunWP[9][2]);
AddWaypoint(15, HordeOverrunWP[10][0]+irand(-10,10), HordeOverrunWP[10][1]+irand(-10,10), HordeOverrunWP[10][2]);
AddWaypoint(16, HordeOverrunWP[11][0]+irand(-10,10), HordeOverrunWP[11][1]+irand(-10,10), HordeOverrunWP[11][2]);
AddWaypoint(17, HordeOverrunWP[12][0]+irand(-10,10), HordeOverrunWP[12][1]+irand(-10,10), HordeOverrunWP[12][2]);
AddWaypoint(18, HordeOverrunWP[13][0]+irand(-10,10), HordeOverrunWP[13][1]+irand(-10,10), HordeOverrunWP[13][2]);
AddWaypoint(19, HordeOverrunWP[14][0]+irand(-10,10), HordeOverrunWP[14][1]+irand(-10,10), HordeOverrunWP[14][2]);
AddWaypoint(20, HordeOverrunWP[15][0]+irand(-10,10), HordeOverrunWP[15][1]+irand(-10,10), HordeOverrunWP[15][2]);
//m_creature->SetHomePosition(AllianceOverrunWP[2][0]+irand(-10,10), AllianceOverrunWP[2][1]+irand(-10,10), AllianceOverrunWP[2][2],0);
SetDespawnAtEnd(true);
LastOverronPos = 20;
Start(true, true, true);
break;
}
for(uint8 i = 0; i < 16; i++)
AddWaypoint( i+6, HordeOverrunWP[i][0]+irand(-10,10), HordeOverrunWP[i][1]+irand(-10,10), HordeOverrunWP[i][2]);
SetDespawnAtEnd(true);
LastOverronPos = 21;
Start(true, true, true);
}
}
}
@@ -464,25 +369,6 @@ void hyjal_trashAI::JustDied(Unit *victim)
if((pInstance->GetData(DATA_RAIDDAMAGE) < MINRAIDDAMAGE && !m_creature->isWorldBoss()) || (damageTaken < m_creature->GetMaxHealth()/4 && m_creature->isWorldBoss()))
m_creature->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);//no loot
if(IsOverrun)
{
float x,y,z,o;
m_creature->GetHomePosition(x,y,z,o);
Creature* pUnit = m_creature->SummonCreature(m_creature->GetEntry(),x,y,z,o, TEMPSUMMON_MANUAL_DESPAWN, 2*60*1000);
if(pUnit)
{
((hyjal_trashAI*)pUnit->AI())->faction = faction;
((hyjal_trashAI*)pUnit->AI())->IsOverrun = true;
((hyjal_trashAI*)pUnit->AI())->OverrunType = OverrunType;
((hyjal_trashAI*)pUnit->AI())->SetupOverrun = true;
((hyjal_trashAI*)pUnit->AI())->DummyTarget[0] = DummyTarget[0];
((hyjal_trashAI*)pUnit->AI())->DummyTarget[1] = DummyTarget[1];
((hyjal_trashAI*)pUnit->AI())->DummyTarget[2] = DummyTarget[2];
pUnit->setActive(true);
pUnit->AI()->EnterEvadeMode();
}
}
}
struct mob_giant_infernalAI : public hyjal_trashAI
@@ -563,8 +449,6 @@ struct mob_giant_infernalAI : public hyjal_trashAI
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, m_creature->GetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID));
CanMove = true;
/*if (m_creature->getVictim())
m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());*/
if (pInstance)
{
if (pInstance->GetData(DATA_ALLIANCE_RETREAT) && !pInstance->GetData(DATA_HORDE_RETREAT))
@@ -654,32 +538,13 @@ struct mob_abominationAI : public hyjal_trashAI
if (target && target->isAlive())
m_creature->AddThreat(target,0.0);
}
}
}
if (i == LastOverronPos && IsOverrun)
{
if(faction == 0 && LastOverronPos == 17)//alliance round
if((faction == 0 && LastOverronPos == 17) || (faction == 1 && LastOverronPos == 21))
{
Creature* pUnit = m_creature->SummonCreature(m_creature->GetEntry(),4928.48+irand(-10,10), -1526.38+irand(-10,10), 1326.83,0, TEMPSUMMON_MANUAL_DESPAWN, 2*60*1000);
if(pUnit)
{
((hyjal_trashAI*)pUnit->AI())->faction = faction;
((hyjal_trashAI*)pUnit->AI())->IsOverrun = true;
((hyjal_trashAI*)pUnit->AI())->OverrunType = 2;//default
((hyjal_trashAI*)pUnit->AI())->SetupOverrun = false;
pUnit->setActive(true);
}
}
if(faction == 1 && LastOverronPos == 20)//horde round
{
Creature* pUnit = m_creature->SummonCreature(m_creature->GetEntry(),5458.01+irand(-10,10),-2340.27+irand(-10,10),1459.60,0, TEMPSUMMON_MANUAL_DESPAWN, 2*60*1000);
if(pUnit)
{
((hyjal_trashAI*)pUnit->AI())->faction = faction;
((hyjal_trashAI*)pUnit->AI())->IsOverrun = true;
((hyjal_trashAI*)pUnit->AI())->OverrunType = 10;//default
((hyjal_trashAI*)pUnit->AI())->SetupOverrun = false;
pUnit->setActive(true);
}
m_creature->setDeathState(DEAD);
m_creature->RemoveCorpse();
}
}
}
@@ -721,7 +586,7 @@ struct mob_abominationAI : public hyjal_trashAI
if(KnockDownTimer<diff)
{
DoCast(m_creature->getVictim(),SPELL_KNOCKDOWN);
KnockDownTimer = 30000+rand()%25000;
KnockDownTimer = 15000+rand()%10000;
}else KnockDownTimer -= diff;
DoMeleeAttackIfReady();
}
@@ -776,30 +641,12 @@ struct mob_ghoulAI : public hyjal_trashAI
if (i == LastOverronPos && IsOverrun)
{
m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_ATTACKUNARMED);
if(faction == 0 && LastOverronPos == 17)//alliance round
if((faction == 0 && LastOverronPos == 17) || (faction == 1 && LastOverronPos == 21))
{
Creature* pUnit = m_creature->SummonCreature(m_creature->GetEntry(),4928.48+irand(-10,10), -1526.38+irand(-10,10), 1326.83,0, TEMPSUMMON_MANUAL_DESPAWN, 2*60*1000);
if(pUnit)
{
((hyjal_trashAI*)pUnit->AI())->faction = faction;
((hyjal_trashAI*)pUnit->AI())->IsOverrun = true;
((hyjal_trashAI*)pUnit->AI())->OverrunType = 6;//default
((hyjal_trashAI*)pUnit->AI())->SetupOverrun = false;
pUnit->setActive(true);
}
}
if(faction == 1 && LastOverronPos == 20)//horde round
{
Creature* pUnit = m_creature->SummonCreature(m_creature->GetEntry(),5458.01+irand(-10,10), -2340.27+irand(-10,10), 1459.60,0, TEMPSUMMON_MANUAL_DESPAWN, 2*60*1000);
if(pUnit)
{
((hyjal_trashAI*)pUnit->AI())->faction = faction;
((hyjal_trashAI*)pUnit->AI())->IsOverrun = true;
((hyjal_trashAI*)pUnit->AI())->OverrunType = 10;//default
((hyjal_trashAI*)pUnit->AI())->SetupOverrun = false;
pUnit->setActive(true);
}
m_creature->setDeathState(DEAD);
m_creature->RemoveCorpse();
}
}
}
@@ -898,19 +745,6 @@ struct mob_necromancerAI : public hyjal_trashAI
if (target && target->isAlive())
m_creature->AddThreat(target,0.0);
}
}
if (i == LastOverronPos && IsOverrun)
{
Creature* pUnit = m_creature->SummonCreature(17931, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 2*60*1000);
if(pUnit)
{
pUnit->SetVisibility(VISIBILITY_OFF);
pUnit->SetMaxHealth(10000000);
pUnit->SetHealth(10000000);
pUnit->setFaction(17772);
pUnit->Attack(m_creature, true);
m_creature->AddThreat(pUnit,0);
}
}
}
@@ -1024,19 +858,6 @@ struct mob_bansheeAI : public hyjal_trashAI
if (target && target->isAlive())
m_creature->AddThreat(target,0.0);
}
}
if (i == LastOverronPos && IsOverrun)
{
Creature* pUnit = m_creature->SummonCreature(17931, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 2*60*1000);
if(pUnit)
{
pUnit->SetVisibility(VISIBILITY_OFF);
pUnit->SetMaxHealth(10000000);
pUnit->SetHealth(10000000);
pUnit->setFaction(17772);
pUnit->Attack(m_creature, true);
m_creature->AddThreat(pUnit,0);
}
}
}
@@ -1132,19 +953,6 @@ struct mob_crypt_fiendAI : public hyjal_trashAI
if (target && target->isAlive())
m_creature->AddThreat(target,0.0);
}
}
if (i == LastOverronPos && IsOverrun)
{
Creature* pUnit = m_creature->SummonCreature(17931, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 2*60*1000);
if(pUnit)
{
pUnit->SetVisibility(VISIBILITY_OFF);
pUnit->SetMaxHealth(10000000);
pUnit->SetHealth(10000000);
pUnit->setFaction(17772);
pUnit->Attack(m_creature, true);
m_creature->AddThreat(pUnit,0);
}
}
}
@@ -1231,19 +1039,6 @@ struct mob_fel_stalkerAI : public hyjal_trashAI
if (target && target->isAlive())
m_creature->AddThreat(target,0.0);
}
}
if (i == LastOverronPos && IsOverrun)
{
Creature* pUnit = m_creature->SummonCreature(17931, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 2*60*1000);
if(pUnit)
{
pUnit->SetVisibility(VISIBILITY_OFF);
pUnit->SetMaxHealth(10000000);
pUnit->SetHealth(10000000);
pUnit->setFaction(17772);
pUnit->Attack(m_creature, true);
m_creature->AddThreat(pUnit,0);
}
}
}
@@ -1447,14 +1242,6 @@ struct mob_gargoyleAI : public hyjal_trashAI
DoCast(target,SPELL_GARGOYLE_STRIKE,true);
}
}
if (IsOverrun && i == LastOverronPos)
{
AddWaypoint(0, 5536.65+irand(-80,80), -2710.66+irand(-80,80), 1504.45+irand(-10,10));
AddWaypoint(1, 5536.65+irand(-80,80), -2710.66+irand(-80,80), 1504.45+irand(-10,10));
SetDespawnAtEnd(false);
LastOverronPos = 1;
Start(false, true, true);
}
}
void JustDied(Unit *victim)
@@ -16,62 +16,75 @@
/* ScriptData
SDName: Boss_Brutallus
SD%Complete: 50
SDComment: Intro not made. Script for Madrigosa to be added here.
SD%Complete: 80
SDComment: Find a way to start the intro, best code for the intro
EndScriptData */
#include "precompiled.h"
#include "def_sunwell_plateau.h"
#define YELL_INTRO -1580017
#define YELL_INTRO_BREAK_ICE -1580018
#define YELL_INTRO_CHARGE -1580019
#define YELL_INTRO_KILL_MADRIGOSA -1580020
#define YELL_INTRO_TAUNT -1580021
enum Quotes
{
YELL_INTRO = -1580017,
YELL_INTRO_BREAK_ICE = -1580018,
YELL_INTRO_CHARGE = -1580019,
YELL_INTRO_KILL_MADRIGOSA = -1580020,
YELL_INTRO_TAUNT = -1580021,
#define YELL_MADR_ICE_BARRIER -1580031
#define YELL_MADR_INTRO -1580032
#define YELL_MADR_ICE_BLOCK -1580033
#define YELL_MADR_TRAP -1580034
#define YELL_MADR_DEATH -1580035
YELL_MADR_ICE_BARRIER = -1580031,
YELL_MADR_INTRO = -1580032,
YELL_MADR_ICE_BLOCK = -1580033,
YELL_MADR_TRAP = -1580034,
YELL_MADR_DEATH = -1580035,
#define YELL_AGGRO -1580022
#define YELL_KILL1 -1580023
#define YELL_KILL2 -1580024
#define YELL_KILL3 -1580025
#define YELL_LOVE1 -1580026
#define YELL_LOVE2 -1580027
#define YELL_LOVE3 -1580028
#define YELL_BERSERK -1580029
#define YELL_DEATH -1580030
YELL_AGGRO = -1580022,
YELL_KILL1 = -1580023,
YELL_KILL2 = -1580024,
YELL_KILL3 = -1580025,
YELL_LOVE1 = -1580026,
YELL_LOVE2 = -1580027,
YELL_LOVE3 = -1580028,
YELL_BERSERK = -1580029,
YELL_DEATH = -1580030
};
#define SPELL_METEOR_SLASH 45150
#define SPELL_BURN 45141
#define SPELL_STOMP 45185
#define SPELL_BERSERK 26662
#define SPELL_DUAL_WIELD 42459
enum Spells
{
SPELL_METEOR_SLASH = 45150,
SPELL_BURN = 46394,
SPELL_STOMP = 45185,
SPELL_BERSERK = 26662,
SPELL_DUAL_WIELD = 42459,
#define FREEZING 45203
#define FROST_BOLT 44843
#define ENCAPSULATE 45665
#define ENCAPSULATE_CHANELLING 45661
SPELL_INTRO_FROST_BLAST = 45203,
SPELL_INTRO_FROSTBOLT = 44843,
SPELL_INTRO_ENCAPSULATE = 45665,
SPELL_INTRO_ENCAPSULATE_CHANELLING = 45661
};
#define FELMYST 25038
struct TRINITY_DLL_DECL boss_brutallusAI : public ScriptedAI
{
boss_brutallusAI(Creature *c) : ScriptedAI(c)
{
boss_brutallusAI(Creature *c) : ScriptedAI(c){
pInstance = ((ScriptedInstance*)c->GetInstanceData());
}
ScriptedInstance* pInstance;
Unit* Madrigosa;
uint32 SlashTimer;
uint32 BurnTimer;
uint32 StompTimer;
uint32 BerserkTimer;
uint32 ConversationTimer;
uint32 IntroPhase;
uint32 IntroPhaseTimer;
uint32 IntroFrostBoltTimer;
bool Intro;
bool IsIntro;
bool Enraged;
void Reset()
{
@@ -79,10 +92,31 @@ struct TRINITY_DLL_DECL boss_brutallusAI : public ScriptedAI
StompTimer = 30000;
BurnTimer = 60000;
BerserkTimer = 360000;
IntroPhase = 0;
IntroPhaseTimer = 0;
IntroFrostBoltTimer = 0;
IsIntro = false;
Enraged = false;
Intro = true; //for debug
m_creature->CastSpell(m_creature, SPELL_DUAL_WIELD, true);
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
Madrigosa = Unit::GetUnit(*m_creature, pInstance->GetData64(DATA_MADRIGOSA));
//Creature* boss = Unit::GetCreature((*m_creature),AzgalorGUID);
if(!Madrigosa) error_log("Madrigosa ist nicht zu finden");
if(Intro && Madrigosa){
if(!Madrigosa->isAlive())
EndIntro();
else error_log("Madrigosa is Tod");
}
else
EndIntro();
if(pInstance)
pInstance->SetData(DATA_BRUTALLUS, NOT_STARTED);
pInstance->SetData(DATA_BRUTALLUS_EVENT, NOT_STARTED);
}
void EnterCombat(Unit *who)
@@ -90,16 +124,16 @@ struct TRINITY_DLL_DECL boss_brutallusAI : public ScriptedAI
DoScriptText(YELL_AGGRO, m_creature);
if(pInstance)
pInstance->SetData(DATA_BRUTALLUS, IN_PROGRESS);
pInstance->SetData(DATA_BRUTALLUS_EVENT, IN_PROGRESS);
}
void KilledUnit(Unit* victim)
{
switch(rand()%3)
{
case 0: DoScriptText(YELL_KILL1, m_creature); break;
case 1: DoScriptText(YELL_KILL2, m_creature); break;
case 2: DoScriptText(YELL_KILL3, m_creature); break;
case 0: DoScriptText(YELL_KILL1, m_creature); break;
case 1: DoScriptText(YELL_KILL2, m_creature); break;
case 2: DoScriptText(YELL_KILL3, m_creature); break;
}
}
@@ -107,18 +141,142 @@ struct TRINITY_DLL_DECL boss_brutallusAI : public ScriptedAI
{
DoScriptText(YELL_DEATH, m_creature);
if(pInstance)
pInstance->SetData(DATA_BRUTALLUS, DONE);
if(pInstance){
pInstance->SetData(DATA_BRUTALLUS_EVENT, DONE);
float x,y,z;
m_creature->GetPosition(x,y,z);
m_creature->SummonCreature(FELMYST, x,y, z+30, m_creature->GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN, 0);
}
}
void StartIntro()
{
if(!Intro)
return;
if(Madrigosa){
Madrigosa->setDeathState(ALIVE);
Madrigosa->setActive(true);
IsIntro = true;
}
error_log("Starte das Intro");
}
void EndIntro()
{
error_log("Beende das Intro");
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
Intro = false;
IsIntro = false;
}
void DoIntro()
{
if(!Madrigosa)
return;
switch(IntroPhase)
{
case 0:
DoScriptText(YELL_MADR_ICE_BARRIER, Madrigosa);
IntroPhaseTimer = 5000;
++IntroPhase;
break;
case 1:
m_creature->SetInFront(Madrigosa);
Madrigosa->SetInFront(m_creature);
DoScriptText(YELL_MADR_INTRO, Madrigosa, m_creature);
IntroPhaseTimer = 9000;
++IntroPhase;
break;
case 2:
DoScriptText(YELL_INTRO, m_creature, Madrigosa);
IntroPhaseTimer = 13000;
++IntroPhase;
break;
case 3:
DoCast(m_creature, SPELL_INTRO_FROST_BLAST);
Madrigosa->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT + MOVEMENTFLAG_LEVITATING);
IntroFrostBoltTimer = 3000;
IntroPhaseTimer = 28000;
++IntroPhase;
break;
case 4:
DoScriptText(YELL_INTRO_BREAK_ICE, m_creature);
IntroPhaseTimer = 6000;
++IntroPhase;
break;
case 5:
Madrigosa->CastSpell(m_creature, SPELL_INTRO_ENCAPSULATE_CHANELLING, false);
DoScriptText(YELL_MADR_TRAP, Madrigosa);
DoCast(m_creature, SPELL_INTRO_ENCAPSULATE);
IntroPhaseTimer = 11000;
++IntroPhase;
break;
case 6:
m_creature->SetSpeed(MOVE_RUN, 4.0f, true);
DoScriptText(YELL_INTRO_CHARGE, m_creature);
IntroPhaseTimer = 3000;
++IntroPhase;
break;
case 7:
m_creature->DealDamage(Madrigosa, Madrigosa->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, true);
DoScriptText(YELL_MADR_DEATH, Madrigosa);
m_creature->SetHealth(m_creature->GetMaxHealth());
m_creature->AttackStop();
m_creature->SetSpeed(MOVE_RUN, 1.0f, true);
IntroPhaseTimer = 3000;
++IntroPhase;
break;
case 8:
DoScriptText(YELL_INTRO_KILL_MADRIGOSA, m_creature);
m_creature->SetOrientation(0.14);
Madrigosa->setDeathState(CORPSE);
IntroPhaseTimer = 5000;
++IntroPhase;
break;
case 9:
DoScriptText(YELL_INTRO_TAUNT, m_creature);
IntroPhaseTimer = 5000;
++IntroPhase;
break;
case 10:
EndIntro();
break;
}
}
void MoveInLineOfSight(Unit *who){
if(pInstance && Intro)
pInstance->SetData(DATA_BRUTALLUS_EVENT, SPECIAL);
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim() )
if(Intro && !IsIntro)
StartIntro();
if(IsIntro)
{
if(IntroPhaseTimer < diff){
DoIntro();
}else IntroPhaseTimer -= diff;
if(IntroPhase == 3 + 1){
if(IntroFrostBoltTimer < diff){
if(Madrigosa){
Madrigosa->CastSpell(m_creature, SPELL_INTRO_FROSTBOLT, false);
IntroFrostBoltTimer = 2000;
}
}else IntroFrostBoltTimer -= diff;
}
}
if(!UpdateVictim() || IsIntro)
return;
if(SlashTimer < diff)
{
DoCast(m_creature->getVictim(),SPELL_METEOR_SLASH);
DoCast(m_creature->getVictim(), SPELL_METEOR_SLASH);
SlashTimer = 11000;
}else SlashTimer -= diff;
@@ -126,36 +284,30 @@ struct TRINITY_DLL_DECL boss_brutallusAI : public ScriptedAI
{
switch(rand()%3)
{
case 0: DoScriptText(YELL_LOVE1, m_creature); break;
case 1: DoScriptText(YELL_LOVE2, m_creature); break;
case 2: DoScriptText(YELL_LOVE3, m_creature); break;
case 0: DoScriptText(YELL_LOVE1, m_creature); break;
case 1: DoScriptText(YELL_LOVE2, m_creature); break;
case 2: DoScriptText(YELL_LOVE3, m_creature); break;
}
Unit *Target = m_creature->getVictim();
DoCast(Target,SPELL_STOMP);
if(Target->HasAura(45151)) Target->RemoveAura(45151);
DoCast(m_creature->getVictim(), SPELL_STOMP);
StompTimer = 30000;
}else StompTimer -= diff;
if(BurnTimer < diff)
{
if(Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 0))
target->CastSpell(target,SPELL_BURN,true);
DoCast(target, SPELL_BURN, true);
BurnTimer = 60000;
}
else BurnTimer -= diff;
}else BurnTimer -= diff;
if(BerserkTimer < diff)
if(BerserkTimer < diff && !Enraged)
{
DoScriptText(YELL_BERSERK, m_creature);
DoCast(m_creature,SPELL_BERSERK);
BerserkTimer = 20000;
}
else BerserkTimer -= diff;
DoCast(m_creature, SPELL_BERSERK);
Enraged = true;
}else BerserkTimer -= diff;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_boss_brutallus(Creature *_Creature)
@@ -166,9 +318,9 @@ CreatureAI* GetAI_boss_brutallus(Creature *_Creature)
void AddSC_boss_brutallus()
{
Script *newscript;
newscript = new Script;
newscript->Name="boss_brutallus";
newscript->GetAI = &GetAI_boss_brutallus;
newscript->RegisterSelf();
}
@@ -1,4 +1,4 @@
/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
/* Copyright (C) 2009 Trinity <http://www.trinitycore.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 2 of the License, or
@@ -23,99 +23,98 @@ EndScriptData */
#include "precompiled.h"
#include "def_sunwell_plateau.h"
//Intro
#define YELL_INTRO_SAC_1 "Misery..."
#define YELL_INTRO_ALY_2 "Depravity..."
#define YELL_INTRO_SAC_3 "Confusion..."
#define YELL_INTRO_ALY_4 "Hatred..."
#define YELL_INTRO_SAC_5 "Mistrust..."
#define YELL_INTRO_ALY_6 "Chaos..."
#define YELL_INTRO_SAC_7 "These are the hallmarks..."
#define YELL_INTRO_ALY_8 "These are the pillars..."
enum Quotes
{
//Alytesh
YELL_CANFLAGRATION = -1580044,
YELL_SISTER_SACROLASH_DEAD = -1580045,
YELL_ALY_KILL_1 = -1580046,
YELL_ALY_KILL_2 = -1580047,
YELL_ALY_DEAD = -1580048,
YELL_BERSERK = -1580049,
// Lady Sacrolash
#define LADY_SACROLASH 25165
//Sacrolash
YELL_SHADOW_NOVA = -1580050,
YELL_SISTER_ALYTHESS_DEAD = -1580051,
YELL_SAC_KILL_1 = -1580052,
YELL_SAC_KILL_2 = -1580053,
SAY_SAC_DEAD = -1580054,
YELL_ENRAGE = -1580055,
#define SPELL_DARK_TOUCHED 45347
#define SPELL_SHADOW_BLADES 45248//10 secs
#define SPELL_DARK_STRIKE 45271
#define SPELL_SHADOW_NOVA 45329//30-35 secs
#define SPELL_CONFOUNDING_BLOW 45256//25 secs
//Intro
YELL_INTRO_SAC_1 = -1580056,
YELL_INTRO_ALY_2 = -1580057,
YELL_INTRO_SAC_3 = -1580058,
YELL_INTRO_ALY_4 = -1580059,
YELL_INTRO_SAC_5 = -1580060,
YELL_INTRO_ALY_6 = -1580061,
YELL_INTRO_SAC_7 = -1580062,
YELL_INTRO_ALY_8 = -1580063,
#define MOB_SHADOW_IMAGE 25214
#define SPELL_SHADOW_FURY 45270
#define SPELL_IMAGE_VISUAL 45263
//Emote
EMOTE_SHADOW_NOVA = -1580064,
EMOTE_CONFLAGRATION = -1580065
};
#define SOUND_INTRO 12484
#define YELL_SHADOW_NOVA "Shadow to the aid of fire!" //only if Alythess is not dead
#define SOUND_SHADOW_NOVA 12485
#define YELL_SISTER_ALYTHESS_DEAD "Alythess! Your fire burns within me!"
#define SOUND_SISTER_ALYTHESS_DEAD 12488
#define YELL_SAC_KILL_1 "Shadow engulf."
#define SOUND_SAC_KILL_1 12486
#define YELL_SAC_KILL_2 "Ee-nok Kryul!"
#define SOUND_SAC_KILL_2 12487
#define SAY_SAC_DEAD "I... fade."
#define YELL_ENRAGE "Time is a luxury you no longer possess!"
enum Spells
{
//Lady Sacrolash spells
SPELL_DARK_TOUCHED = 45347,
SPELL_SHADOW_BLADES = 45248, //10 secs
SPELL_DARK_STRIKE = 45271,
SPELL_SHADOW_NOVA = 45329, //30-35 secs
SPELL_CONFOUNDING_BLOW = 45256, //25 secs
//enrage 6 minutes
#define SPELL_ENRAGE 46587
//empower after sister is death
#define SPELL_EMPOWER 45366
//Shadow Image spells
SPELL_SHADOW_FURY = 45270,
SPELL_IMAGE_VISUAL = 45263,
//debuff prevents touched spell for 3 secounds
#define SPELL_DARK_FLAME 45345
//Misc spells
SPELL_ENRAGE = 46587,
SPELL_EMPOWER = 45366,
SPELL_DARK_FLAME = 45345,
//Grand Warlock Alythess
// Don't move only spamm spells ...
#define GRAND_WARLOCK_ALYTHESS 25166
#define SPELL_PYROGENICS 45230//15secs
#define SPELL_FLAME_TOUCHED 45348
#define SPELL_CONFLAGRATION 45342//30-35 secs
#define SPELL_BLAZE 45235//on main target every 3 secs
#define SPELL_FLAME_SEAR 46771
#define SPELL_BLAZE_SUMMON 45236 //187366 GO
#define SPELL_BLAZE_BURN 45246
#define YELL_CANFLAGRATION "Fire to the aid of shadow!" //only if Sacrolash is not dead
#define SOUND_CANFLAGRATION 12489
#define YELL_SISTER_SACROLASH_DEAD "Sacrolash!"
#define SOUND_SISTER_SACROLASH_DEAD 12492
#define YELL_ALY_KILL_1 "Fire consume."
#define SOUND_ALY_KILL_1 12490
#define YELL_ALY_KILL_2 "Ed-ir Halach!"
#define SOUND_ALY_KILL_2 12491
#define YELL_ALY_DEAD "De-ek Anur!"
#define SOUND_ALY_DEAD 12494
#define YELL_BERSERK "Your luck has run its curse!"
#define SOUND_BERSERK 12493
//Grand Warlock Alythess spells
SPELL_PYROGENICS = 45230, //15secs
SPELL_FLAME_TOUCHED = 45348,
SPELL_CONFLAGRATION = 45342, //30-35 secs
SPELL_BLAZE = 45235, //on main target every 3 secs
SPELL_FLAME_SEAR = 46771,
SPELL_BLAZE_SUMMON = 45236, //187366 GO
SPELL_BLAZE_BURN = 45246
};
enum Creatures
{
GRAND_WARLOCK_ALYTHESS = 25166,
MOB_SHADOW_IMAGE = 25214,
LADY_SACROLASH = 25165
};
struct TRINITY_DLL_DECL boss_sacrolashAI : public ScriptedAI
{
boss_sacrolashAI(Creature *c) : ScriptedAI(c)
{
boss_sacrolashAI(Creature *c) : ScriptedAI(c){
pInstance = ((ScriptedInstance*)c->GetInstanceData());
}
ScriptedInstance *pInstance;
bool InCombat;
bool sisterdeath;
bool SisterDeath;
bool Enraged;
uint32 shadowblades_timer;
uint32 shadownova_timer;
uint32 confoundingblow_timer;
uint32 shadowimage_timer;
uint32 conflagration_timer;
uint32 enrage_timer;
uint32 ShadowbladesTimer;
uint32 ShadownovaTimer;
uint32 ConfoundingblowTimer;
uint32 ShadowimageTimer;
uint32 ConflagrationTimer;
uint32 EnrageTimer;
void Reset()
{
InCombat = false;
Enraged = false;
if(pInstance)
{
Unit* Temp = Unit::GetUnit((*m_creature),pInstance->GetData64(DATA_ALYTHESS));
@@ -135,26 +134,33 @@ struct TRINITY_DLL_DECL boss_sacrolashAI : public ScriptedAI
if(!InCombat)
{
shadowblades_timer = 10000;
shadownova_timer = 30000;
confoundingblow_timer = 25000;
shadowimage_timer = 20000;
conflagration_timer = 30000;
sisterdeath = false;
ShadowbladesTimer = 10000;
ShadownovaTimer = 30000;
ConfoundingblowTimer = 25000;
ShadowimageTimer = 20000;
ConflagrationTimer = 30000;
EnrageTimer = 360000;
enrage_timer = 360000;
SisterDeath = false;
}
if(pInstance)
pInstance->SetData(DATA_EREDAR_TWINS_EVENT, NOT_STARTED);
}
void EnterCombat(Unit *who)
{
DoZoneInCombat();
if(pInstance)
{
Unit* Temp = Unit::GetUnit((*m_creature),pInstance->GetData64(DATA_ALYTHESS));
if (Temp && Temp->isAlive() && !(Temp->getVictim()))
((Creature*)Temp)->AI()->AttackStart(who);
}
if(pInstance)
pInstance->SetData(DATA_EREDAR_TWINS_EVENT, IN_PROGRESS);
}
void KilledUnit(Unit *victim)
@@ -163,14 +169,8 @@ struct TRINITY_DLL_DECL boss_sacrolashAI : public ScriptedAI
{
switch (rand()%2)
{
case 0:
DoPlaySoundToSet(m_creature,SOUND_SAC_KILL_1);
DoYell(YELL_SAC_KILL_1 ,LANG_UNIVERSAL,NULL);
break;
case 1:
DoPlaySoundToSet(m_creature,SOUND_SAC_KILL_2);
DoYell(YELL_SAC_KILL_2 ,LANG_UNIVERSAL,NULL);
break;
case 0: DoScriptText(YELL_SAC_KILL_1, m_creature); break;
case 1: DoScriptText(YELL_SAC_KILL_2, m_creature); break;
}
}
}
@@ -178,14 +178,15 @@ struct TRINITY_DLL_DECL boss_sacrolashAI : public ScriptedAI
void JustDied(Unit* Killer)
{
// only if ALY death
if (sisterdeath)
if (SisterDeath)
{
DoYell(SAY_SAC_DEAD ,LANG_UNIVERSAL,NULL);
DoScriptText(SAY_SAC_DEAD, m_creature);
if(pInstance)
pInstance->SetData(DATA_EREDAR_TWINS_EVENT, DONE);
}
else
{
m_creature->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
}
}
void SpellHitTarget(Unit* target,const SpellEntry* spell)
@@ -214,11 +215,8 @@ struct TRINITY_DLL_DECL boss_sacrolashAI : public ScriptedAI
if(target->HasAura(SPELL_DARK_TOUCHED))
{
target->RemoveAurasDueToSpell(SPELL_DARK_TOUCHED);
target->CastSpell(target,SPELL_DARK_FLAME,true);
}else
{
target->CastSpell(target,SPELL_FLAME_TOUCHED,true);
}
target->CastSpell(target, SPELL_DARK_FLAME, true);
}else target->CastSpell(target, SPELL_FLAME_TOUCHED, true);
}
break;
case SPELL_DARK_TOUCHED:
@@ -227,11 +225,8 @@ struct TRINITY_DLL_DECL boss_sacrolashAI : public ScriptedAI
if(target->HasAura(SPELL_FLAME_TOUCHED))
{
target->RemoveAurasDueToSpell(SPELL_FLAME_TOUCHED);
target->CastSpell(target,SPELL_DARK_FLAME,true);
}else
{
target->CastSpell(target,SPELL_DARK_TOUCHED,true);
}
target->CastSpell(target, SPELL_DARK_FLAME, true);
}else target->CastSpell(target, SPELL_DARK_TOUCHED, true);
}
break;
}
@@ -239,7 +234,7 @@ struct TRINITY_DLL_DECL boss_sacrolashAI : public ScriptedAI
void UpdateAI(const uint32 diff)
{
if(!sisterdeath)
if(!SisterDeath)
{
if (pInstance)
{
@@ -247,12 +242,10 @@ struct TRINITY_DLL_DECL boss_sacrolashAI : public ScriptedAI
Temp = Unit::GetUnit((*m_creature),pInstance->GetData64(DATA_ALYTHESS));
if (Temp && Temp->isDead())
{
DoYell(YELL_SISTER_ALYTHESS_DEAD ,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_SISTER_ALYTHESS_DEAD);
sisterdeath = true;
m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
DoScriptText(YELL_SISTER_ALYTHESS_DEAD, m_creature);
DoCast(m_creature,SPELL_EMPOWER);
m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
SisterDeath = true;
}
}
}
@@ -260,54 +253,52 @@ struct TRINITY_DLL_DECL boss_sacrolashAI : public ScriptedAI
if (!UpdateVictim())
return;
if(sisterdeath)
if(SisterDeath)
{
if (conflagration_timer < diff)
if (ConflagrationTimer < diff)
{
if (!m_creature->IsNonMeleeSpellCasted(false))
{
m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM, 0);
DoCast(target,SPELL_CONFLAGRATION);
conflagration_timer = 30000+(rand()%5000);
DoCast(target, SPELL_CONFLAGRATION);
ConflagrationTimer = 30000+(rand()%5000);
}
}else conflagration_timer -= diff;
}else ConflagrationTimer -= diff;
}
else
{
if(shadownova_timer < diff)
if(ShadownovaTimer < diff)
{
if (!m_creature->IsNonMeleeSpellCasted(false))
{
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM, 0);
DoCast(target,SPELL_SHADOW_NOVA);
DoCast(target, SPELL_SHADOW_NOVA);
if(!sisterdeath)
if(!SisterDeath)
{
m_creature->MonsterTextEmote("directs Shadow Nova at $N",target->GetGUID(),true);
DoPlaySoundToSet(m_creature,SOUND_SHADOW_NOVA);
DoYell(YELL_SHADOW_NOVA,LANG_UNIVERSAL,NULL);
DoScriptText(EMOTE_SHADOW_NOVA, m_creature, target);
DoScriptText(YELL_SHADOW_NOVA, m_creature);
}
shadownova_timer= 30000+(rand()%5000);
ShadownovaTimer = 30000+(rand()%5000);
}
}else shadownova_timer -=diff;
}else ShadownovaTimer -=diff;
}
if(confoundingblow_timer < diff)
if(ConfoundingblowTimer < diff)
{
if (!m_creature->IsNonMeleeSpellCasted(false))
{
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM, 0);
DoCast(target,SPELL_CONFOUNDING_BLOW);
confoundingblow_timer = 20000 + (rand()%5000);
DoCast(target, SPELL_CONFOUNDING_BLOW);
ConfoundingblowTimer = 20000 + (rand()%5000);
}
}else confoundingblow_timer -=diff;
}else ConfoundingblowTimer -=diff;
if(shadowimage_timer < diff)
if(ShadowimageTimer < diff)
{
Unit* target = NULL;
Creature* temp = NULL;
@@ -317,26 +308,25 @@ struct TRINITY_DLL_DECL boss_sacrolashAI : public ScriptedAI
temp = DoSpawnCreature(MOB_SHADOW_IMAGE,0,0,0,0,TEMPSUMMON_CORPSE_DESPAWN,10000);
temp->AI()->AttackStart(target);
}
shadowimage_timer = 20000;
}else shadowimage_timer -=diff;
ShadowimageTimer = 20000;
}else ShadowimageTimer -=diff;
if(shadowblades_timer < diff)
if(ShadowbladesTimer < diff)
{
if (!m_creature->IsNonMeleeSpellCasted(false))
{
DoCast(m_creature,SPELL_SHADOW_BLADES);
shadowblades_timer = 10000;
DoCast(m_creature, SPELL_SHADOW_BLADES);
ShadowbladesTimer = 10000;
}
}else shadowblades_timer -=diff;
}else ShadowbladesTimer -=diff;
if (enrage_timer < diff)
if (EnrageTimer < diff && !Enraged)
{
m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
DoYell(YELL_ENRAGE ,LANG_UNIVERSAL,NULL);
DoScriptText(YELL_ENRAGE, m_creature);
DoCast(m_creature,SPELL_ENRAGE);
enrage_timer = 300000;
}else enrage_timer -= diff;
Enraged = true;
}else EnrageTimer -= diff;
if( m_creature->isAttackReady() && !m_creature->IsNonMeleeSpellCasted(false))
{
@@ -358,29 +348,32 @@ CreatureAI* GetAI_boss_sacrolash(Creature *_Creature)
struct TRINITY_DLL_DECL boss_alythessAI : public Scripted_NoMovementAI
{
boss_alythessAI(Creature *c) : Scripted_NoMovementAI(c)
{
pInstance = ((ScriptedInstance*)c->GetInstanceData()); IntroStepCounter = 10;
boss_alythessAI(Creature *c) : Scripted_NoMovementAI(c){
pInstance = ((ScriptedInstance*)c->GetInstanceData());
IntroStepCounter = 10;
}
ScriptedInstance *pInstance;
bool InCombat;
bool sisterdeath;
bool SisterDeath;
bool Enraged;
uint32 IntroStepCounter;
uint32 IntroYell_Timer;
uint32 IntroYellTimer;
uint32 conflagration_timer;
uint32 blaze_timer;
uint32 pyrogenics_timer;
uint32 shadownova_timer;
uint32 flamesear_timer;
uint32 enrage_timer;
uint32 ConflagrationTimer;
uint32 BlazeTimer;
uint32 PyrogenicsTimer;
uint32 ShadownovaTimer;
uint32 FlamesearTimer;
uint32 EnrageTimer;
void Reset()
{
InCombat = false;
Enraged = false;
if(pInstance)
{
Unit* Temp = Unit::GetUnit((*m_creature),pInstance->GetData64(DATA_SACROLASH));
@@ -400,25 +393,34 @@ struct TRINITY_DLL_DECL boss_alythessAI : public Scripted_NoMovementAI
if(!InCombat)
{
conflagration_timer = 45000;
blaze_timer = 100;
pyrogenics_timer = 15000;
shadownova_timer = 40000;
sisterdeath = false;
enrage_timer = 360000;
flamesear_timer = 15000;
IntroYell_Timer = 10000;
ConflagrationTimer = 45000;
BlazeTimer = 100;
PyrogenicsTimer = 15000;
ShadownovaTimer = 40000;
EnrageTimer = 360000;
FlamesearTimer = 15000;
IntroYellTimer = 10000;
SisterDeath = false;
}
if(pInstance)
pInstance->SetData(DATA_EREDAR_TWINS_EVENT, NOT_STARTED);
}
void EnterCombat(Unit *who)
{
DoZoneInCombat();
if(pInstance)
{
Unit* Temp = Unit::GetUnit((*m_creature),pInstance->GetData64(DATA_SACROLASH));
if (Temp && Temp->isAlive() && !(Temp->getVictim()))
((Creature*)Temp)->AI()->AttackStart(who);
}
if(pInstance)
pInstance->SetData(DATA_EREDAR_TWINS_EVENT, IN_PROGRESS);
}
void AttackStart(Unit *who)
@@ -458,29 +460,23 @@ struct TRINITY_DLL_DECL boss_alythessAI : public Scripted_NoMovementAI
{
switch (rand()%2)
{
case 0:
DoPlaySoundToSet(m_creature,SOUND_ALY_KILL_1);
DoYell(YELL_ALY_KILL_1 ,LANG_UNIVERSAL,NULL);
break;
case 1:
DoPlaySoundToSet(m_creature,SOUND_ALY_KILL_2);
DoYell(YELL_ALY_KILL_2 ,LANG_UNIVERSAL,NULL);
break;
case 0: DoScriptText(YELL_ALY_KILL_1, m_creature); break;
case 1: DoScriptText(YELL_ALY_KILL_2, m_creature); break;
}
}
}
void JustDied(Unit* Killer)
{
if (sisterdeath)
if (SisterDeath)
{
DoYell(YELL_ALY_DEAD ,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_ALY_DEAD);
DoScriptText(YELL_ALY_DEAD, m_creature);
if(pInstance)
pInstance->SetData(DATA_EREDAR_TWINS_EVENT, DONE);
}
else
{
m_creature->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
}
}
void SpellHitTarget(Unit* target,const SpellEntry* spell)
@@ -489,7 +485,7 @@ struct TRINITY_DLL_DECL boss_alythessAI : public Scripted_NoMovementAI
{
case SPELL_BLAZE:
target->CastSpell(target,SPELL_BLAZE_SUMMON,true);
target->CastSpell(target, SPELL_BLAZE_SUMMON, true);
case SPELL_CONFLAGRATION:
case SPELL_FLAME_SEAR:
HandleTouchedSpells(target, SPELL_FLAME_TOUCHED);
@@ -510,10 +506,10 @@ struct TRINITY_DLL_DECL boss_alythessAI : public Scripted_NoMovementAI
if(target->HasAura(SPELL_DARK_TOUCHED))
{
target->RemoveAurasDueToSpell(SPELL_DARK_TOUCHED);
target->CastSpell(target,SPELL_DARK_FLAME,true);
target->CastSpell(target, SPELL_DARK_FLAME, true);
}else
{
target->CastSpell(target,SPELL_FLAME_TOUCHED,true);
target->CastSpell(target, SPELL_FLAME_TOUCHED, true);
}
}
break;
@@ -523,11 +519,8 @@ struct TRINITY_DLL_DECL boss_alythessAI : public Scripted_NoMovementAI
if(target->HasAura(SPELL_FLAME_TOUCHED))
{
target->RemoveAurasDueToSpell(SPELL_FLAME_TOUCHED);
target->CastSpell(target,SPELL_DARK_FLAME,true);
}else
{
target->CastSpell(target,SPELL_DARK_TOUCHED,true);
}
target->CastSpell(target, SPELL_DARK_FLAME, true);
}else target->CastSpell(target, SPELL_DARK_TOUCHED, true);
}
break;
}
@@ -535,38 +528,30 @@ struct TRINITY_DLL_DECL boss_alythessAI : public Scripted_NoMovementAI
uint32 IntroStep(uint32 step)
{
Creature* Sacrolash = Unit::GetCreature((*m_creature),pInstance->GetData64(DATA_SACROLASH));
Creature* Sacrolash = (Creature*)Unit::GetUnit((*m_creature),pInstance->GetData64(DATA_SACROLASH));
switch (step)
{
case 0: DoPlaySoundToSet(m_creature,SOUND_INTRO); return 0;
case 0: return 0;
case 1:
if(Sacrolash)
Sacrolash->MonsterYell(YELL_INTRO_SAC_1, LANG_UNIVERSAL,NULL);
return 1000;
case 2:
m_creature->MonsterYell(YELL_INTRO_ALY_2, LANG_UNIVERSAL,NULL);
DoScriptText(YELL_INTRO_SAC_1, Sacrolash);
return 1000;
case 2: DoScriptText(YELL_INTRO_ALY_2, m_creature); return 1000;
case 3:
if(Sacrolash)
Sacrolash->MonsterYell(YELL_INTRO_SAC_3, LANG_UNIVERSAL,NULL);
DoScriptText(YELL_INTRO_SAC_3, Sacrolash);
return 2000;
case 4:
m_creature->MonsterYell(YELL_INTRO_ALY_4, LANG_UNIVERSAL,NULL);
return 1000;
case 4: DoScriptText(YELL_INTRO_ALY_4, m_creature); return 1000;
case 5:
if(Sacrolash)
Sacrolash->MonsterYell(YELL_INTRO_SAC_5, LANG_UNIVERSAL,NULL);
DoScriptText(YELL_INTRO_SAC_5, Sacrolash);
return 2000;
case 6:
m_creature->MonsterYell(YELL_INTRO_ALY_6, LANG_UNIVERSAL,NULL);
return 1000;
case 6: DoScriptText(YELL_INTRO_ALY_6, m_creature); return 1000;
case 7:
if(Sacrolash)
Sacrolash->MonsterYell(YELL_INTRO_SAC_7, LANG_UNIVERSAL,NULL);
DoScriptText(YELL_INTRO_SAC_7, Sacrolash);
return 3000;
case 8:
m_creature->MonsterYell(YELL_INTRO_ALY_8, LANG_UNIVERSAL,NULL);
return 900000;
case 8: DoScriptText(YELL_INTRO_ALY_8, m_creature); return 900000;
}
return 10000;
}
@@ -575,13 +560,13 @@ struct TRINITY_DLL_DECL boss_alythessAI : public Scripted_NoMovementAI
{
if(IntroStepCounter < 9)
{
if(IntroYell_Timer < diff)
if(IntroYellTimer < diff)
{
IntroYell_Timer = IntroStep(IntroStepCounter++);
}else IntroYell_Timer -= diff;
IntroYellTimer = IntroStep(++IntroStepCounter);
}else IntroYellTimer -= diff;
}
if(!sisterdeath)
if(!SisterDeath)
{
if (pInstance)
{
@@ -589,12 +574,10 @@ struct TRINITY_DLL_DECL boss_alythessAI : public Scripted_NoMovementAI
Temp = Unit::GetUnit((*m_creature),pInstance->GetData64(DATA_SACROLASH));
if (Temp && Temp->isDead())
{
DoYell(YELL_SISTER_SACROLASH_DEAD ,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(m_creature,SOUND_SISTER_SACROLASH_DEAD);
sisterdeath = true;
DoScriptText(YELL_SISTER_SACROLASH_DEAD, m_creature);
DoCast(m_creature, SPELL_EMPOWER);
m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
DoCast(m_creature,SPELL_EMPOWER);
SisterDeath = true;
}
}
}
@@ -602,78 +585,76 @@ struct TRINITY_DLL_DECL boss_alythessAI : public Scripted_NoMovementAI
if (!UpdateVictim())
return;
if(sisterdeath)
if(SisterDeath)
{
if(shadownova_timer < diff)
if(ShadownovaTimer < diff)
{
if (!m_creature->IsNonMeleeSpellCasted(false))
{
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM, 0);
DoCast(target,SPELL_SHADOW_NOVA);
shadownova_timer= 30000+(rand()%5000);
DoCast(target, SPELL_SHADOW_NOVA);
ShadownovaTimer= 30000+(rand()%5000);
}
}else shadownova_timer -=diff;
}else ShadownovaTimer -=diff;
}
else
{
if (conflagration_timer < diff)
if(ConflagrationTimer < diff)
{
if (!m_creature->IsNonMeleeSpellCasted(false))
{
m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM, 0);
DoCast(target,SPELL_CONFLAGRATION);
conflagration_timer = 30000+(rand()%5000);
DoCast(target, SPELL_CONFLAGRATION);
ConflagrationTimer = 30000+(rand()%5000);
if(!sisterdeath)
if(!SisterDeath)
{
m_creature->MonsterTextEmote("directs Conflagration at $N",target->GetGUID(),true);
DoPlaySoundToSet(m_creature,SOUND_CANFLAGRATION);
DoYell(YELL_CANFLAGRATION,LANG_UNIVERSAL,NULL);
DoScriptText(EMOTE_CONFLAGRATION, m_creature, target);
DoScriptText(YELL_CANFLAGRATION, m_creature);
}
blaze_timer = 4000;
BlazeTimer = 4000;
}
}else conflagration_timer -= diff;
}else ConflagrationTimer -= diff;
}
if (flamesear_timer < diff)
if(FlamesearTimer < diff)
{
if (!m_creature->IsNonMeleeSpellCasted(false))
if(!m_creature->IsNonMeleeSpellCasted(false))
{
DoCast(m_creature,SPELL_FLAME_SEAR);
flamesear_timer = 15000;
DoCast(m_creature, SPELL_FLAME_SEAR);
FlamesearTimer = 15000;
}
}else flamesear_timer -=diff;
}else FlamesearTimer -=diff;
if (pyrogenics_timer < diff)
if (PyrogenicsTimer < diff)
{
if (!m_creature->IsNonMeleeSpellCasted(false))
if(!m_creature->IsNonMeleeSpellCasted(false))
{
DoCast(m_creature,SPELL_PYROGENICS,true);
pyrogenics_timer = 15000;
DoCast(m_creature, SPELL_PYROGENICS,true);
PyrogenicsTimer = 15000;
}
}else pyrogenics_timer -= diff;
}else PyrogenicsTimer -= diff;
if (blaze_timer < diff)
if (BlazeTimer < diff)
{
if (!m_creature->IsNonMeleeSpellCasted(false))
if(!m_creature->IsNonMeleeSpellCasted(false))
{
DoCast(m_creature->getVictim(),SPELL_BLAZE);
blaze_timer = 3800;
DoCast(m_creature->getVictim(), SPELL_BLAZE);
BlazeTimer = 3800;
}
}else blaze_timer -= diff;
}else BlazeTimer -= diff;
if (enrage_timer < diff)
if (EnrageTimer < diff && !Enraged)
{
m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
DoPlaySoundToSet(m_creature,SOUND_BERSERK);
DoYell(YELL_BERSERK ,LANG_UNIVERSAL,NULL);
DoCast(m_creature,SPELL_ENRAGE);
enrage_timer = 300000;
}else enrage_timer -= diff;
DoScriptText(YELL_BERSERK, m_creature);
DoCast(m_creature, SPELL_ENRAGE);
Enraged = true;
}else EnrageTimer -= diff;
}
};
@@ -686,16 +667,15 @@ struct TRINITY_DLL_DECL mob_shadow_imageAI : public ScriptedAI
{
mob_shadow_imageAI(Creature *c) : ScriptedAI(c) {}
uint32 shadowfury_timer;
uint32 kill_timer;
uint32 darkstrike_timer;
uint32 ShadowfuryTimer;
uint32 KillTimer;
uint32 DarkstrikeTimer;
void Reset()
{
shadowfury_timer = 5000 + (rand()%15000);
darkstrike_timer = 3000;
kill_timer = 15000;
ShadowfuryTimer = 5000 + (rand()%15000);
DarkstrikeTimer = 3000;
KillTimer = 15000;
}
void EnterCombat(Unit *who){}
@@ -712,11 +692,8 @@ struct TRINITY_DLL_DECL mob_shadow_imageAI : public ScriptedAI
if(target->HasAura(SPELL_FLAME_TOUCHED))
{
target->RemoveAurasDueToSpell(SPELL_FLAME_TOUCHED);
target->CastSpell(target,SPELL_DARK_FLAME,true);
}else
{
target->CastSpell(target,SPELL_DARK_TOUCHED,true);
}
target->CastSpell(target, SPELL_DARK_FLAME, true);
}else target->CastSpell(target,SPELL_DARK_TOUCHED,true);
}
break;
}
@@ -725,36 +702,34 @@ struct TRINITY_DLL_DECL mob_shadow_imageAI : public ScriptedAI
void UpdateAI(const uint32 diff)
{
if(!m_creature->HasAura(SPELL_IMAGE_VISUAL))
DoCast(m_creature,SPELL_IMAGE_VISUAL);
DoCast(m_creature, SPELL_IMAGE_VISUAL);
if(kill_timer < diff)
if(KillTimer < diff)
{
m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
kill_timer = 9999999;
}else kill_timer -=diff;
KillTimer = 9999999;
}else KillTimer -=diff;
if (!UpdateVictim())
return;
if(shadowfury_timer < diff)
if(ShadowfuryTimer < diff)
{
DoCast(m_creature,SPELL_SHADOW_FURY);
shadowfury_timer = 10000;
}else shadowfury_timer -=diff;
DoCast(m_creature, SPELL_SHADOW_FURY);
ShadowfuryTimer = 10000;
}else ShadowfuryTimer -=diff;
if(darkstrike_timer < diff)
if(DarkstrikeTimer < diff)
{
if(!m_creature->IsNonMeleeSpellCasted(false))
{
//If we are within range melee the target
if( m_creature->IsWithinMeleeRange(m_creature->getVictim()))
{
DoCast(m_creature->getVictim(),SPELL_DARK_STRIKE);
}
DoCast(m_creature->getVictim(), SPELL_DARK_STRIKE);
}
darkstrike_timer = 3000;
DarkstrikeTimer = 3000;
}
else darkstrike_timer -= diff;
else DarkstrikeTimer -= diff;
}
};
@@ -766,6 +741,7 @@ CreatureAI* GetAI_mob_shadow_image(Creature *_Creature)
void AddSC_boss_eredar_twins()
{
Script *newscript;
newscript = new Script;
newscript->Name="boss_sacrolash";
newscript->GetAI = &GetAI_boss_sacrolash;
@@ -781,4 +757,3 @@ void AddSC_boss_eredar_twins()
newscript->GetAI = &GetAI_mob_shadow_image;
newscript->RegisterSelf();
}
@@ -1,4 +1,4 @@
/* Copyright ?2006,2007 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
/* Copyright (C) 2009 Trinity <http://www.trinitycore.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 2 of the License, or
@@ -22,76 +22,77 @@ EndScriptData */
#include "precompiled.h"
#include "def_sunwell_plateau.h"
#include "Player.h"
// AURA
#define AURA_SUNWELL_RADIANCE 45769
#define AURA_NOXIOUS_FUMES 47002
// LAND PHASE SPELL
#define SPELL_CLEAVE 19983
#define SPELL_CORROSION 45866
#define SPELL_GAS_NOVA 45855
#define SPELL_ENCAPSULATE_CHANNEL 45661
#define SPELL_ENCAPSULATE_EFFECT 45665
#define SPELL_ENCAPSULATE_AOE 45662
// FLIGHT PHASE SPELL
#define SPELL_VAPOR_SELECT 45391 // fel to player, force cast 45392, 50000y selete target
#define SPELL_VAPOR_SUMMON 45392 // player summon vapor, radius around caster, 5y,
#define SPELL_VAPOR_FORCE 45388 // vapor to fel, force cast 45389
#define SPELL_VAPOR_CHANNEL 45389 // fel to vapor, green beam channel
#define SPELL_VAPOR_TRIGGER 45411 // linked to 45389, vapor to self, trigger 45410 and 46931
#define SPELL_VAPOR_DAMAGE 46931 // vapor damage, 4000
#define SPELL_TRAIL_SUMMON 45410 // vapor summon trail
#define SPELL_TRAIL_TRIGGER 45399 // trail to self, trigger 45402
#define SPELL_TRAIL_DAMAGE 45402 // trail damage, 2000 + 2000 dot
#define SPELL_DEAD_SUMMON 45400 // summon blazing dead, 5min
#define SPELL_DEAD_PASSIVE 45415
#define SPELL_FOG_BREATH 45495 // fel to self, speed burst
#define SPELL_FOG_TRIGGER 45582 // fog to self, trigger 45782
#define SPELL_FOG_FORCE 45782 // fog to player, force cast 45714
#define SPELL_FOG_INFORM 45714 // player let fel cast 45717, script effect
#define SPELL_FOG_CHARM 45717 // fel to player
#define SPELL_FOG_CHARM2 45726 // link to 45717
enum Quotes
{
YELL_BIRTH = -1580036,
YELL_KILL1 = -1580037,
YELL_KILL2 = -1580038,
YELL_BREATH = -1580039,
YELL_TAKEOFF = -1580040,
YELL_BERSERK = -1580041,
YELL_DEATH = -1580042,
YELL_KALECGOS = -1580043 //after felmyst's death spawned and say this
};
#define SPELL_TRANSFORM_TRIGGER 44885 // madrigosa to self, trigger 46350
#define SPELL_TRANSFORM_VISUAL 46350 //46411stun?
#define SPELL_TRANSFORM_FELMYST 45068 // become fel
#define SPELL_FELMYST_SUMMON 45069
// OTHER
#define SPELL_BERSERK 45078
#define SPELL_CLOUD_VISUAL 45212
#define SPELL_CLOUD_SUMMON 45884
enum Spells
{
//Aura
AURA_SUNWELL_RADIANCE = 45769,
AURA_NOXIOUS_FUMES = 47002,
//Creatures
#define MOB_FELMYST 25038
#define MOB_BRUTALLUS
#define MOB_KALECGOS
#define MOB_DEAD 25268
#define MOB_MADRIGOSA 25160
#define MOB_FELMYST_VISUAL 25041
#define MOB_FLIGHT_LEFT 25357
#define MOB_FLIGHT_RIGHT 25358
#define MOB_DEATH_CLOUD 25703
#define MOB_VAPOR 25265
#define MOB_VAPOR_TRAIL 25267
//Land phase
SPELL_CLEAVE = 19983,
SPELL_CORROSION = 45866,
SPELL_GAS_NOVA = 45855,
SPELL_ENCAPSULATE_CHANNEL = 45661,
SPELL_ENCAPSULATE_EFFECT = 45665,
SPELL_ENCAPSULATE_AOE = 45662,
//Yells and Sounds
#define YELL_BIRTH "Glory to Kil'jaeden! Death to all who oppose!"
#define SOUND_BIRTH 12477
#define YELL_KILL1 "I kill for the master!"
#define SOUND_KILL1 12480
#define YELL_KILL2 "The end has come!"
#define SOUND_KILL2 12481
#define YELL_BREATH "Choke on your final breath!"
#define SOUND_BREATH 12478
#define YELL_TAKEOFF "I am stronger than ever before!"
#define SOUND_TAKEOFF 12479
#define YELL_BERSERK "No more hesitation! Your fates are written!"
#define SOUND_BERSERK 12482
#define YELL_DEATH "Kil'jaeden... will... prevail..."
#define SOUND_DEATH 12483
//Flight phase
SPELL_VAPOR_SELECT = 45391, // fel to player, force cast 45392, 50000y selete target
SPELL_VAPOR_SUMMON = 45392, // player summon vapor, radius around caster, 5y,
SPELL_VAPOR_FORCE = 45388, // vapor to fel, force cast 45389
SPELL_VAPOR_CHANNEL = 45389, // fel to vapor, green beam channel
SPELL_VAPOR_TRIGGER = 45411, // linked to 45389, vapor to self, trigger 45410 and 46931
SPELL_VAPOR_DAMAGE = 46931, // vapor damage, 4000
SPELL_TRAIL_SUMMON = 45410, // vapor summon trail
SPELL_TRAIL_TRIGGER = 45399, // trail to self, trigger 45402
SPELL_TRAIL_DAMAGE = 45402, // trail damage, 2000 + 2000 dot
SPELL_DEAD_SUMMON = 45400, // summon blazing dead, 5min
SPELL_DEAD_PASSIVE = 45415,
SPELL_FOG_BREATH = 45495, // fel to self, speed burst
SPELL_FOG_TRIGGER = 45582, // fog to self, trigger 45782
SPELL_FOG_FORCE = 45782, // fog to player, force cast 45714
SPELL_FOG_INFORM = 45714, // player let fel cast 45717, script effect
SPELL_FOG_CHARM = 45717, // fel to player
SPELL_FOG_CHARM2 = 45726, // link to 45717
#define YELL_KALECGOS "Madrigosa deserved a far better fate. You did what had to be done, but this battle is far from over."
SPELL_TRANSFORM_TRIGGER = 44885, // madrigosa to self, trigger 46350
SPELL_TRANSFORM_VISUAL = 46350, //46411stun?
SPELL_TRANSFORM_FELMYST = 45068, // become fel
SPELL_FELMYST_SUMMON = 45069,
//Other
SPELL_BERSERK = 45078,
SPELL_CLOUD_VISUAL = 45212,
SPELL_CLOUD_SUMMON = 45884
};
enum Creatures
{
MOB_FELMYST = 25038,
//MOB_BRUTALLUS =
//MOB_KALECGOS =
MOB_DEAD = 25268,
MOB_MADRIGOSA = 25160,
MOB_FELMYST_VISUAL = 25041,
MOB_FLIGHT_LEFT = 25357,
MOB_FLIGHT_RIGHT = 25358,
MOB_DEATH_CLOUD = 25703,
MOB_VAPOR = 25265,
MOB_VAPOR_TRAIL = 25267
};
enum PhaseFelmyst
{
@@ -125,10 +126,11 @@ static EventFelmyst MaxTimer[]=
struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
{
boss_felmystAI(Creature *c) : ScriptedAI(c)
{
boss_felmystAI(Creature *c) : ScriptedAI(c){
pInstance = ((ScriptedInstance*)c->GetInstanceData());
// wait for core patch be accepted
SpellEntry *TempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_ENCAPSULATE_EFFECT);
/*SpellEntry *TempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_ENCAPSULATE_EFFECT);
if(TempSpell->SpellIconID == 2294)
TempSpell->SpellIconID = 2295;
TempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_VAPOR_TRIGGER);
@@ -136,9 +138,10 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
TempSpell->Attributes |= SPELL_ATTR_PASSIVE;
TempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_FOG_CHARM2);
if((TempSpell->Attributes & SPELL_ATTR_PASSIVE) == 0)
TempSpell->Attributes |= SPELL_ATTR_PASSIVE;
TempSpell->Attributes |= SPELL_ATTR_PASSIVE;*/
}
ScriptedInstance *pInstance;
PhaseFelmyst Phase;
EventFelmyst Event;
uint32 Timer[EVENT_FLIGHT + 1];
@@ -155,21 +158,27 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
Timer[EVENT_BERSERK] = 600000;
FlightCount = 0;
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
m_creature->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 10);
m_creature->SetFloatValue(UNIT_FIELD_COMBATREACH, 10);
DespawnSummons(MOB_VAPOR_TRAIL);
m_creature->setActive(false);
m_creature->setActive(false);
if(pInstance)
pInstance->SetData(DATA_FELMYST_EVENT, NOT_STARTED);
}
void EnterCombat(Unit *who)
{
m_creature->setActive(true);
m_creature->setActive(true);
DoZoneInCombat();
m_creature->CastSpell(m_creature, AURA_SUNWELL_RADIANCE, true);
m_creature->CastSpell(m_creature, AURA_NOXIOUS_FUMES, true);
EnterPhase(PHASE_GROUND);
if(pInstance)
pInstance->SetData(DATA_FELMYST_EVENT, IN_PROGRESS);
}
void AttackStart(Unit *who)
@@ -188,21 +197,22 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
{
switch(rand()%2)
{
case 0:
DoYell(YELL_KILL1,LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_KILL1);
break;
case 1:
DoYell(YELL_KILL2,LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_KILL2);
break;
case 0: DoScriptText(YELL_KILL1, m_creature); break;
case 1: DoScriptText(YELL_KILL2, m_creature); break;
}
}
void JustRespawned()
{
DoScriptText(YELL_BIRTH, m_creature);
}
void JustDied(Unit* Killer)
{
DoYell(YELL_DEATH, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_DEATH);
DoScriptText(YELL_DEATH, m_creature);
if(pInstance)
pInstance->SetData(DATA_FELMYST_EVENT, DONE);
}
void SpellHit(Unit *caster, const SpellEntry *spell)
@@ -279,21 +289,26 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
switch(FlightCount)
{
case 0:
m_creature->AttackStop();
//m_creature->AttackStop();
error_log("prevent fly phase");
m_creature->GetMotionMaster()->Clear(false);
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
m_creature->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING);
m_creature->StopMoving();
DoYell(YELL_TAKEOFF, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_TAKEOFF);
DoScriptText(YELL_TAKEOFF, m_creature);
Timer[EVENT_FLIGHT_SEQUENCE] = 2000;
break;
case 1:
error_log("Move to Fly point");
m_creature->GetMotionMaster()->MovePoint(0, m_creature->GetPositionX()+1, m_creature->GetPositionY(), m_creature->GetPositionZ()+10);
Timer[EVENT_FLIGHT_SEQUENCE] = 0;
break;
case 2:
if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0, 150, true))
case 2:{
error_log("Summon Vapor case 2");
Unit* target;
target = SelectUnit(SELECT_TARGET_RANDOM, 0, 150, true);
if(!target) target = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_PLAYER_GUID));
if(target)
{
Creature* Vapor = m_creature->SummonCreature(MOB_VAPOR, target->GetPositionX()-5+rand()%10, target->GetPositionY()-5+rand()%10, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000);
if(Vapor)
@@ -305,11 +320,15 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
}
}else EnterEvadeMode();
Timer[EVENT_FLIGHT_SEQUENCE] = 10000;
break;
case 3:
break;}
case 3: {
DespawnSummons(MOB_VAPOR_TRAIL);
error_log("Summon Vapor case3");
//m_creature->CastSpell(m_creature, SPELL_VAPOR_SELECT); need core support
if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0, 150, true))
Unit* target;
target = SelectUnit(SELECT_TARGET_RANDOM, 0, 150, true);
if(!target) target = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_PLAYER_GUID));
if(target)
{
//target->CastSpell(target, SPELL_VAPOR_SUMMON, true); need core support
Creature* Vapor = m_creature->SummonCreature(MOB_VAPOR, target->GetPositionX()-5+rand()%10, target->GetPositionY()-5+rand()%10, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 9000);
@@ -322,13 +341,16 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
}
}else EnterEvadeMode();
Timer[EVENT_FLIGHT_SEQUENCE] = 10000;
break;
break;}
case 4:
DespawnSummons(MOB_VAPOR_TRAIL);
Timer[EVENT_FLIGHT_SEQUENCE] = 1;
break;
case 5:
if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0, 150, true))
case 5:{
Unit* target;
target = SelectUnit(SELECT_TARGET_RANDOM, 0, 150, true);
if(!target) target = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_PLAYER_GUID));
if(target)
{
BreathX = target->GetPositionX();
BreathY = target->GetPositionY();
@@ -337,11 +359,11 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
m_creature->GetMotionMaster()->MovePoint(0, x, y, z+10);
}else EnterEvadeMode();
Timer[EVENT_FLIGHT_SEQUENCE] = 0;
break;
break;}
case 6:
m_creature->SetOrientation(m_creature->GetAngle(BreathX, BreathY));
m_creature->StopMoving();
DoTextEmote("takes a deep breath.", NULL);
//DoTextEmote("takes a deep breath.", NULL);
Timer[EVENT_FLIGHT_SEQUENCE] = 10000;
break;
case 7:
@@ -413,10 +435,9 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
switch(Event)
{
case EVENT_BERSERK:
DoYell(YELL_BERSERK, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_BERSERK);
DoScriptText(YELL_BERSERK, m_creature);
m_creature->CastSpell(m_creature, SPELL_BERSERK, true);
Timer[EVENT_BERSERK] = 0;
Timer[EVENT_BERSERK] = 10000;
break;
case EVENT_CLEAVE:
m_creature->CastSpell(m_creature->getVictim(), SPELL_CLEAVE, false);
@@ -451,8 +472,7 @@ struct TRINITY_DLL_DECL boss_felmystAI : public ScriptedAI
switch(Event)
{
case EVENT_BERSERK:
DoYell(YELL_BERSERK, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_BERSERK);
DoScriptText(YELL_BERSERK, m_creature);
m_creature->CastSpell(m_creature, SPELL_BERSERK, true);
Timer[EVENT_BERSERK] = 0;
break;
@@ -584,4 +604,3 @@ void AddSC_boss_felmyst()
newscript->GetAI = &GetAI_mob_felmyst_trail;
newscript->RegisterSelf();
}
@@ -24,70 +24,80 @@ EndScriptData */
#include "precompiled.h"
#include "def_sunwell_plateau.h"
//kalecgos dragon form
#define SAY_EVIL_AGGRO -1580000
#define SAY_EVIL_SPELL1 -1580001
#define SAY_EVIL_SPELL2 -1580002
#define SAY_EVIL_SLAY1 -1580003
#define SAY_EVIL_SLAY2 -1580004
#define SAY_EVIL_ENRAGE -1580005
//kalecgos humanoid form
#define SAY_GOOD_AGGRO -1580006
#define SAY_GOOD_NEAR_DEATH -1580007
#define SAY_GOOD_NEAR_DEATH2 -1580008
#define SAY_GOOD_PLRWIN -1580009
enum Quotes
{
//Kalecgos dragon form
SAY_EVIL_AGGRO = -1580000,
SAY_EVIL_SPELL1 = -1580001,
SAY_EVIL_SPELL2 = -1580002,
SAY_EVIL_SLAY1 = -1580003,
SAY_EVIL_SLAY2 = -1580004,
SAY_EVIL_ENRAGE = -1580005,
#define SAY_SATH_AGGRO -1580010
#define SAY_SATH_DEATH -1580011
#define SAY_SATH_SPELL1 -1580012
#define SAY_SATH_SPELL2 -1580013
#define SAY_SATH_SLAY1 -1580014
#define SAY_SATH_SLAY2 -1580015
#define SAY_SATH_ENRAGE -1580016
//Kalecgos humanoid form
SAY_GOOD_AGGRO = -1580006,
SAY_GOOD_NEAR_DEATH = -1580007,
SAY_GOOD_NEAR_DEATH2 = -1580008,
SAY_GOOD_PLRWIN = -1580009,
#define GO_FAILED "You are unable to use this currently."
//Shattrowar
SAY_SATH_AGGRO = -1580010,
SAY_SATH_DEATH = -1580011,
SAY_SATH_SPELL1 = -1580012,
SAY_SATH_SPELL2 = -1580013,
SAY_SATH_SLAY1 = -1580014,
SAY_SATH_SLAY2 = -1580015,
SAY_SATH_ENRAGE = -1580016
};
#define FLY_X 1679
#define FLY_Y 900
#define FLY_Z 82
enum SpellIds
{
AURA_SUNWELL_RADIANCE = 45769,
AURA_SPECTRAL_EXHAUSTION = 44867,
AURA_SPECTRAL_REALM = 46021,
AURA_SPECTRAL_INVISIBILITY = 44801,
AURA_DEMONIC_VISUAL = 44800,
SPELL_SPECTRAL_BLAST = 44869,
SPELL_TELEPORT_SPECTRAL = 46019,
SPELL_ARCANE_BUFFET = 45018,
SPELL_FROST_BREATH = 44799,
SPELL_TAIL_LASH = 45122,
SPELL_BANISH = 44836,
SPELL_TRANSFORM_KALEC = 44670,
SPELL_ENRAGE = 44807,
SPELL_CORRUPTION_STRIKE = 45029,
SPELL_AGONY_CURSE = 45032,
SPELL_SHADOW_BOLT = 45031,
SPELL_HEROIC_STRIKE = 45026,
SPELL_REVITALIZE = 45027
};
enum Creatures
{
MOB_KALECGOS = 24850,
MOB_KALEC = 24891,
MOB_SATHROVARR = 24892
};
#define GO_FAILED "You are unable to use this currently."
#define FLY_X 1679
#define FLY_Y 900
#define FLY_Z 82
#define CENTER_X 1705
#define CENTER_Y 930
#define RADIUS 30
#define AURA_SUNWELL_RADIANCE 45769
#define AURA_SPECTRAL_EXHAUSTION 44867
#define AURA_SPECTRAL_REALM 46021
#define AURA_SPECTRAL_INVISIBILITY 44801
#define AURA_DEMONIC_VISUAL 44800
#define SPELL_SPECTRAL_BLAST 44869
#define SPELL_TELEPORT_SPECTRAL 46019
#define SPELL_ARCANE_BUFFET 45018
#define SPELL_FROST_BREATH 44799
#define SPELL_TAIL_LASH 45122
#define SPELL_BANISH 44836
#define SPELL_TRANSFORM_KALEC 44670
#define SPELL_ENRAGE 44807
#define SPELL_CORRUPTION_STRIKE 45029
#define SPELL_AGONY_CURSE 45032
#define SPELL_SHADOW_BOLT 45031
#define SPELL_HEROIC_STRIKE 45026
#define SPELL_REVITALIZE 45027
#define MOB_KALECGOS 24850
#define MOB_KALEC 24891
#define MOB_SATHROVARR 24892
#define DRAGON_REALM_Z 53.079
#define DEMON_REALM_Z -74.558
uint32 WildMagic[]= { 44978, 45001, 45002, 45004, 45006, 45010 };
struct TRINITY_DLL_DECL boss_kalecgosAI : public ScriptedAI
{
boss_kalecgosAI(Creature *c) : ScriptedAI(c)
@@ -162,6 +172,9 @@ struct TRINITY_DLL_DECL boss_kalecgosAI : public ScriptedAI
GameObject *Door = GameObject::GetGameObject(*m_creature, DoorGUID);
if(Door) Door->SetLootState(GO_ACTIVATED);
DoZoneInCombat();
if(pInstance)
pInstance->SetData(DATA_KALECGOS_EVENT, IN_PROGRESS);
}
void KilledUnit(Unit *victim)
@@ -275,6 +288,9 @@ struct TRINITY_DLL_DECL boss_sathrovarrAI : public ScriptedAI
ResetThreat = 1000;
isEnraged = false;
isBanished = false;
if(pInstance)
pInstance->SetData(DATA_KALECGOS_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* who)
@@ -325,6 +341,9 @@ struct TRINITY_DLL_DECL boss_sathrovarrAI : public ScriptedAI
((boss_kalecgosAI*)((Creature*)Kalecgos)->AI())->TalkTimer = 1;
((boss_kalecgosAI*)((Creature*)Kalecgos)->AI())->isFriendly = true;
}
if(pInstance)
pInstance->SetData(DATA_KALECGOS_EVENT, DONE);
}
void TeleportAllPlayersBack()
@@ -437,8 +456,7 @@ struct TRINITY_DLL_DECL boss_kalecAI : public ScriptedAI
bool isEnraged; // if demon is enraged
boss_kalecAI(Creature *c) : ScriptedAI(c)
{
boss_kalecAI(Creature *c) : ScriptedAI(c){
pInstance = ((ScriptedInstance*)c->GetInstanceData());
}
@@ -671,4 +689,3 @@ void AddSC_boss_kalecgos()
newscript->pGOHello = &GOkalocegos_teleporter;
newscript->RegisterSelf();
}
File diff suppressed because it is too large Load Diff
@@ -1,27 +1,617 @@
/* Copyright (C) 2009 Trinity <http://www.trinitycore.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 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
*/
* 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
*/
/* ScriptData
SDName: Boss_Muru
SD%Complete: 0
SDComment: Placeholer
SDCategory: Sunwell_Plateau
EndScriptData */
SD%Complete: 80
SDComment: all sounds, black hole effect triggers to often (46228)
*/
#include "precompiled.h"
#include "def_sunwell_plateau.h"
// Muru & Entropius's spells
enum Spells
{
SPELL_ENRAGE = 26662,
// Muru's spells
SPELL_NEGATIVE_ENERGY = 46009, //(this trigger 46008)
SPELL_DARKNESS = 45999,
SPELL_OPEN_ALL_PORTALS = 46177,
SPELL_OPEN_PORTAL = 45977,
SPELL_OPEN_PORTAL_2 = 45976,
SPELL_SUMMON_BERSERKER = 46037,
SPELL_SUMNON_FURY_MAGE = 46038,
SPELL_SUMMON_VOID_SENTINEL = 45988,
SPELL_SUMMON_ENTROPIUS = 46217,
// Entropius's spells
SPELL_DARKNESS_E = 46269,
SPELL_BLACKHOLE = 46282,
SPELL_NEGATIVE_ENERGY_E = 46284,
SPELL_ENTROPIUS_SPAWN = 46223,
// Shadowsword Berserker's spells
SPELL_FLURRY = 46160,
SPELL_DUAL_WIELD = 29651,
// Shadowsword Fury Mage's spells
SPELL_FEL_FIREBALL = 46101,
SPELL_SPELL_FURY = 46102,
// Void Sentinel's spells
SPELL_SHADOW_PULSE = 46087,
SPELL_VOID_BLAST = 46161,
// Void Spawn's spells
SPELL_SHADOW_BOLT_VOLLEY = 46082,
//Dark Fiend Spells
SPELL_DARKFIEND_AOE = 45944,
SPELL_DARKFIEND_VISUAL = 45936,
SPELL_DARKFIEND_SKIN = 45934,
//Black Hole Spells
SPELL_BLACKHOLE_SPAWN = 46242,
SPELL_BLACKHOLE_GROW = 46228
};
enum Creatures
{
CREATURE_DARKNESS = 25879,
CREATURE_DARK_FIENDS = 25744,
CREATURE_BERSERKER = 25798,
CREATURE_FURY_MAGE = 25799,
CREATURE_VOID_SENTINEL = 25772,
CREATURE_VOID_SPAWN = 25824,
CREATURE_BLACK_HOLE = 25855,
BOSS_MURU = 25741,
BOSS_ENTROPIUS = 25840
};
enum BossTimers{
TIMER_DARKNESS = 0,
TIMER_HUMANOIDES = 1,
TIMER_PHASE = 2,
TIMER_SENTINEL = 3
};
float DarkFiends[8][4] =
{
{1819.9, 609.80, 69.74, 1.94},
{1829.39, 617.89, 69.73, 2.61},
{1801.98, 633.62, 69.74, 5.71},
{1830.88, 629.99, 69.73, 3.52},
{1800.38, 621.41, 69.74, 0.22},
{1808.3 , 612.45, 69.73, 1.02},
{1823.9 , 639.69, 69.74, 4.12},
{1811.85, 640.46, 69.73, 4.97}
};
float Humanoides[6][5] =
{
{CREATURE_FURY_MAGE, 1780.16, 666.83, 71.19, 5.21},
{CREATURE_FURY_MAGE, 1847.93, 600.30, 71.30, 2.57},
{CREATURE_BERSERKER, 1779.97, 660.64, 71.19, 5.28},
{CREATURE_BERSERKER, 1786.2 , 661.01, 71.19, 4.51},
{CREATURE_BERSERKER, 1845.17, 602.63, 71.28, 2.43},
{CREATURE_BERSERKER, 1842.91, 599.93, 71.23, 2.44}
};
uint32 EnrageTimer = 600000;
struct TRINITY_DLL_DECL boss_entropiusAI : public ScriptedAI
{
boss_entropiusAI(Creature *c) : ScriptedAI(c), Summons(m_creature){
pInstance = ((ScriptedInstance*)c->GetInstanceData());
Combat = false;
}
ScriptedInstance* pInstance;
SummonList Summons;
bool Combat;
uint32 BlackHoleSummonTimer;
void Reset() {
if (!Combat){
BlackHoleSummonTimer = 15000;
DoCastAOE(SPELL_NEGATIVE_ENERGY_E, false);
}else{
if(pInstance)
pInstance->SetData(DATA_MURU_EVENT, NOT_STARTED);
Summons.DespawnAll();
}
}
void Aggro(Unit *who) {
DoCastAOE(SPELL_NEGATIVE_ENERGY_E, true);
DoCast(m_creature, SPELL_ENTROPIUS_SPAWN, false);
}
void JustSummoned(Creature* summoned)
{
switch(summoned->GetEntry()){
case CREATURE_DARK_FIENDS:
summoned->CastSpell(summoned,SPELL_DARKFIEND_VISUAL,false);
break;
case CREATURE_DARKNESS:
summoned->addUnitState(UNIT_STAT_STUNNED);
float x,y,z,o;
summoned->GetHomePosition(x,y,z,o);
m_creature->SummonCreature(CREATURE_DARK_FIENDS, x,y,z,o, TEMPSUMMON_CORPSE_DESPAWN, 0);
break;
}
summoned->AI()->AttackStart(SelectUnit(SELECT_TARGET_RANDOM,0, 50, true));
Summons.Summon(summoned);
}
void KilledUnit(Unit* victim){
}
void JustDied(Unit* killer){
if(pInstance)pInstance->SetData(DATA_MURU_EVENT, DONE);
Summons.DespawnAll();
}
void UpdateAI(const uint32 diff)
{
if(!UpdateVictim())
return;
if(!Combat)Combat = true;
if(EnrageTimer < diff && !m_creature->HasAura(SPELL_ENRAGE, 0)){
DoCast(m_creature,SPELL_ENRAGE, false);
}else EnrageTimer -= diff;
if(BlackHoleSummonTimer < diff){
Unit* random = SelectUnit(SELECT_TARGET_RANDOM, 0, 100, true);
if(!random)return;
DoCast(random, SPELL_DARKNESS_E, false);
random = SelectUnit(SELECT_TARGET_RANDOM, 0, 100, true);
if(!random)return;
random->CastSpell(random, SPELL_BLACKHOLE, false);
BlackHoleSummonTimer = 15000;
}else BlackHoleSummonTimer -= diff;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_boss_entropius(Creature *_Creature)
{
return new boss_entropiusAI (_Creature);
}
struct TRINITY_DLL_DECL boss_muruAI : public Scripted_NoMovementAI
{
boss_muruAI(Creature *c) : Scripted_NoMovementAI(c), Summons(m_creature){
pInstance = ((ScriptedInstance*)c->GetInstanceData());
}
ScriptedInstance* pInstance;
SummonList Summons;
uint8 Phase;
uint32 Timer[4];
bool DarkFiend;
void Reset()
{
DarkFiend = false;
Phase = 1;
EnrageTimer = 600000;
Timer[TIMER_DARKNESS] = 45000;
Timer[TIMER_HUMANOIDES] = 10000;
Timer[TIMER_PHASE] = 2000;
Timer[TIMER_SENTINEL] = 31500;
Summons.DespawnAll();
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
m_creature->SetVisibility(VISIBILITY_ON);
if(pInstance)
pInstance->SetData(DATA_MURU_EVENT, NOT_STARTED);
}
void Aggro(Unit *who)
{
if(pInstance)
pInstance->SetData(DATA_MURU_EVENT, IN_PROGRESS);
DoCastAOE(SPELL_NEGATIVE_ENERGY,false);
}
void KilledUnit(Unit* victim){}
void DamageTaken(Unit *done_by, uint32 &damage) {
if(damage > m_creature->GetHealth() && Phase == 1){
damage = 0;
Phase = 2;
m_creature->RemoveAllAuras();
DoCast(m_creature, SPELL_OPEN_ALL_PORTALS, false);
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
}
if(Phase > 1 && Phase < 4)damage = 0;
}
void JustSummoned(Creature* summoned)
{
switch(summoned->GetEntry()){
case BOSS_ENTROPIUS:
m_creature->SetVisibility(VISIBILITY_OFF);
break;
case CREATURE_DARK_FIENDS:
summoned->CastSpell(summoned,SPELL_DARKFIEND_VISUAL,false);
break;
}
summoned->AI()->AttackStart(SelectUnit(SELECT_TARGET_RANDOM,0, 50, true));
Summons.Summon(summoned);
}
void UpdateAI(const uint32 diff)
{
if(!UpdateVictim())
return;
if(Phase == 3){
if(Timer[TIMER_PHASE] <diff){
switch(pInstance->GetData(DATA_MURU_EVENT)){
case NOT_STARTED:
Reset();
break;
case DONE:
Phase = 4;
m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
m_creature->RemoveCorpse();
break;
}
Timer[TIMER_PHASE] = 3000;
}else Timer[TIMER_PHASE] -= diff;
return;
}
if (EnrageTimer < diff && !m_creature->HasAura(SPELL_ENRAGE, 0))
DoCast(m_creature, SPELL_ENRAGE, false);
else EnrageTimer -= diff;
for (uint8 i = 0; i < 4; ++i){
if(Timer[i] < diff){
switch(i){
case TIMER_DARKNESS:
if(!DarkFiend){
DoCastAOE(SPELL_DARKNESS, false);
Timer[TIMER_DARKNESS] = 3000;
DarkFiend = true;
}else{
DarkFiend = false;
for(uint8 i = 0; i < 8; ++i)
m_creature->SummonCreature(CREATURE_DARK_FIENDS,DarkFiends[i][0],DarkFiends[i][1],DarkFiends[i][2], DarkFiends[i][3], TEMPSUMMON_CORPSE_DESPAWN, 0);
Timer[TIMER_DARKNESS] = 42000;
}
break;
case TIMER_HUMANOIDES:
for(uint8 i = 0; i < 6; ++i)
m_creature->SummonCreature(Humanoides[i][0],Humanoides[i][1],Humanoides[i][2],Humanoides[i][3], Humanoides[i][4], TEMPSUMMON_CORPSE_DESPAWN, 0);
Timer[TIMER_HUMANOIDES] = 60000;
break;
case TIMER_PHASE:
m_creature->RemoveAllAuras();
DoCast(m_creature, SPELL_SUMMON_ENTROPIUS, false);
Timer[TIMER_PHASE] = 3000;
Phase = 3;
return;
case TIMER_SENTINEL:
DoCastAOE(SPELL_OPEN_PORTAL_2, false);
Timer[TIMER_SENTINEL] = 30000;
break;
}break;}
}
//Timer
for(uint8 i = 0; i < 4; ++i){
if(i != TIMER_PHASE)Timer[i] -= diff;
else if(Phase == 2) Timer[i] -= diff;
}
}
};
CreatureAI* GetAI_boss_muru(Creature *_Creature)
{
return new boss_muruAI (_Creature);
}
struct TRINITY_DLL_DECL npc_muru_portalAI : public Scripted_NoMovementAI
{
npc_muru_portalAI(Creature *c) : Scripted_NoMovementAI(c), Summons(m_creature){
pInstance = ((ScriptedInstance*)c->GetInstanceData());
}
ScriptedInstance* pInstance;
SummonList Summons;
Creature* Muru;
bool SummonSentinel;
bool InAction;
uint32 SummonTimer;
void Reset(){
m_creature->addUnitState(UNIT_STAT_STUNNED);
SummonTimer = 5000;
InAction = false;
SummonSentinel = false;
Summons.DespawnAll();
}
void Aggro(Unit *who) {}
void JustSummoned(Creature* summoned){
Player* Target;
Target = (Player*)(Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_PLAYER_GUID)));
if(Target)summoned->AI()->AttackStart(Target);
Summons.Summon(summoned);
}
void SpellHit(Unit* caster, const SpellEntry* Spell){
float x,y,z,o;
m_creature->GetHomePosition(x,y,z,o);
DoTeleportTo(x,y,z);
InAction = true;
switch(Spell->Id){
case SPELL_OPEN_ALL_PORTALS:
DoCastAOE(SPELL_OPEN_PORTAL, false);
break;
case SPELL_OPEN_PORTAL_2:
DoCastAOE(SPELL_OPEN_PORTAL, false);
SummonSentinel = true;
break;
}
}
void UpdateAI(const uint32 diff){
if(!SummonSentinel){
if(InAction && pInstance->GetData(DATA_MURU_EVENT) == NOT_STARTED)Reset();
return;
}
if(SummonTimer < diff){
DoCastAOE(SPELL_SUMMON_VOID_SENTINEL, false);
SummonTimer = 5000;
SummonSentinel = false;
}else SummonTimer -= diff;
}
};
CreatureAI* GetAI_npc_muru_portal(Creature *_Creature)
{
return new npc_muru_portalAI (_Creature);
}
struct TRINITY_DLL_DECL npc_dark_fiendAI : public ScriptedAI
{
npc_dark_fiendAI(Creature *c) : ScriptedAI(c){
pInstance = ((ScriptedInstance*)c->GetInstanceData());
}
ScriptedInstance* pInstance;
bool InAction;
uint32 WaitTimer;
void Reset() {
WaitTimer = 2000;
InAction = false;
m_creature->addUnitState(UNIT_STAT_STUNNED);
};
void Aggro(Unit *who) {}
void SpellHit(Unit* caster, const SpellEntry* Spell){
for(uint8 i = 0; i < 3; ++i)
if(Spell->Effect[i] == 38){
m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
m_creature->RemoveCorpse();
}
}
void UpdateAI(const uint32 diff)
{
if(!UpdateVictim())
return;
if (WaitTimer < diff)
if(!InAction){
m_creature->clearUnitState(UNIT_STAT_STUNNED);
DoCastAOE(SPELL_DARKFIEND_SKIN, false);
AttackStart(SelectUnit(SELECT_TARGET_RANDOM, 0, 100, true));
InAction = true;
WaitTimer = 500;
}else{
if(m_creature->GetDistance(m_creature->getVictim()) < 5){
DoCastAOE(SPELL_DARKFIEND_AOE, false);
m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
m_creature->RemoveCorpse();
}
WaitTimer = 500;
}
else WaitTimer -= diff;
}
};
CreatureAI* GetAI_npc_dark_fiend(Creature *_Creature)
{
return new npc_dark_fiendAI (_Creature);
}
struct TRINITY_DLL_DECL npc_void_sentinelAI : public ScriptedAI
{
npc_void_sentinelAI(Creature *c) : ScriptedAI(c){
pInstance = ((ScriptedInstance*)c->GetInstanceData());
}
ScriptedInstance* pInstance;
uint32 PulseTimer;
uint32 VoidBlastTimer;
void Reset() {
PulseTimer = 3000;
VoidBlastTimer = 45000; //is this a correct timer?
float x,y,z,o;
m_creature->GetHomePosition(x,y,z,o);
DoTeleportTo(x,y,71);
};
void Aggro(Unit *who) {}
void JustDied(Unit* killer){
for (uint8 i = 0; i < 8; ++i){
m_creature->SummonCreature(CREATURE_VOID_SPAWN, m_creature->GetPositionX(),m_creature->GetPositionY(),m_creature->GetPositionZ(), rand()%6, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 180000);
}
}
void UpdateAI(const uint32 diff)
{
if(!UpdateVictim())
return;
if(PulseTimer < diff){
DoCastAOE(SPELL_SHADOW_PULSE, true);
PulseTimer = 3000;
}else PulseTimer -= diff;
if(VoidBlastTimer < diff){
DoCast(m_creature->getVictim(), SPELL_VOID_BLAST, false);
VoidBlastTimer = 45000;
}else VoidBlastTimer -= diff;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_npc_void_sentinel(Creature *_Creature)
{
return new npc_void_sentinelAI (_Creature);
}
struct TRINITY_DLL_DECL npc_blackholeAI : public ScriptedAI
{
npc_blackholeAI(Creature *c) : ScriptedAI(c){
pInstance = ((ScriptedInstance*)c->GetInstanceData());
}
ScriptedInstance* pInstance;
uint32 DespawnTimer;
uint32 SpellTimer;
uint8 Phase;
uint8 NeedForAHack;
void Reset(){
DespawnTimer = 15000;
SpellTimer = 5000;
Phase = 0;
m_creature->addUnitState(UNIT_STAT_STUNNED);
DoCastAOE(SPELL_BLACKHOLE_SPAWN, true);
}
void Aggro(Unit *who) {}
void UpdateAI(const uint32 diff)
{
if(SpellTimer < diff){
Unit* Victim = Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_PLAYER_GUID));
switch(NeedForAHack){
case 0:
m_creature->clearUnitState(UNIT_STAT_STUNNED);
DoCastAOE(SPELL_BLACKHOLE_GROW, false);
if(Victim)AttackStart(Victim);
SpellTimer = 700;
NeedForAHack = 2;
break;
case 1:
m_creature->AddAura(SPELL_BLACKHOLE_GROW, m_creature);
NeedForAHack = 2;
SpellTimer = 600;
break;
case 2:
SpellTimer = 400;
NeedForAHack = 3;
m_creature->RemoveAura(SPELL_BLACKHOLE_GROW, 1);
break;
case 3:
SpellTimer = 400+rand()%500;
NeedForAHack = 1;
Unit* Temp = m_creature->getVictim();
if(!Temp) return;
if(Temp->GetPositionZ() > 73 && Victim)
AttackStart(Victim);
}
}else SpellTimer -= diff;
if (DespawnTimer < diff){
m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
m_creature->RemoveCorpse();
}else DespawnTimer -= diff;
}
};
CreatureAI* GetAI_npc_blackhole(Creature *_Creature)
{
return new npc_blackholeAI (_Creature);
}
void AddSC_boss_muru()
{};
{
Script *newscript;
newscript = new Script;
newscript->Name="boss_muru";
newscript->GetAI = &GetAI_boss_muru;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="boss_entropius";
newscript->GetAI = &GetAI_boss_entropius;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="npc_muru_portal";
newscript->GetAI = &GetAI_npc_muru_portal;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="npc_dark_fiend";
newscript->GetAI = &GetAI_npc_dark_fiend;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="npc_void_sentinel";
newscript->GetAI = &GetAI_npc_void_sentinel;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="npc_blackhole";
newscript->GetAI = &GetAI_npc_blackhole;
newscript->RegisterSelf();
}
@@ -6,36 +6,38 @@
#define DEF_SUNWELLPLATEAU_H
/*** Encounters ***/
#define DATA_KALECGOS_EVENT 0
#define DATA_BRUTALLUS_EVENT 1
#define DATA_FELMYST_EVENT 2
#define DATA_EREDAR_TWINS_EVENT 3
#define DATA_MURU_EVENT 4
#define DATA_KILJAEDEN_EVENT 5
#define DATA_KALECGOS_EVENT 1
#define DATA_BRUTALLUS_EVENT 2
#define DATA_FELMYST_EVENT 3
#define DATA_EREDAR_TWINS_EVENT 4
#define DATA_MURU_EVENT 5
#define DATA_KILJAEDEN_EVENT 6
/*** Creatures ***/
#define DATA_KALECGOS_DRAGON 6
#define DATA_KALECGOS_HUMAN 7
#define DATA_SATHROVARR 8
#define DATA_BRUTALLUS 9
#define DATA_MADRIGOSA 24
#define DATA_FELMYST 10
#define DATA_ALYTHESS 11
#define DATA_SACROLASH 12
#define DATA_MURU 13
#define DATA_KILJAEDEN 14
#define DATA_KILJAEDEN_CONTROLLER 15
#define DATA_ANVEENA 16
#define DATA_KALECGOS_DRAGON 7
#define DATA_KALECGOS_HUMAN 8
#define DATA_SATHROVARR 9
#define DATA_BRUTALLUS 10
#define DATA_MADRIGOSA 11
#define DATA_FELMYST 12
#define DATA_ALYTHESS 13
#define DATA_SACROLASH 14
#define DATA_MURU 15
#define DATA_KILJAEDEN 16
#define DATA_KILJAEDEN_CONTROLLER 17
#define DATA_ANVEENA 18
#define DATA_KALECGOS_KJ 19
/*** GameObjects ***/
#define DATA_GO_FORCEFIELD 17
#define DATA_GO_FIRE_BARRIER 18
#define DATA_GATE_1 19
#define DATA_GATE_2 20
#define DATA_GATE_3 21
#define DATA_GATE_4 22
#define DATA_GATE_5 23
#define DATA_GO_FORCEFIELD 20
#define DATA_GO_FIRE_BARRIER 21
#define DATA_GATE_1 22
#define DATA_GATE_2 23
#define DATA_GATE_3 24
#define DATA_GATE_4 25
#define DATA_GATE_5 26
/*** Misc ***/
#define DATA_PLAYER_GUID 27
#endif
@@ -4,8 +4,8 @@
/* ScriptData
SDName: Instance_Sunwell_Plateau
SD%Complete: 0
SDComment: VERIFY SCRIPT
SD%Complete: 20
SDComment: VERIFY SCRIPT, rename Gates
SDCategory: Sunwell_Plateau
EndScriptData */
@@ -14,6 +14,11 @@ EndScriptData */
#define ENCOUNTERS 6
enum GoState{
CLOSE = 1,
OPEN = 0
};
/* Sunwell Plateau:
0 - Kalecgos and Sathrovarr
1 - Brutallus
@@ -42,6 +47,7 @@ struct TRINITY_DLL_DECL instance_sunwell_plateau : public ScriptedInstance
uint64 KilJaeden;
uint64 KilJaedenController;
uint64 Anveena;
uint64 KalecgosKJ;
/** GameObjects **/
uint64 ForceField; // Kalecgos Encounter
@@ -67,6 +73,7 @@ struct TRINITY_DLL_DECL instance_sunwell_plateau : public ScriptedInstance
KilJaeden = 0;
KilJaedenController = 0;
Anveena = 0;
KalecgosKJ = 0;
/*** GameObjects ***/
ForceField = 0;
@@ -94,6 +101,38 @@ struct TRINITY_DLL_DECL instance_sunwell_plateau : public ScriptedInstance
return false;
}
Player* GetPlayerInMap()
{
Map::PlayerList const& players = instance->GetPlayers();
if (!players.isEmpty())
{
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
{
Player* plr = itr->getSource();
if (plr && !plr->HasAura(45839,0))
return plr;
}
}
debug_log("TSCR: Instance Sunwell Plateau: GetPlayerInMap, but PlayerList is empty!");
return NULL;
}
void HandleGameObject(uint64 guid, uint32 state)
{
Player *player = GetPlayerInMap();
if (!player || !guid)
{
debug_log("TSCR: Sunwell Plateau: HandleGameObject fail");
return;
}
if (GameObject *go = GameObject::GetGameObject(*player,guid))
go->SetGoState(state);
}
void OnCreatureCreate(Creature* creature, uint32 entry)
{
switch(entry)
@@ -110,6 +149,7 @@ struct TRINITY_DLL_DECL instance_sunwell_plateau : public ScriptedInstance
case 25315: KilJaeden = creature->GetGUID(); break;
case 25608: KilJaedenController = creature->GetGUID(); break;
case 26046: Anveena = creature->GetGUID(); break;
case 25319: KalecgosKJ = creature->GetGUID(); break;
}
}
@@ -158,6 +198,11 @@ struct TRINITY_DLL_DECL instance_sunwell_plateau : public ScriptedInstance
case DATA_KILJAEDEN: return KilJaeden; break;
case DATA_KILJAEDEN_CONTROLLER: return KilJaedenController; break;
case DATA_ANVEENA: return Anveena; break;
case DATA_KALECGOS_KJ: return KalecgosKJ; break;
case DATA_PLAYER_GUID:
Player* Target = GetPlayerInMap();
return Target->GetGUID();
break;
}
return 0;
@@ -169,11 +214,32 @@ struct TRINITY_DLL_DECL instance_sunwell_plateau : public ScriptedInstance
{
case DATA_KALECGOS_EVENT: Encounters[0] = data; break;
case DATA_BRUTALLUS_EVENT: Encounters[1] = data; break;
case DATA_FELMYST_EVENT: Encounters[2] = data; break;
case DATA_FELMYST_EVENT:
if(data == DONE)
HandleGameObject(FireBarrier, 1);
Encounters[2] = data; break;
case DATA_EREDAR_TWINS_EVENT: Encounters[3] = data; break;
case DATA_MURU_EVENT: Encounters[4] = data; break;
case DATA_MURU_EVENT:
switch(data){
case DONE:
HandleGameObject(Gate[4], OPEN);
HandleGameObject(Gate[3], OPEN);
break;
case IN_PROGRESS:
HandleGameObject(Gate[4], CLOSE);
HandleGameObject(Gate[3], CLOSE);
break;
case NOT_STARTED:
HandleGameObject(Gate[4], CLOSE);
HandleGameObject(Gate[3], OPEN);
break;
}
Encounters[4] = data; break;
case DATA_KILJAEDEN_EVENT: Encounters[5] = data; break;
}
if(data == DONE)
SaveToDB();
}
void SetData64(uint32 id, uint64 guid)
@@ -183,6 +249,41 @@ struct TRINITY_DLL_DECL instance_sunwell_plateau : public ScriptedInstance
void Update(uint32 diff)
{
}
const char* Save()
{
OUT_SAVE_INST_DATA;
std::ostringstream stream;
stream << Encounters[0] << " " << Encounters[1] << " " << Encounters[2] << " " << Encounters[3] << " "
<< Encounters[4] << " " << Encounters[5];
char* out = new char[stream.str().length() + 1];
strcpy(out, stream.str().c_str());
if(out)
{
OUT_SAVE_INST_DATA_COMPLETE;
return out;
}
return NULL;
}
void Load(const char* in)
{
if(!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
std::istringstream stream(in);
stream >> Encounters[0] >> Encounters[1] >> Encounters[2] >> Encounters[3]
>> Encounters[4] >> Encounters[5];
for(uint8 i = 0; i < ENCOUNTERS; ++i)
if(Encounters[i] == IN_PROGRESS) // Do not load an encounter as "In Progress" - reset it instead.
Encounters[i] = NOT_STARTED;
OUT_LOAD_INST_DATA_COMPLETE;
}
};
InstanceData* GetInstanceData_instance_sunwell_plateau(Map* map)
@@ -15,13 +15,52 @@
*/
/* ScriptData
SDName: sunwell_plateau
SDName: Sunwell_Plateau
SD%Complete: 0
SDComment: Placeholer
SDCategory: Sunwell_Plateau
SDComment: Placeholder, Epilogue after Kil'jaeden, Captain Selana Gossips
EndScriptData */
/* ContentData
npc_prophet_velen
npc_captain_selana
EndContentData */
#include "precompiled.h"
#include "def_sunwell_plateau.h"
/*######
## npc_prophet_velen
######*/
enum ProphetSpeeches
{
PROPHET_SAY1 = -1580099,
PROPHET_SAY2 = -1580100,
PROPHET_SAY3 = -1580101,
PROPHET_SAY4 = -1580102,
PROPHET_SAY5 = -1580103,
PROPHET_SAY6 = -1580104,
PROPHET_SAY7 = -1580105,
PROPHET_SAY8 = -1580106
};
enum LiadrinnSpeeches
{
LIADRIN_SAY1 = -1580107,
LIADRIN_SAY2 = -1580108,
LIADRIN_SAY3 = -1580109
};
/*######
## npc_captain_selana
######*/
#define CS_GOSSIP1 "Give me a situation report, Captain."
#define CS_GOSSIP2 "What went wrong?"
#define CS_GOSSIP3 "Why did they stop?"
#define CS_GOSSIP4 "Your insight is appreciated."
void AddSC_sunwell_plateau()
{};
{
}
+3
View File
@@ -17251,6 +17251,9 @@ void Player::ProhibitSpellScholl(SpellSchoolMask idSchoolMask, uint32 unTimeMs )
if (spellInfo->Attributes & SPELL_ATTR_DISABLED_WHILE_ACTIVE)
continue;
if(spellInfo->PreventionType != SPELL_PREVENTION_TYPE_SILENCE)
continue;
if((idSchoolMask & GetSpellSchoolMask(spellInfo)) && GetSpellCooldownDelay(unSpellId) < unTimeMs )
{
data << unSpellId;
+4 -3
View File
@@ -1410,9 +1410,10 @@ void Spell::SearchChainTarget(std::list<Unit*> &TagUnitMap, float max_range, uin
if(cur->GetDistance(*next) > CHAIN_SPELL_JUMP_RADIUS)
break;
while(!cur->IsWithinLOSInMap(*next)
|| m_spellInfo->DmgClass==SPELL_DAMAGE_CLASS_MELEE
&& !m_caster->isInFront(*next, max_range))
while(m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MELEE
&& !m_caster->isInFront(*next, max_range)
|| !m_caster->canSeeOrDetect(*next, false)
|| !cur->IsWithinLOSInMap(*next))
{
++next;
if(next == tempUnitMap.end() || cur->GetDistance(*next) > CHAIN_SPELL_JUMP_RADIUS)
+12 -1
View File
@@ -4788,7 +4788,18 @@ void Spell::EffectScriptEffect(uint32 effIndex)
unitTarget->CastSpell(unitTarget, 44870, true);
break;
}
}
// spell of Brutallus - Stomp
case 45185:
{
if(!unitTarget)
return;
if(unitTarget->HasAura(46394)) // spell of Brutallus - Burn
unitTarget->RemoveAurasDueToSpell(46394);
break;
}
// Negative Energy
case 46289:
{
+2 -4
View File
@@ -60,12 +60,10 @@ GM_Ticket* TicketMgr::GetGMTicketByName(const char* name)
if(!normalizePlayerName(pname))
return NULL;
Player *plr = objmgr.GetPlayer(pname.c_str());
if(!plr)
uint64 playerGuid = objmgr.GetPlayerGUIDByName(pname.c_str());
if(!playerGuid)
return NULL;
uint64 playerGuid = plr->GetGUID();
for(GmTicketList::iterator i = GM_TicketList.begin(); i != GM_TicketList.end();)
{
if((*i)->playerGuid == playerGuid && (*i)->closed == 0)