diff options
Diffstat (limited to 'src')
4 files changed, 102 insertions, 46 deletions
diff --git a/src/bindings/scripts/scripts/zone/aunchindoun/mana_tombs/boss_nexusprince_shaffar.cpp b/src/bindings/scripts/scripts/zone/aunchindoun/mana_tombs/boss_nexusprince_shaffar.cpp index 9b56561e16b..440f233bccf 100644 --- a/src/bindings/scripts/scripts/zone/aunchindoun/mana_tombs/boss_nexusprince_shaffar.cpp +++ b/src/bindings/scripts/scripts/zone/aunchindoun/mana_tombs/boss_nexusprince_shaffar.cpp @@ -50,6 +50,7 @@ EndContentData */ #define SPELL_ETHEREAL_BEACON_VISUAL 32368 #define ENTRY_BEACON 18431 +#define ENTRY_SHAFFAR 18344 struct TRINITY_DLL_DECL boss_nexusprince_shaffarAI : public ScriptedAI { @@ -204,6 +205,7 @@ struct TRINITY_DLL_DECL mob_ethereal_beaconAI : public ScriptedAI { HeroicMode = m_creature->GetMap()->IsHeroic(); Reset(); + CanEvade = false; } bool HeroicMode; @@ -239,6 +241,13 @@ struct TRINITY_DLL_DECL mob_ethereal_beaconAI : public ScriptedAI { DoCast(m_creature->getVictim(),SPELL_ARCANE_BOLT); ArcaneBolt_Timer = 2000 + rand()%2500; + Unit *shaffar = FindCreature(ENTRY_SHAFFAR, 100); + if(!shaffar || shaffar->isDead()) + { + m_creature->SetVisibility(VISIBILITY_OFF); + m_creature->SetLootRecipient(NULL); + m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + } }else ArcaneBolt_Timer -= diff; if( Apprentice_Timer < diff ) diff --git a/src/bindings/scripts/scripts/zone/barrens/the_barrens.cpp b/src/bindings/scripts/scripts/zone/barrens/the_barrens.cpp index 879076e1067..751b4d995f1 100644 --- a/src/bindings/scripts/scripts/zone/barrens/the_barrens.cpp +++ b/src/bindings/scripts/scripts/zone/barrens/the_barrens.cpp @@ -451,7 +451,7 @@ bool QuestAccept_npc_wizzlecrank_shredder(Player* player, Creature* creature, Qu if (quest->GetQuestId() == QUEST_ESCAPE) { ((npc_escortAI*)(creature->AI()))->Start(true, true, false, player->GetGUID()); - creature->setFaction(35); + creature->setFaction(113); } return true; } diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp index b7a7e666b92..e3a6f226dcd 100644 --- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp +++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_morogrim_tidewalker.cpp @@ -91,11 +91,16 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI } ScriptedInstance* pInstance; + Map::PlayerList const *PlayerList; uint32 TidalWave_Timer; uint32 WateryGrave_Timer; uint32 Earthquake_Timer; uint32 WateryGlobules_Timer; + uint32 SummonSpell; + uint32 globulespell[4]; + int8 Playercount; + int8 counter; bool Earthquake; bool Phase2; @@ -106,6 +111,10 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI WateryGrave_Timer = 30000; Earthquake_Timer = 40000; WateryGlobules_Timer = 0; + globulespell[0] = SPELL_SUMMON_WATER_GLOBULE_1; + globulespell[1] = SPELL_SUMMON_WATER_GLOBULE_2; + globulespell[2] = SPELL_SUMMON_WATER_GLOBULE_3; + globulespell[3] = SPELL_SUMMON_WATER_GLOBULE_4; Earthquake = false; Phase2 = false; @@ -126,9 +135,9 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI { switch(rand()%3) { - case 0: DoScriptText(SAY_SLAY1, m_creature); break; - case 1: DoScriptText(SAY_SLAY2, m_creature); break; - case 2: DoScriptText(SAY_SLAY3, m_creature); break; + case 0: DoScriptText(SAY_SLAY1, m_creature); break; + case 1: DoScriptText(SAY_SLAY2, m_creature); break; + case 2: DoScriptText(SAY_SLAY3, m_creature); break; } } @@ -139,17 +148,22 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI if (pInstance) pInstance->SetData(DATA_MOROGRIMTIDEWALKEREVENT, NOT_STARTED); } - - void Aggro(Unit *who) { StartEvent(); } - - void ApplyWateryGrave(Unit *player, uint8 target) + + void Aggro(Unit *who) + { + PlayerList = &((InstanceMap*)m_creature->GetMap())->GetPlayers(); + Playercount = PlayerList->getSize(); + StartEvent(); + } + + void ApplyWateryGrave(Unit *player, uint8 i) { - switch(target) + switch(i) { - case 0: DoCast(player, SPELL_WATERY_GRAVE_1); break; - case 1: DoCast(player, SPELL_WATERY_GRAVE_2); break; - case 2: DoCast(player, SPELL_WATERY_GRAVE_3); break; - case 3: DoCast(player, SPELL_WATERY_GRAVE_4); break; + case 0: player->CastSpell(player, SPELL_WATERY_GRAVE_1, true); break; + case 1: player->CastSpell(player, SPELL_WATERY_GRAVE_2, true); break; + case 2: player->CastSpell(player, SPELL_WATERY_GRAVE_3, true); break; + case 3: player->CastSpell(player, SPELL_WATERY_GRAVE_4, true); break; } } @@ -176,28 +190,42 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI case 1: DoScriptText(SAY_SUMMON2, m_creature); break; } - if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0)) - { - //north - DoCast(target, SPELL_SUMMON_MURLOC_A6); - DoCast(target, SPELL_SUMMON_MURLOC_A7); - DoCast(target, SPELL_SUMMON_MURLOC_A8); - DoCast(target, SPELL_SUMMON_MURLOC_A9); - DoCast(target, SPELL_SUMMON_MURLOC_A10); - - //south - DoCast(target, SPELL_SUMMON_MURLOC_B6); - DoCast(target, SPELL_SUMMON_MURLOC_B7); - DoCast(target, SPELL_SUMMON_MURLOC_B8); - DoCast(target, SPELL_SUMMON_MURLOC_B9); - DoCast(target, SPELL_SUMMON_MURLOC_B10); + Unit* target; + using std::set; + set<int> SummonList; + set<int>::iterator itr; + + target = SelectUnit(SELECT_TARGET_RANDOM, 0, 50, true); + m_creature->CastSpell(target, SummonSpell, false); + SummonSpell++; + + for (int8 i = 0; i < 9; i++) //bad hack + { //instead of casting 9 spell in one update + counter = 0; // selecet 9 players which cast our spells + do{target = SelectUnit(SELECT_TARGET_RANDOM, 0, 50, true); //check if player is already selected + if(counter > Playercount) + break; + if(target) itr = SummonList.find(target->GetGUID()); + counter++; + } while (itr != SummonList.end()); + + if(target){ + SummonList.insert(target->GetGUID()); + target->CastSpell(target, SummonSpell, false); //player cast on himself (this works) + } + SummonSpell++; + + if(SummonSpell > SPELL_SUMMON_MURLOC_B10) //reset all variables for earthquake + { + SummonSpell = SPELL_SUMMON_MURLOC_A6; + SummonList.clear(); + DoScriptText(EMOTE_EARTHQUAKE, m_creature); + Earthquake = false; + Earthquake_Timer = 40000+rand()%5000; + } } - DoScriptText(EMOTE_EARTHQUAKE, m_creature); - - Earthquake = false; - Earthquake_Timer = 40000+rand()%5000; - } - }else Earthquake_Timer -= diff; + } + }else Earthquake_Timer -= diff; //TidalWave_Timer if (TidalWave_Timer < diff) @@ -213,11 +241,21 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI { //Teleport 4 players under the waterfalls Unit *target; + using std::set; + set<int>list; + set<int>::iterator itr; for(uint8 i = 0; i < 4; i++) { - target = SelectUnit(SELECT_TARGET_RANDOM, 1); - if (target && (target->GetTypeId() == TYPEID_PLAYER) && !target->HasAura(SPELL_WATERY_GRAVE, 0) && target->IsWithinDistInMap(m_creature, 50)) - ApplyWateryGrave(target, i); + counter = 0; + do{target = SelectUnit(SELECT_TARGET_RANDOM, 1, 50, true); //target players only + if(counter < Playercount) + break; + if(target) itr = list.find(target->GetGUID()); + counter++; + }while(itr != list.end()); + if(target){list.insert(target->GetGUID()); + ApplyWateryGrave(target, i); + } } switch(rand()%2) @@ -239,13 +277,22 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI //WateryGlobules_Timer if (WateryGlobules_Timer < diff) { - if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0)) - { - DoCast(target, SPELL_SUMMON_WATER_GLOBULE_1); - DoCast(target, SPELL_SUMMON_WATER_GLOBULE_2); - DoCast(target, SPELL_SUMMON_WATER_GLOBULE_3); - DoCast(target, SPELL_SUMMON_WATER_GLOBULE_4); - } + Unit* globuletarget; + using std::set; + set<int>globulelist; + set<int>::iterator itr; + for (int8 g = 0; g < 4; g++) //one unit cant cast more than one spell per update, so some players have to cast for us XD + { + counter = 0; + do {globuletarget = SelectUnit(SELECT_TARGET_RANDOM, 0,50,true); + if(globuletarget) itr = globulelist.find(globuletarget->GetGUID()); + if (counter > Playercount) + break; + counter++; + } while (itr != globulelist.end()); + if(globuletarget)globulelist.insert(globuletarget->GetGUID()); + globuletarget->CastSpell(globuletarget, globulespell[g], true); + } DoScriptText(EMOTE_WATERY_GLOBULES, m_creature); WateryGlobules_Timer = 25000; }else WateryGlobules_Timer -= diff; diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_void_reaver.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_void_reaver.cpp index 2f52eef8c05..c7e832fd172 100644 --- a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_void_reaver.cpp +++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_void_reaver.cpp @@ -120,7 +120,7 @@ struct TRINITY_DLL_DECL boss_void_reaverAI : public ScriptedAI { target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid()); //18 yard radius minimum - if(target && target->GetDistance2d(m_creature) > 18) + if(target && target->GetTypeId() == TYPEID_PLAYER && target->isAlive() && target->GetDistance2d(m_creature) > 18) target_list.push_back(target); target = NULL; } @@ -128,7 +128,7 @@ struct TRINITY_DLL_DECL boss_void_reaverAI : public ScriptedAI target = *(target_list.begin()+rand()%target_list.size()); if (target) - DoCast(target, SPELL_ARCANE_ORB); + m_creature->CastSpell(target->GetPositionX(),target->GetPositionY(),target->GetPositionZ(), SPELL_ARCANE_ORB, true); ArcaneOrb_Timer = 3000; }else ArcaneOrb_Timer -= diff; |