diff options
Diffstat (limited to 'src')
15 files changed, 2817 insertions, 898 deletions
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjalAI.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjalAI.cpp index 9ce2ac28d45..d40d060dd88 100644 --- a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjalAI.cpp +++ b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjalAI.cpp @@ -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()); } } } diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjal_trash.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjal_trash.cpp index 22626f48cf5..d46b9f7a77e 100644 --- a/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjal_trash.cpp +++ b/src/bindings/scripts/scripts/zone/caverns_of_time/hyjal/hyjal_trash.cpp @@ -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 - { - 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 + if((faction == 0 && LastOverronPos == 17) || (faction == 1 && LastOverronPos == 21)) { - 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) diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_brutallus.cpp b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_brutallus.cpp index 481f14f1a7d..6c5020e574c 100644 --- a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_brutallus.cpp +++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_brutallus.cpp @@ -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 - -#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 - -#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 - -#define SPELL_METEOR_SLASH 45150 -#define SPELL_BURN 45141 -#define SPELL_STOMP 45185 -#define SPELL_BERSERK 26662 -#define SPELL_DUAL_WIELD 42459 - -#define FREEZING 45203 -#define FROST_BOLT 44843 -#define ENCAPSULATE 45665 -#define ENCAPSULATE_CHANELLING 45661 +enum Quotes +{ + YELL_INTRO = -1580017, + YELL_INTRO_BREAK_ICE = -1580018, + YELL_INTRO_CHARGE = -1580019, + YELL_INTRO_KILL_MADRIGOSA = -1580020, + YELL_INTRO_TAUNT = -1580021, + + YELL_MADR_ICE_BARRIER = -1580031, + YELL_MADR_INTRO = -1580032, + YELL_MADR_ICE_BLOCK = -1580033, + YELL_MADR_TRAP = -1580034, + YELL_MADR_DEATH = -1580035, + + 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 +}; + +enum Spells +{ + SPELL_METEOR_SLASH = 45150, + SPELL_BURN = 46394, + SPELL_STOMP = 45185, + SPELL_BERSERK = 26662, + SPELL_DUAL_WIELD = 42459, + + 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(); } - diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_eredar_twins.cpp b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_eredar_twins.cpp index 95c0fe29502..044f29a11aa 100644 --- a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_eredar_twins.cpp +++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_eredar_twins.cpp @@ -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..." - -// Lady Sacrolash -#define LADY_SACROLASH 25165 - -#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 - -#define MOB_SHADOW_IMAGE 25214 -#define SPELL_SHADOW_FURY 45270 -#define SPELL_IMAGE_VISUAL 45263 - -#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!" - -//enrage 6 minutes -#define SPELL_ENRAGE 46587 -//empower after sister is death -#define SPELL_EMPOWER 45366 - -//debuff prevents touched spell for 3 secounds -#define 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 +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, + + //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, + + //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, + + //Emote + EMOTE_SHADOW_NOVA = -1580064, + EMOTE_CONFLAGRATION = -1580065 +}; +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 + + //Shadow Image spells + SPELL_SHADOW_FURY = 45270, + SPELL_IMAGE_VISUAL = 45263, + + //Misc spells + SPELL_ENRAGE = 46587, + SPELL_EMPOWER = 45366, + SPELL_DARK_FLAME = 45345, + + //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; - - uint32 shadowblades_timer; - uint32 shadownova_timer; - uint32 confoundingblow_timer; - uint32 shadowimage_timer; - - uint32 conflagration_timer; + bool InCombat; + bool SisterDeath; + bool Enraged; - 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; - uint32 IntroStepCounter; - uint32 IntroYell_Timer; - uint32 conflagration_timer; - uint32 blaze_timer; - uint32 pyrogenics_timer; + bool InCombat; + bool SisterDeath; + bool Enraged; - uint32 shadownova_timer; - uint32 flamesear_timer; + uint32 IntroStepCounter; + uint32 IntroYellTimer; - 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(); } - diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp index b9bda8fa422..468d6801414 100644 --- a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp +++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_felmyst.cpp @@ -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 - -#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 - -//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 - -//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 - -#define YELL_KALECGOS "Madrigosa deserved a far better fate. You did what had to be done, but this battle is far from over." + +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 +}; + +enum Spells +{ + //Aura + AURA_SUNWELL_RADIANCE = 45769, + AURA_NOXIOUS_FUMES = 47002, + + //Land phase + SPELL_CLEAVE = 19983, + SPELL_CORROSION = 45866, + SPELL_GAS_NOVA = 45855, + SPELL_ENCAPSULATE_CHANNEL = 45661, + SPELL_ENCAPSULATE_EFFECT = 45665, + SPELL_ENCAPSULATE_AOE = 45662, + + //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 + + 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(); } - diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_kalecgos.cpp b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_kalecgos.cpp index ef7cd79f9c0..aa818826d40 100644 --- a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_kalecgos.cpp +++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_kalecgos.cpp @@ -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 - -#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 - -#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 +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, + + //Kalecgos humanoid form + SAY_GOOD_AGGRO = -1580006, + SAY_GOOD_NEAR_DEATH = -1580007, + SAY_GOOD_NEAR_DEATH2 = -1580008, + SAY_GOOD_PLRWIN = -1580009, + + //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 SPELL_SPECTRAL_BLAST 44869 -#define SPELL_TELEPORT_SPECTRAL 46019 -#define SPELL_ARCANE_BUFFET 45018 -#define SPELL_FROST_BREATH 44799 -#define SPELL_TAIL_LASH 45122 +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 +}; -#define SPELL_BANISH 44836 -#define SPELL_TRANSFORM_KALEC 44670 -#define SPELL_ENRAGE 44807 +enum Creatures +{ + MOB_KALECGOS = 24850, + MOB_KALEC = 24891, + MOB_SATHROVARR = 24892 +}; -#define SPELL_CORRUPTION_STRIKE 45029 -#define SPELL_AGONY_CURSE 45032 -#define SPELL_SHADOW_BOLT 45031 +#define GO_FAILED "You are unable to use this currently." -#define SPELL_HEROIC_STRIKE 45026 -#define SPELL_REVITALIZE 45027 +#define FLY_X 1679 +#define FLY_Y 900 +#define FLY_Z 82 -#define MOB_KALECGOS 24850 -#define MOB_KALEC 24891 -#define MOB_SATHROVARR 24892 +#define CENTER_X 1705 +#define CENTER_Y 930 +#define RADIUS 30 #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(); } - diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_kiljaeden.cpp b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_kiljaeden.cpp index 12f7e7b46b7..2ac90b87c35 100644 --- a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_kiljaeden.cpp +++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_kiljaeden.cpp @@ -16,12 +16,1300 @@ /* ScriptData SDName: Boss_Kiljaeden -SD%Complete: 0 -SDComment: Placeholer +SD%Complete: 70 +SDComment: Phase4, Phase5, Shadow Spike, Armageddon SDCategory: Sunwell_Plateau EndScriptData */ +//TODO rewrite Amagedon +//TODO Remove blue visual from Orbs on reset and if it is used + #include "precompiled.h" +#include "def_sunwell_plateau.h" +#include <math.h> + +/*** Speech and sounds***/ +enum Speeches +{ + // These are used throughout Sunwell and Magisters(?). Players can hear this while running through the instances. + SAY_KJ_OFFCOMBAT1 = -1580066, + SAY_KJ_OFFCOMBAT2 = -1580067, + SAY_KJ_OFFCOMBAT3 = -1580068, + SAY_KJ_OFFCOMBAT4 = -1580069, + SAY_KJ_OFFCOMBAT5 = -1580070, + + // Encounter speech and sounds + SAY_KJ_EMERGE = -1580071, + SAY_KJ_SLAY1 = -1580072, + SAY_KJ_SLAY2 = -1580073, + SAY_KJ_REFLECTION1 = -1580074, + SAY_KJ_REFLECTION2 = -1580075, + SAY_KJ_DARKNESS1 = -1580076, + SAY_KJ_DARKNESS2 = -1580077, + SAY_KJ_DARKNESS3 = -1580078, + SAY_KJ_PHASE3 = -1580079, + SAY_KJ_PHASE4 = -1580080, + SAY_KJ_PHASE5 = -1580081, + SAY_KJ_DEATH = -1580093, + EMOTE_KJ_DARKNESS = -1580094, + + /*** Kalecgos - Anveena speech at the beginning of Phase 5; Anveena's sacrifice ***/ + SAY_KALECGOS_AWAKEN = -1580082, + SAY_ANVEENA_IMPRISONED = -1580083, + SAY_KALECGOS_LETGO = -1580084, + SAY_ANVEENA_LOST = -1580085, + SAY_KALECGOS_FOCUS = -1580086, + SAY_ANVEENA_KALEC = -1580087, + SAY_KALECGOS_FATE = -1580088, + SAY_ANVEENA_GOODBYE = -1580089, + SAY_KALECGOS_GOODBYE = -1580090, + SAY_KALECGOS_ENCOURAGE = -1580091, + + /*** Kalecgos says throughout the fight ***/ + SAY_KALECGOS_JOIN = -1580092, + SAY_KALEC_ORB_READY1 = -1580095, + SAY_KALEC_ORB_READY2 = -1580096, + SAY_KALEC_ORB_READY3 = -1580097, + SAY_KALEC_ORB_READY4 = -1580098 +}; + +/*** Spells used during the encounter ***/ +enum SpellIds +{ + /* Hand of the Deceiver's spells and cosmetics */ + SPELL_SHADOW_BOLT_VOLLEY = 45770, // ~30 yard range Shadow Bolt Volley for ~2k(?) damage + SPELL_SHADOW_INFUSION = 45772, // They gain this at 20% - Immunity to Stun/Silence and makes them look angry! + SPELL_FELFIRE_PORTAL = 46875, // Creates a portal that spawns Felfire Fiends (LIVE FOR THE SWARM!1 FOR THE OVERMIND!) + SPELL_SHADOW_CHANNELING = 46757, // Channeling animation out of combat + + /* Volatile Felfire Fiend's spells */ + SPELL_FELFIRE_FISSION = 45779, // Felfire Fiends explode when they die or get close to target. + + /* Kil'Jaeden's spells and cosmetics */ + SPELL_TRANS = 23188, // Surprisingly, this seems to be the right spell.. (Where is it used?) + SPELL_REBIRTH = 44200, // Emerge from the Sunwell + SPELL_SOUL_FLAY = 45442, // 9k Shadow damage over 3 seconds. Spammed throughout all the fight. + SPELL_SOUL_FLAY_SLOW = 47106, + SPELL_LEGION_LIGHTNING = 45664, // Chain Lightning, 4 targets, ~3k Shadow damage, 1.5k mana burn + SPELL_FIRE_BLOOM = 45641, // Places a debuff on 5 raid members, which causes them to deal 2k Fire damage to nearby allies and selves. MIGHT NOT WORK + + SPELL_SINISTER_REFLECTION = 45785, // Summon shadow copies of 5 raid members that fight against KJ's enemies + SPELL_COPY_WEAPON = 41055, // } + SPELL_COPY_WEAPON2 = 41054, // } + SPELL_COPY_OFFHAND = 45206, // }- Spells used in Sinister Reflection creation + SPELL_COPY_OFFHAND_WEAPON = 45205, // } + + SPELL_SHADOW_SPIKE = 46680, // Bombard random raid members with Shadow Spikes (Very similar to Void Reaver orbs) + SPELL_FLAME_DART = 45737, // Bombards the raid with flames every 3(?) seconds + SPELL_DARKNESS_OF_A_THOUSAND_SOULS = 46605, // Begins a 8-second channeling, after which he will deal 50'000 damage to the raid + SPELL_DARKNESS_OF_A_THOUSAND_SOULS_DAMAGE = 45657, + + /* Armageddon spells wrong visual */ + SPELL_ARMAGEDDON_TRIGGER = 45909, // Meteor spell trigger missile should cast creature on himself + SPELL_ARMAGEDDON_VISUAL = 45911, // Does the hellfire visual to indicate where the meteor missle lands + SPELL_ARMAGEDDON_VISUAL2 = 45914, // Does the light visual to indicate where the meteor missle lands + SPELL_ARMAGEDDON_VISUAL3 = 24207, // This shouldn't correct but same as seen on the movie + SPELL_ARMAGEDDON_SUMMON_TRIGGER = 45921, // Summons the triggers that cast the spells on himself need random target select + SPELL_ARMAGEDDON_DAMAGE = 45915, // This does the area damage + + /* Shield Orb Spells*/ + SPELL_SHADOW_BOLT = 45680, //45679 would be correct but triggers to often //TODO fix console error + + + /* Anveena's spells and cosmetics (Or, generally, everything that has "Anveena" in name) */ + SPELL_ANVEENA_PRISON = 46367, // She hovers locked within a bubble + SPELL_ANVEENA_ENERGY_DRAIN = 46410, // Sunwell energy glow animation (Control mob uses this) + SPELL_SACRIFICE_OF_ANVEENA = 46474, // This is cast on Kil'Jaeden when Anveena sacrifices herself into the Sunwell + + /* Sinister Reflection Spells */ + SPELL_SR_CURSE_OF_AGONY = 46190, + SPELL_SR_SHADOW_BOLT = 47076, + + SPELL_SR_EARTH_SHOCK = 47071, + + SPELL_SR_FIREBALL = 47074, + + SPELL_SR_HEMORRHAGE = 45897, + + SPELL_SR_HOLY_SHOCK = 38921, + SPELL_SR_HAMMER_OF_JUSTICE = 37369, + + SPELL_SR_HOLY_SMITE = 47077, + SPELL_SR_RENEW = 47079, + + SPELL_SR_SHOOT = 16496, + SPELL_SR_MULTI_SHOT = 48098, + SPELL_SR_WING_CLIP = 40652, + + SPELL_SR_WHIRLWIND = 17207, + + SPELL_SR_MOONFIRE = 47072, + //SPELL_SR_PLAGU STRIKE = 58843, Dk Spell! + + /*** Other Spells (used by players, etc) ***/ + SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT = 45839, // Possess the blue dragon from the orb to help the raid. + SPELL_ENTROPIUS_BODY = 46819, // Visual for Entropius at the Epilogue + SPELL_RING_OF_BLUE_FLAMES = 45825 //Cast this spell when the go is activated +}; + +enum CreatureIds +{ + CREATURE_ANVEENA = 26046, // Embodiment of the Sunwell + CREATURE_KALECGOS = 25319, // Helps the raid throughout the fight + CREATURE_PROPHET = 26246, // Outro + CREATURE_KILJAEDEN = 25315, // Give it to 'em KJ! + CREATURE_HAND_OF_THE_DECEIVER = 25588, // Adds found before KJ emerges + CREATURE_FELFIRE_PORTAL = 25603, // Portal spawned be Hand of the Deceivers + CREATURE_VOLATILE_FELFIRE_FIEND = 25598, // Fiends spawned by the above portal + CREATURE_ARMAGEDDON_TARGET = 25735, // This mob casts meteor on itself.. I think + CREATURE_SHIELD_ORB = 25502, // Shield orbs circle the room raining shadow bolts on raid + CREATURE_THE_CORE_OF_ENTROPIUS = 26262, // Used in the ending cinematic? + CREATURE_POWER_OF_THE_BLUE_DRAGONFLIGHT = 25653, // NPC that players possess when using the Orb of the Blue Dragonflight + CREATURE_SPIKE_TARGET1 = 30598, //Should summon these under Shadow Spike Channel on targets place + CREATURE_SPIKE_TARGET2 = 30614, + CREATURE_SINISTER_REFLECTION = 25708 //Sinister Relection spawnd on Phase swichtes +}; + +/*** GameObjects ***/ +#define GAMEOBJECT_ORB_OF_THE_BLUE_DRAGONFLIGHT 188415 + +/*** Error messages ***/ +#define ERROR_KJ_NOT_SUMMONED "TSCR ERROR: Unable to summon Kil'Jaeden for some reason" + +/*** Others ***/ +#define FLOOR_Z 28.050388 +#define SHIELD_ORB_Z 45.000 + +enum Phase +{ + PHASE_DECEIVERS = 1, // Fight 3 adds + PHASE_NORMAL = 2, // Kil'Jaeden emerges from the sunwell + PHASE_DARKNESS = 3, // At 85%, he gains few abilities; Kalecgos joins the fight + PHASE_ARMAGEDDON = 4, // At 55%, he gains even more abilities + PHASE_SACRIFICE = 5, // At 25%, Anveena sacrifices herself into the Sunwell; at this point he becomes enraged and has *significally* shorter cooldowns. +}; + +//Timers +enum KilJaedenTimers { + TIMER_KALEC_JOIN = 0, + + //Phase 2 Timer + TIMER_SOUL_FLAY = 1, + TIMER_LEGION_LIGHTNING = 2, + TIMER_FIRE_BLOOM = 3, + TIMER_SUMMON_SHILEDORB = 4, + + //Phase 3 Timer + TIMER_SHADOW_SPIKE = 5, + TIMER_FLAME_DART = 6, + TIMER_DARKNESS = 7, + TIMER_ORBS_EMPOWER = 8, + + //Phase 4 Timer + TIMER_ARMAGEDDON = 9 +}; + +// Locations of the Hand of Deceiver adds +float DeceiverLocations[3][3]= +{ + {1682.045, 631.299, 5.936}, + {1684.099, 618.848, 0.589}, + {1694.170, 612.272, 1.416}, +}; + +// Locations, where Shield Orbs will spawn +float ShieldOrbLocations[4][2]= +{ + {1698.900, 627.870}, //middle pont of Sunwell + {12, 3.14}, // First one spawns northeast of KJ + {12, 3.14/0.7}, // Second one spawns southeast + {12, 3.14*3.8} // Third one spawns (?) +}; + +float OrbLocations[4][5] = { + (1694.48, 674.29, 28.0502, 4.86985), + (1745.68, 621.823, 28.0505, 2.93777), + (1704.14, 583.591, 28.1696, 1.59003), + (1653.12, 635.41, 28.0932, 0.0977725), +}; + +struct Speech +{ + int32 textid; + uint32 creature, timer; +}; +// TODO: Timers +static Speech Sacrifice[]= +{ + {SAY_KALECGOS_AWAKEN, CREATURE_KALECGOS, 5000}, + {SAY_ANVEENA_IMPRISONED, CREATURE_ANVEENA, 5000}, + {SAY_KALECGOS_LETGO, CREATURE_KALECGOS, 8000}, + {SAY_ANVEENA_LOST, CREATURE_ANVEENA, 5000}, + {SAY_KALECGOS_FOCUS, CREATURE_KALECGOS, 7000}, + {SAY_ANVEENA_KALEC, CREATURE_ANVEENA, 2000}, + {SAY_KALECGOS_FATE, CREATURE_KALECGOS, 3000}, + {SAY_ANVEENA_GOODBYE, CREATURE_ANVEENA, 6000}, + {SAY_KALECGOS_GOODBYE, CREATURE_KALECGOS, 12000}, + {SAY_KJ_PHASE5, CREATURE_KILJAEDEN, 8000}, + {SAY_KALECGOS_ENCOURAGE, CREATURE_KALECGOS, 5000} +}; + +class AllOrbsInGrid +{ +public: + AllOrbsInGrid() {} + bool operator() (GameObject* go) + { + if(go->GetEntry() == GAMEOBJECT_ORB_OF_THE_BLUE_DRAGONFLIGHT) + return true; + return false; + } +}; + +bool GOHello_go_orb_of_the_blue_flight(Player *plr, GameObject* go) +{ + if(go->GetUInt32Value(GAMEOBJECT_FACTION) == 35){ + ScriptedInstance* pInstance = ((ScriptedInstance*)go->GetInstanceData()); + float x,y,z, dx,dy,dz; + go->SummonCreature(CREATURE_POWER_OF_THE_BLUE_DRAGONFLIGHT, plr->GetPositionX(), plr->GetPositionY(), plr->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 121000); + plr->CastSpell(plr, SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT, true); + go->SetUInt32Value(GAMEOBJECT_FACTION, 0); + Unit* Kalec = ((Creature*)Unit::GetUnit(*plr, pInstance->GetData64(DATA_KALECGOS_KJ))); + //Kalec->RemoveDynObject(SPELL_RING_OF_BLUE_FLAMES); + go->GetPosition(x,y,z); + for(uint8 i = 0; i < 4; ++i){ + DynamicObject* Dyn = Kalec->GetDynObject(SPELL_RING_OF_BLUE_FLAMES); + if(Dyn){ + Dyn->GetPosition(dx,dy,dz); + if(x == dx && dy == y && dz == z){ + Dyn->RemoveFromWorld(); + break; + } + } + } + go->Refresh(); + } + return true; +} + +//AI for Kalecgos +struct TRINITY_DLL_DECL boss_kalecgosKJAI : public ScriptedAI +{ + boss_kalecgosKJAI(Creature* c) : ScriptedAI(c){ + pInstance = ((ScriptedInstance*)c->GetInstanceData()); + } + + GameObject* Orb[4]; + ScriptedInstance* pInstance; + uint8 OrbsEmpowered; + uint8 EmpowerCount; + + bool Searched; + + void InitializeAI(){ + for(uint8 i = 0; i < 4; ++i) + Orb[i] = NULL; + FindOrbs(); + OrbsEmpowered = 0; + EmpowerCount = 0; + m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT + MOVEMENTFLAG_LEVITATING); + m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + m_creature->setActive(true); + Searched = false; + FindOrbs(); + } + + void Reset(){} + + void Aggro(Unit* who) {} + + void FindOrbs() + { + CellPair pair(Trinity::ComputeCellPair(m_creature->GetPositionX(), m_creature->GetPositionY())); + Cell cell(pair); + cell.data.Part.reserved = ALL_DISTRICT; + cell.SetNoCreate(); + std::list<GameObject*> orbList; + AllOrbsInGrid check; + Trinity::GameObjectListSearcher<AllOrbsInGrid> searcher(orbList, check); + TypeContainerVisitor<Trinity::GameObjectListSearcher<AllOrbsInGrid>, GridTypeMapContainer> visitor(searcher); + CellLock<GridReadGuard> cell_lock(cell, pair); + cell_lock->Visit(cell_lock, visitor, *(m_creature->GetMap())); + if(orbList.empty()) + return; + uint8 i = 0; + for(std::list<GameObject*>::iterator itr = orbList.begin(); itr != orbList.end(); ++itr, ++i){ + Orb[i] = GameObject::GetGameObject(*m_creature, (*itr)->GetGUID()); + } + } + + void ResetOrbs(){ + m_creature->RemoveDynObject(SPELL_RING_OF_BLUE_FLAMES); + for(uint8 i = 0; i < 4; ++i) + if(Orb[i]) Orb[i]->SetUInt32Value(GAMEOBJECT_FACTION, 0); + } + + void EmpowerOrb(bool all) + { + if(!Orb[OrbsEmpowered]) + return; + uint8 random = rand()%3; + if(all){ + m_creature->RemoveDynObject(SPELL_RING_OF_BLUE_FLAMES); + for(uint8 i = 0; i < 4; ++i){ + if(!Orb[i]) return; + Orb[i]->CastSpell(m_creature, SPELL_RING_OF_BLUE_FLAMES); + Orb[i]->SetUInt32Value(GAMEOBJECT_FACTION, 35); + Orb[i]->setActive(true); + Orb[i]->Refresh(); + } + }else{ + float x,y,z, dx,dy,dz; + Orb[random]->GetPosition(x,y,z); + for(uint8 i = 0; i < 4; ++i){ + DynamicObject* Dyn = m_creature->GetDynObject(SPELL_RING_OF_BLUE_FLAMES); + if(Dyn){ + Dyn->GetPosition(dx,dy,dz); + if(x == dx && dy == y && dz == z){ + Dyn->RemoveFromWorld(); + break; + } + } + } + Orb[random]->CastSpell(m_creature, SPELL_RING_OF_BLUE_FLAMES); + Orb[random]->SetUInt32Value(GAMEOBJECT_FACTION, 35); + Orb[random]->setActive(true); + Orb[random]->Refresh(); + ++OrbsEmpowered; + } + ++EmpowerCount; + + switch(EmpowerCount){ + case 1: DoScriptText(SAY_KALEC_ORB_READY1, m_creature); break; + case 2: DoScriptText(SAY_KALEC_ORB_READY2, m_creature); break; + case 3: DoScriptText(SAY_KALEC_ORB_READY3, m_creature); break; + case 4: DoScriptText(SAY_KALEC_ORB_READY4, m_creature); break; + } + } + + void UpdateAI(const uint32 diff){ + if(!Searched){ + FindOrbs(); + Searched = true; + } + + if(OrbsEmpowered == 4) OrbsEmpowered = 0; + } +}; + +CreatureAI* GetAI_boss_kalecgosKJ(Creature *_Creature) +{ + return new boss_kalecgosKJAI (_Creature); +} + +//AI for Kil'jaeden +struct TRINITY_DLL_DECL boss_kiljaedenAI : public Scripted_NoMovementAI +{ + boss_kiljaedenAI(Creature* c) : Scripted_NoMovementAI(c), Summons(m_creature){ + pInstance = ((ScriptedInstance*)c->GetInstanceData()); + } + + ScriptedInstance* pInstance; + SummonList Summons; + Creature* Kalec; + Unit* randomPlayer; + + uint8 Phase; + uint8 ActiveTimers; + + uint32 Timer[10]; + uint32 WaitTimer; + + /* Boolean */ + bool IsKalecJoined; + bool IsInDarkness; + bool TimerIsDeactiveted[10]; + bool IsWaiting; + bool OrbActivated; + + void Reset() + { + // TODO: Fix timers + Timer[TIMER_KALEC_JOIN] = 26000; + + //Phase 2 Timer + Timer[TIMER_SOUL_FLAY] = 20000; + Timer[TIMER_LEGION_LIGHTNING] = 40000; + Timer[TIMER_FIRE_BLOOM] = 30000; + Timer[TIMER_SUMMON_SHILEDORB] = 45000; + + //Phase 3 Timer + Timer[TIMER_SHADOW_SPIKE] = 4000; + Timer[TIMER_FLAME_DART] = 3000; + Timer[TIMER_DARKNESS] = 45000; + Timer[TIMER_ORBS_EMPOWER] = 35000; + + //Phase 4 Timer + Timer[TIMER_ARMAGEDDON] = 2000; + + ActiveTimers = 5; + WaitTimer = 0; + + Phase = PHASE_DECEIVERS; + + IsKalecJoined = false; + IsInDarkness = false; + IsWaiting = false; + OrbActivated = false; + + Kalec = ((Creature*)Unit::GetUnit(*m_creature, pInstance->GetData64(DATA_KALECGOS_KJ))); + ChangeTimers(false, 0); + } + + void ChangeTimers(bool status, uint32 WTimer){ + for(uint8 i = 0; i < 10;++i) + TimerIsDeactiveted[i] = status; + TimerIsDeactiveted[TIMER_KALEC_JOIN] = IsKalecJoined; + + if(WTimer > 0){ + IsWaiting = true; + WaitTimer = WTimer; + } + + if(OrbActivated) TimerIsDeactiveted[TIMER_ORBS_EMPOWER] = true; + if(Timer[TIMER_SHADOW_SPIKE] == 0) TimerIsDeactiveted[TIMER_SHADOW_SPIKE] = true; + if(Phase == PHASE_SACRIFICE) TimerIsDeactiveted[TIMER_SUMMON_SHILEDORB] = true; + } + + void JustSummoned(Creature* summoned) + { + if(summoned->GetEntry() == CREATURE_ARMAGEDDON_TARGET) + { + summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + }else{ + summoned->SetLevel(m_creature->getLevel()); + } + summoned->setFaction(m_creature->getFaction()); + Summons.Summon(summoned); + } + + void JustDied(Unit* killer) + { + DoScriptText(SAY_KJ_DEATH, m_creature); + + if(pInstance) + pInstance->SetData(DATA_KILJAEDEN_EVENT, DONE); + } + + void KilledUnit(Unit* victim) + { + switch(rand()%2) + { + case 0: DoScriptText(SAY_KJ_SLAY1, m_creature); break; + case 1: DoScriptText(SAY_KJ_SLAY2, m_creature); break; + } + } + + void EnterEvadeMode() + { + Scripted_NoMovementAI::EnterEvadeMode(); + Summons.DespawnAll(); + + // Reset the controller + if(pInstance){ + Creature* Control = ((Creature*)Unit::GetUnit(*m_creature, pInstance->GetData64(DATA_KILJAEDEN_CONTROLLER))); + if(Control) + ((Scripted_NoMovementAI*)Control->AI())->Reset(); + } + } + + void Aggro(Unit* who){ + DoZoneInCombat(); + DoScriptText(SAY_KJ_EMERGE, m_creature); + } + + void CastSinisterReflection() + { + switch(rand()%2){ + case 0: DoScriptText(SAY_KJ_REFLECTION1, m_creature); break; + case 1: DoScriptText(SAY_KJ_REFLECTION2, m_creature); break; + } + DoCast(m_creature, SPELL_SINISTER_REFLECTION, true); + for(uint8 i = 0; i < 4; i++){ + float x,y,z; + Unit* target; + for(uint8 z = 0; z < 6; ++z){ + target = SelectUnit(SELECT_TARGET_RANDOM, 0, 100, true); + if (!target->HasAura(SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT,0)) break; + } + target->GetPosition(x,y,z); + Creature* SinisterReflection = m_creature->SummonCreature(CREATURE_SINISTER_REFLECTION, x,y,z,0, TEMPSUMMON_CORPSE_DESPAWN, 0); + SinisterReflection->AI()->AttackStart(target); + } + } + + void UpdateAI(const uint32 diff) + { + if(!UpdateVictim() || Phase < PHASE_NORMAL) + return; + + if(IsWaiting){ + if(WaitTimer < diff){ + IsWaiting = false; + ChangeTimers(false, 0); + } + else WaitTimer -= diff; + } + + for(uint8 t = 0; t < ActiveTimers; ++t){ + if(Timer[t] < diff && !TimerIsDeactiveted[t]){ + switch(t){ + case TIMER_KALEC_JOIN: + if(Kalec){ + DoScriptText(SAY_KALECGOS_JOIN, Kalec); + IsKalecJoined = true; + TimerIsDeactiveted[TIMER_KALEC_JOIN] = true; + } + break; + case TIMER_SOUL_FLAY: + if(!m_creature->IsNonMeleeSpellCasted(false)){ + m_creature->CastSpell(m_creature->getVictim(), SPELL_SOUL_FLAY, false); + m_creature->getVictim()->CastSpell(m_creature->getVictim(), SPELL_SOUL_FLAY_SLOW, true); + Timer[TIMER_SOUL_FLAY] = 3500; + } + break; + case TIMER_LEGION_LIGHTNING: + if(!m_creature->IsNonMeleeSpellCasted(false)){ + m_creature->RemoveAurasDueToSpell(SPELL_SOUL_FLAY); + for(uint8 z = 0; z < 6; ++z){ + randomPlayer = SelectUnit(SELECT_TARGET_RANDOM, 0, 100, true); + if (!randomPlayer->HasAura(SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT,0)) break; + } + if(randomPlayer)DoCast(randomPlayer, SPELL_LEGION_LIGHTNING, false); + else error_log("try to cast SPELL_LEGION_LIGHTNING on invalid target"); + Timer[TIMER_LEGION_LIGHTNING] = (Phase == PHASE_SACRIFICE) ? 18000 : 30000; // 18 seconds in PHASE_SACRIFICE + Timer[TIMER_SOUL_FLAY] = 2500; + } + break; + case TIMER_FIRE_BLOOM: + if(!m_creature->IsNonMeleeSpellCasted(false)){ + m_creature->RemoveAurasDueToSpell(SPELL_SOUL_FLAY); + DoCastAOE(SPELL_FIRE_BLOOM, false); + Timer[TIMER_FIRE_BLOOM] = (Phase == PHASE_SACRIFICE) ? 25000 : 40000; // 25 seconds in PHASE_SACRIFICE + Timer[TIMER_SOUL_FLAY] = 1000; + } + break; + case TIMER_SUMMON_SHILEDORB: + for(uint8 i = 1; i < Phase; ++i){ + float sx, sy; + sx = ShieldOrbLocations[0][0] + sin(ShieldOrbLocations[i][0]); + sy = ShieldOrbLocations[0][1] + sin(ShieldOrbLocations[i][1]); + m_creature->SummonCreature(CREATURE_SHIELD_ORB, sx, sy, SHIELD_ORB_Z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 45000); + } + Timer[TIMER_SUMMON_SHILEDORB] = 30000+rand()%30*1000; // 30-60seconds cooldown + Timer[TIMER_SOUL_FLAY] = 2000; + break; + case TIMER_SHADOW_SPIKE: //Phase 3 + if(!m_creature->IsNonMeleeSpellCasted(false)){ + DoCastAOE(SPELL_SHADOW_SPIKE, false); + Timer[TIMER_SHADOW_SPIKE] = 0; + TimerIsDeactiveted[TIMER_SHADOW_SPIKE] = true; + ChangeTimers(true, 30000); + } + break; + case TIMER_FLAME_DART: //Phase 3 + DoCastAOE(SPELL_FLAME_DART, false); + Timer[TIMER_FLAME_DART] = 3000; //TODO Timer + break; + case TIMER_DARKNESS: //Phase 3 + if(!m_creature->IsNonMeleeSpellCasted(false)){ + // Begins to channel for 8 seconds, then deals 50'000 damage to all raid members. + if(!IsInDarkness){ + DoScriptText(EMOTE_KJ_DARKNESS, m_creature); + DoCastAOE(SPELL_DARKNESS_OF_A_THOUSAND_SOULS, false); + ChangeTimers(true, 9000); + Timer[TIMER_DARKNESS] = 8750; + TimerIsDeactiveted[TIMER_DARKNESS] = false; + if(Phase == PHASE_SACRIFICE) TimerIsDeactiveted[TIMER_ARMAGEDDON] = false; + IsInDarkness = true; + }else{ + Timer[TIMER_DARKNESS] = (Phase == PHASE_SACRIFICE) ? 20000 + rand()%15000 : 40000 + rand()%30000; + IsInDarkness = false; + DoCastAOE(SPELL_DARKNESS_OF_A_THOUSAND_SOULS_DAMAGE); + switch(rand()%3){ + case 0: DoScriptText(SAY_KJ_DARKNESS1, m_creature); break; + case 1: DoScriptText(SAY_KJ_DARKNESS2, m_creature); break; + case 2: DoScriptText(SAY_KJ_DARKNESS3, m_creature); break; + } + } + Timer[TIMER_SOUL_FLAY] = 9000; + } + break; + case TIMER_ORBS_EMPOWER: //Phase 3 + if(Phase == PHASE_SACRIFICE){ + if(Kalec)((boss_kalecgosKJAI*)Kalec->AI())->EmpowerOrb(true); + }else if(Kalec)((boss_kalecgosKJAI*)Kalec->AI())->EmpowerOrb(false); + Timer[TIMER_ORBS_EMPOWER]= (Phase == PHASE_SACRIFICE) ? 45000 : 35000; + OrbActivated = true; + TimerIsDeactiveted[TIMER_ORBS_EMPOWER] = true; + break; + case TIMER_ARMAGEDDON: //Phase 4 + Unit* target; + for(uint8 z = 0; z < 6; ++z){ + target = SelectUnit(SELECT_TARGET_RANDOM, 0, 100, true); + if (!target->HasAura(SPELL_VENGEANCE_OF_THE_BLUE_FLIGHT,0)) break; + } + if(target){ + float x, y, z; + target->GetPosition(x, y, z); + m_creature->SummonCreature(CREATURE_ARMAGEDDON_TARGET, x,y,z,0, TEMPSUMMON_TIMED_DESPAWN,15000); + } + Timer[TIMER_ARMAGEDDON] = 2000; // No, I'm not kidding + break; + } + break; + } + } + //Time runs over! + for(uint8 i = 0; i < ActiveTimers; ++i) + if(!TimerIsDeactiveted[i]){ + Timer[i] -= diff; + if(((int32)Timer[i]) < 0) Timer[i] = 0; + } + + //Phase 3 + if(Phase <= PHASE_NORMAL){ + if(Phase == PHASE_NORMAL && ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 85)){ + CastSinisterReflection(); + DoScriptText(SAY_KJ_PHASE3, m_creature); + Phase = PHASE_DARKNESS; + OrbActivated = false; + ActiveTimers = 9; + } + else return; + } + + //Phase 4 + if(Phase <= PHASE_DARKNESS){ + if(Phase == PHASE_DARKNESS && ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 55)){ + DoScriptText(SAY_KJ_PHASE4, m_creature); + Phase = PHASE_ARMAGEDDON; + OrbActivated = false; + ActiveTimers = 10; + } + else return; + } + + //Phase 5 specific spells all we can + if(Phase <= PHASE_ARMAGEDDON){ + if(Phase == PHASE_ARMAGEDDON && ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 25)){ + Phase = PHASE_SACRIFICE; + Creature* Anveena = (Creature*)(Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_ANVEENA))); + if (Anveena)Anveena->CastSpell(m_creature, SPELL_SACRIFICE_OF_ANVEENA, false); + OrbActivated = false; + ChangeTimers(true, 10000);// He shouldn't cast spells for ~10 seconds after Anveena's sacrifice. This will be done within Anveena's script + } + else return; + } + +} +}; + +CreatureAI* GetAI_boss_kiljaeden(Creature *_Creature) +{ + return new boss_kiljaedenAI (_Creature); +} + +//AI for Kil'jaeden Event Controller +struct TRINITY_DLL_DECL mob_kiljaeden_controllerAI : public Scripted_NoMovementAI +{ + mob_kiljaeden_controllerAI(Creature* c) : Scripted_NoMovementAI(c), Summons(m_creature){ + pInstance = ((ScriptedInstance*)c->GetInstanceData()); + } + + ScriptedInstance* pInstance; + Creature* KalecKJ; + SummonList Summons; + + bool SummonedDeceivers; + bool KiljaedenDeath; + + uint32 RandomSayTimer; + uint32 Phase; + uint8 DeceiverDeathCount; + + void InitializeAI(){ + KalecKJ = Unit::GetCreature((*m_creature), pInstance->GetData64(DATA_KALECGOS_KJ)); + m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + m_creature->addUnitState(UNIT_STAT_STUNNED); + } + + void Reset(){ + Phase = PHASE_DECEIVERS; + if(KalecKJ)((boss_kalecgosKJAI*)KalecKJ->AI())->ResetOrbs(); + DeceiverDeathCount = 0; + SummonedDeceivers = false; + KiljaedenDeath = false; + RandomSayTimer = 30000; + Summons.DespawnAll(); + } + + void JustSummoned(Creature* summoned){ + switch(summoned->GetEntry()){ + case CREATURE_HAND_OF_THE_DECEIVER: + summoned->CastSpell(summoned, SPELL_SHADOW_CHANNELING, false); + break; + case CREATURE_ANVEENA: + summoned->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT + MOVEMENTFLAG_LEVITATING); + summoned->CastSpell(summoned, SPELL_ANVEENA_PRISON, true); + summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + break; + case CREATURE_KILJAEDEN: + summoned->CastSpell(summoned, SPELL_REBIRTH, false); + ((boss_kiljaedenAI*)summoned->AI())->Phase=PHASE_NORMAL; + summoned->AddThreat(m_creature->getVictim(), 1.0f); + break; + } + Summons.Summon(summoned); + } + + void Aggro(Unit* who) {} + + void UpdateAI(const uint32 diff) + { + if(RandomSayTimer < diff && pInstance->GetData(DATA_MURU_EVENT) != DONE && pInstance->GetData(DATA_KILJAEDEN_EVENT) == NOT_STARTED){ + switch(rand()%5){ + case 0: DoScriptText(SAY_KJ_OFFCOMBAT1, m_creature); break; + case 1: DoScriptText(SAY_KJ_OFFCOMBAT2, m_creature); break; + case 2: DoScriptText(SAY_KJ_OFFCOMBAT3, m_creature); break; + case 3: DoScriptText(SAY_KJ_OFFCOMBAT4, m_creature); break; + case 4: DoScriptText(SAY_KJ_OFFCOMBAT5, m_creature); break; + } + RandomSayTimer = 30000; + }else RandomSayTimer -= diff; + + if(!SummonedDeceivers){ + for(uint8 i = 0; i < 3; ++i) + m_creature->SummonCreature(CREATURE_HAND_OF_THE_DECEIVER, DeceiverLocations[i][0], DeceiverLocations[i][1], FLOOR_Z, DeceiverLocations[i][2], TEMPSUMMON_DEAD_DESPAWN, 0); + + DoSpawnCreature(CREATURE_ANVEENA, 0, 0, 40, 0, TEMPSUMMON_DEAD_DESPAWN, 0); + DoCast(m_creature, SPELL_ANVEENA_ENERGY_DRAIN); + SummonedDeceivers = true; + } + + if(DeceiverDeathCount > 2 && Phase == PHASE_DECEIVERS){ + m_creature->RemoveAurasDueToSpell(SPELL_ANVEENA_ENERGY_DRAIN) ; + Phase = PHASE_NORMAL; + DoSpawnCreature(CREATURE_KILJAEDEN, 0, 0,0, 0, TEMPSUMMON_MANUAL_DESPAWN, 0); + } + } +}; + +CreatureAI* GetAI_mob_kiljaeden_controller(Creature *_Creature) +{ + return new mob_kiljaeden_controllerAI (_Creature); +} + +//AI for Hand of the Deceiver +struct TRINITY_DLL_DECL mob_hand_of_the_deceiverAI : public ScriptedAI +{ + mob_hand_of_the_deceiverAI(Creature* c) : ScriptedAI(c){ + pInstance = ((ScriptedInstance*)c->GetInstanceData()); + } + ScriptedInstance* pInstance; + + uint32 ShadowBoltVolleyTimer; + uint32 FelfirePortalTimer; + + void Reset(){ + // TODO: Timers! + ShadowBoltVolleyTimer = 8000 + rand()%6000; // So they don't all cast it in the same moment. + FelfirePortalTimer = 20000; + if(pInstance)pInstance->SetData(DATA_KILJAEDEN_EVENT, NOT_STARTED); + } + + void JustSummoned(Creature* summoned){ + summoned->setFaction(m_creature->getFaction()); + summoned->SetLevel(m_creature->getLevel()); + } + + void Aggro(Unit* who){ + if(pInstance){ + pInstance->SetData(DATA_KILJAEDEN_EVENT, IN_PROGRESS); + Creature* Control = ((Creature*)Unit::GetUnit(*m_creature, pInstance->GetData64(DATA_KILJAEDEN_CONTROLLER))); + if(Control) + Control->AddThreat(who, 1.0f); + } + m_creature->InterruptNonMeleeSpells(true); + } + + void JustDied(Unit* killer){ + if(!pInstance) + return; + + Creature* Control = ((Creature*)Unit::GetUnit(*m_creature, pInstance->GetData64(DATA_KILJAEDEN_CONTROLLER))); + if(Control) + ((mob_kiljaeden_controllerAI*)Control->AI())->DeceiverDeathCount++; + } + + void UpdateAI(const uint32 diff){ + if(!InCombat) + DoCast(m_creature, SPELL_SHADOW_CHANNELING); + + if(!UpdateVictim()) + return; + + // Gain Shadow Infusion at 20% health + if(((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 20) && !m_creature->HasAura(SPELL_SHADOW_INFUSION, 0)) + DoCast(m_creature, SPELL_SHADOW_INFUSION, true); + + // Shadow Bolt Volley - Shoots Shadow Bolts at all enemies within 30 yards, for ~2k Shadow damage. + if(ShadowBoltVolleyTimer < diff){ + DoCast(m_creature->getVictim(), SPELL_SHADOW_BOLT_VOLLEY); + ShadowBoltVolleyTimer = 12000; + }else ShadowBoltVolleyTimer -= diff; + + // Felfire Portal - Creatres a portal, that spawns Volatile Felfire Fiends, which do suicide bombing. + if(FelfirePortalTimer < diff){ + Creature* Portal = DoSpawnCreature(CREATURE_FELFIRE_PORTAL, 0, 0,0, 0, TEMPSUMMON_TIMED_DESPAWN, 20000); + if(Portal) + { + std::list<HostilReference*>::iterator itr; + for(itr = m_creature->getThreatManager().getThreatList().begin(); itr != m_creature->getThreatManager().getThreatList().end(); ++itr) + { + Unit* pUnit = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid()); + if(pUnit) + Portal->AddThreat(pUnit, 1.0f); + } + } + FelfirePortalTimer = 20000; + }else FelfirePortalTimer -= diff; + + DoMeleeAttackIfReady(); + } +}; + +CreatureAI* GetAI_mob_hand_of_the_deceiver(Creature *_Creature) +{ + return new mob_hand_of_the_deceiverAI (_Creature); +} + +//AI for Felfire Portal +struct TRINITY_DLL_DECL mob_felfire_portalAI : public Scripted_NoMovementAI +{ + mob_felfire_portalAI(Creature* c) : Scripted_NoMovementAI(c) {} + + uint32 SpawnFiendTimer; + + void InitializeAI(){ + SpawnFiendTimer = 5000; + m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + } + + // TODO: Timers + void Reset() { + + } + + void Aggro(Unit* who) {} + + void JustSummoned(Creature* summoned) + { + summoned->setFaction(m_creature->getFaction()); + summoned->SetLevel(m_creature->getLevel()); + } + + void UpdateAI(const uint32 diff) + { + if(!UpdateVictim()) + return; + + if(SpawnFiendTimer < diff) + { + Creature* Fiend = DoSpawnCreature(CREATURE_VOLATILE_FELFIRE_FIEND, 0, 0, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 20000); + if(Fiend) + Fiend->AddThreat(SelectUnit(SELECT_TARGET_RANDOM,0), 100000.0f); + SpawnFiendTimer = 4000 + rand()%4000; + }else SpawnFiendTimer -= diff; + } +}; + +CreatureAI* GetAI_mob_felfire_portal(Creature *_Creature) +{ + return new mob_felfire_portalAI (_Creature); +} + +//AI for Felfire Fiend +struct TRINITY_DLL_DECL mob_volatile_felfire_fiendAI : public ScriptedAI +{ + mob_volatile_felfire_fiendAI(Creature* c) : ScriptedAI(c) {} + + uint32 ExplodeTimer; + + bool LockedTarget; + + void Reset() + { + ExplodeTimer = 2000; + LockedTarget = false; + } + + void Aggro(Unit* who) {} + + void DamageTaken(Unit *done_by, uint32 &damage) + { + if(damage > m_creature->GetHealth()) + DoCast(m_creature, SPELL_FELFIRE_FISSION, true); + } + + void UpdateAI(const uint32 diff) + { + if(!UpdateVictim()) + return; + + if(!LockedTarget){ + m_creature->AddThreat(m_creature->getVictim(), 10000000.0f); + LockedTarget = true; + } + + if(ExplodeTimer){ + if(ExplodeTimer < diff) + ExplodeTimer = 0; + else ExplodeTimer -= diff; + } + else if(m_creature->IsWithinDistInMap(m_creature->getVictim(), 3)) // Explode if it's close enough to it's target + { + DoCast(m_creature->getVictim(), SPELL_FELFIRE_FISSION); + m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + } + } +}; + +CreatureAI* GetAI_mob_volatile_felfire_fiend(Creature *_Creature) +{ + return new mob_volatile_felfire_fiendAI (_Creature); +} + +//AI for Armageddon target +struct TRINITY_DLL_DECL mob_armageddonAI : public Scripted_NoMovementAI +{ + mob_armageddonAI(Creature* c) : Scripted_NoMovementAI(c) {} + + uint8 Spell; + uint32 Timer; + + void Reset(){ + Spell = 0; + Timer = 0; + } + + void Aggro(Unit* who){} + + void UpdateAI(const uint32 diff) + { + if(Timer < diff){ + switch(Spell){ + case 0: + DoCast(m_creature, SPELL_ARMAGEDDON_VISUAL, true); + ++Spell; + break; + case 1: + DoCast(m_creature, SPELL_ARMAGEDDON_VISUAL2, true); + Timer = 9000; + ++Spell; + break; + case 2: + DoCast(m_creature, SPELL_ARMAGEDDON_TRIGGER, true); + ++Spell; + Timer = 5000; + break; + case 3: + m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + m_creature->RemoveCorpse(); + break; + } + }else Timer -=diff; + } +}; + +CreatureAI* GetAI_mob_armageddon(Creature *_Creature) +{ + return new mob_armageddonAI (_Creature); +} + +//AI for Shield Orbs +struct TRINITY_DLL_DECL mob_shield_orbAI : public ScriptedAI +{ + mob_shield_orbAI(Creature* c) : ScriptedAI(c) { + pInstance = ((ScriptedInstance*)c->GetInstanceData()); + } + + bool PointReached; + bool Clockwise; + uint32 Timer; + uint32 CheckTimer; + ScriptedInstance* pInstance; + float x, y, r, c, mx, my; + + void InitializeAI(){ + m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT + MOVEMENTFLAG_LEVITATING); + PointReached = true; + Timer = 500+ rand()%500; + CheckTimer = 1000; + r = 17; + c = 0; + mx = ShieldOrbLocations[0][0]; + my = ShieldOrbLocations[0][1]; + if(rand()%2 == 0)Clockwise = true; + else Clockwise = false; + } + + void Reset(){ + } + + void Aggro(Unit* who){} + + void UpdateAI(const uint32 diff){ + if(PointReached){ + if(Clockwise){ + y = my - r * sin(c); + x = mx - r * cos(c); + }else{ + y = my + r * sin(c); + x = mx + r * cos(c); + } + PointReached = false; + CheckTimer = 1000; + m_creature->GetMotionMaster()->MovePoint(1,x, y, SHIELD_ORB_Z); + c += 3.1415926535/32; + if(c > 2*3.1415926535) c = 0; + }else{ + if (CheckTimer < diff){ + DoTeleportTo(x,y,SHIELD_ORB_Z); + PointReached = true; + }else CheckTimer -= diff; + + } + + if (Timer < diff){ + Unit* random = (Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_PLAYER_GUID))); + if (random)DoCast(random, SPELL_SHADOW_BOLT, false); + Timer = 500+ rand()%500; + }else Timer -= diff; + } + + void MovementInform(uint32 type, uint32 id){ + if(type != POINT_MOTION_TYPE) + return; + + PointReached = true; + } +}; + +CreatureAI* GetAI_mob_shield_orb(Creature *_Creature) +{ + return new mob_shield_orbAI (_Creature); +} + +//AI for Sinister Reflection +struct TRINITY_DLL_DECL mob_sinster_reflectionAI : public ScriptedAI +{ + mob_sinster_reflectionAI(Creature* c) : ScriptedAI(c) {} + + uint8 Class; + uint32 Timer[3]; + + void Reset(){ + Timer[0] = 0; + Timer[1] = 0; + Timer[2] = 0; + Class = 0; + } + + void Aggro(Unit* who){} + + void UpdateAI(const uint32 diff){ + + if(Class == 0){ + Class = m_creature->getVictim()->getClass(); + switch(Class){ + case CLASS_DRUID: + break; + case CLASS_HUNTER: + break; + case CLASS_MAGE: + break; + case CLASS_WARLOCK: + break; + case CLASS_WARRIOR: + m_creature->SetCanDualWield(true); + break; + case CLASS_PALADIN: + break; + case CLASS_PRIEST: + break; + case CLASS_SHAMAN: + m_creature->SetCanDualWield(true); + break; + case CLASS_ROGUE: + m_creature->SetCanDualWield(true); + break; + } + } + + switch(Class){ + case CLASS_DRUID: + if(Timer[1] < diff){ + DoCast(m_creature->getVictim(), SPELL_SR_MOONFIRE, false); + Timer[1] = 3000; + } + DoMeleeAttackIfReady(); + break; + case CLASS_HUNTER: + if(Timer[1] < diff){ + DoCast(m_creature->getVictim(), SPELL_SR_MULTI_SHOT, false); + Timer[1] = 9000; + } + if(Timer[2] < diff){ + DoCast(m_creature->getVictim(), SPELL_SR_SHOOT, false); + Timer[2] = 5000; + } + if(m_creature->IsWithinMeleeRange(m_creature->getVictim(), 6)){ + if(Timer[3] < diff){ + DoCast(m_creature->getVictim(), SPELL_SR_MULTI_SHOT, false); + Timer[3] = 7000; + } + DoMeleeAttackIfReady(); + } + break; + case CLASS_MAGE: + if(Timer[1] < diff){ + DoCast(m_creature->getVictim(), SPELL_SR_FIREBALL, false); + Timer[1] = 3000; + } + DoMeleeAttackIfReady(); + break; + case CLASS_WARLOCK: + if(Timer[1] < diff){ + DoCast(m_creature->getVictim(), SPELL_SR_SHADOW_BOLT, false); + Timer[1] = 4000; + } + if(Timer[2] < diff){ + DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_SR_CURSE_OF_AGONY, true); + Timer[2] = 3000; + } + DoMeleeAttackIfReady(); + break; + case CLASS_WARRIOR: + if(Timer[1] < diff){ + DoCast(m_creature->getVictim(), SPELL_SR_WHIRLWIND, false); + Timer[1] = 10000; + } + DoMeleeAttackIfReady(); + break; + case CLASS_PALADIN: + if(Timer[1] < diff){ + DoCast(m_creature->getVictim(), SPELL_SR_HAMMER_OF_JUSTICE, false); + Timer[1] = 7000; + } + if(Timer[2] < diff){ + DoCast(m_creature->getVictim(), SPELL_SR_HOLY_SHOCK, false); + Timer[2] = 3000; + } + DoMeleeAttackIfReady(); + break; + case CLASS_PRIEST: + if(Timer[1] < diff){ + DoCast(m_creature->getVictim(), SPELL_SR_HOLY_SMITE, false); + Timer[1] = 5000; + } + if(Timer[2] < diff){ + DoCast(m_creature, SPELL_SR_RENEW, false); + Timer[2] = 7000; + } + DoMeleeAttackIfReady(); + break; + case CLASS_SHAMAN: + if(Timer[1] < diff){ + DoCast(m_creature->getVictim(), SPELL_SR_EARTH_SHOCK, false); + Timer[1] = 5000; + } + DoMeleeAttackIfReady(); + break; + case CLASS_ROGUE: + if(Timer[1] < diff){ + DoCast(m_creature->getVictim(), SPELL_SR_HEMORRHAGE, true); + Timer[1] = 5000; + } + DoMeleeAttackIfReady(); + break; + } + debug_log("Sinister-Timer"); + for(uint8 i = 0; i < 3; ++i) + Timer[i] -= diff; + } + +}; + +CreatureAI* GetAI_mob_sinster_reflection(Creature *_Creature) +{ + return new mob_sinster_reflectionAI (_Creature); +} void AddSC_boss_kiljaeden() -{}; +{ + Script* newscript; + + newscript = new Script; + newscript->pGOHello = &GOHello_go_orb_of_the_blue_flight; + newscript->Name = "go_orb_of_the_blue_flight"; + newscript->RegisterSelf(); + + newscript = new Script; + newscript->GetAI = &GetAI_boss_kalecgosKJ; + newscript->Name = "boss_kalecgosKJ"; + newscript->RegisterSelf(); + + newscript = new Script; + newscript->GetAI = &GetAI_boss_kiljaeden; + newscript->Name = "boss_kiljaeden"; + newscript->RegisterSelf(); + + newscript = new Script; + newscript->GetAI = &GetAI_mob_kiljaeden_controller; + newscript->Name = "mob_kiljaeden_controller"; + newscript->RegisterSelf(); + + newscript = new Script; + newscript->GetAI = &GetAI_mob_hand_of_the_deceiver; + newscript->Name = "mob_hand_of_the_deceiver"; + newscript->RegisterSelf(); + + newscript = new Script; + newscript->GetAI = &GetAI_mob_felfire_portal; + newscript->Name = "mob_felfire_portal"; + newscript->RegisterSelf(); + + newscript = new Script; + newscript->GetAI = &GetAI_mob_volatile_felfire_fiend; + newscript->Name = "mob_volatile_felfire_fiend"; + newscript->RegisterSelf(); + + newscript = new Script; + newscript->GetAI = &GetAI_mob_armageddon; + newscript->Name = "mob_armageddon"; + newscript->RegisterSelf(); + + newscript = new Script; + newscript->GetAI = &GetAI_mob_shield_orb; + newscript->Name = "mob_shield_orb"; + newscript->RegisterSelf(); + + newscript = new Script; + newscript->GetAI = &GetAI_mob_sinster_reflection; + newscript->Name = "mob_sinster_reflection"; + newscript->RegisterSelf(); +}; diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_muru.cpp b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_muru.cpp index fd9a8886962..6000ee474e0 100644 --- a/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_muru.cpp +++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/boss_muru.cpp @@ -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(); +}
\ No newline at end of file diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/def_sunwell_plateau.h b/src/bindings/scripts/scripts/zone/sunwell_plateau/def_sunwell_plateau.h index 8ae61602616..9fbb5de7300 100644 --- a/src/bindings/scripts/scripts/zone/sunwell_plateau/def_sunwell_plateau.h +++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/def_sunwell_plateau.h @@ -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 diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/instance_sunwell_plateau.cpp b/src/bindings/scripts/scripts/zone/sunwell_plateau/instance_sunwell_plateau.cpp index cd4f62584f0..ee4ceb61780 100644 --- a/src/bindings/scripts/scripts/zone/sunwell_plateau/instance_sunwell_plateau.cpp +++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/instance_sunwell_plateau.cpp @@ -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) diff --git a/src/bindings/scripts/scripts/zone/sunwell_plateau/sunwell_plateau.cpp b/src/bindings/scripts/scripts/zone/sunwell_plateau/sunwell_plateau.cpp index c2608f2bd1e..e68717857cb 100644 --- a/src/bindings/scripts/scripts/zone/sunwell_plateau/sunwell_plateau.cpp +++ b/src/bindings/scripts/scripts/zone/sunwell_plateau/sunwell_plateau.cpp @@ -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() -{};
\ No newline at end of file +{ +} diff --git a/src/game/Player.cpp b/src/game/Player.cpp index e17afc32fd9..a3751ea2345 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -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; diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 7b5bfca3a05..28cbd541b00 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -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) diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index b96eb399fc2..9fd70cb676e 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -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: { diff --git a/src/game/TicketMgr.cpp b/src/game/TicketMgr.cpp index 69022b7dd27..52cf1ff0db6 100644 --- a/src/game/TicketMgr.cpp +++ b/src/game/TicketMgr.cpp @@ -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) |