diff options
author | Trazom62 <none@none> | 2010-03-21 17:17:34 +0100 |
---|---|---|
committer | Trazom62 <none@none> | 2010-03-21 17:17:34 +0100 |
commit | 450b2fba9db1df41613193f3f7bc7805bce23db3 (patch) | |
tree | 145bd21ac4048728133dc9ff5b54bc38c98d2a8c /src | |
parent | c5f83416343882ab5a5c1548832dc675e999ad36 (diff) |
Update Script Ulduar/XT-002. Thanks Dakeyras. Fixes issue 1074.
Add script texts for all ulduar bosses and adds. Mainly from wowwiki, Thanks.
Some code style cleanup.
Still WiP.
--HG--
branch : trunk
Diffstat (limited to 'src')
13 files changed, 1351 insertions, 413 deletions
diff --git a/src/scripts/northrend/ulduar/ulduar/boss_algalon.cpp b/src/scripts/northrend/ulduar/ulduar/boss_algalon.cpp index 32b5190ccf4..e8fae4512ea 100644 --- a/src/scripts/northrend/ulduar/ulduar/boss_algalon.cpp +++ b/src/scripts/northrend/ulduar/ulduar/boss_algalon.cpp @@ -58,28 +58,28 @@ enum Creatures #define NORDRASSIL_Y -324.609222 #define NORDRASSIL_Z 417.322174 -enum Texts +enum Yells { - SAY_AGGRO = -1620000, - SAY_KILL_1 = -1620005, - SAY_KILL_2 = -1620006, - SAY_BIG_BANG_1 = -1620002, - SAY_BIG_BANG_2 = -1620003, - SAY_PHASE_2 = -1620003, - SAY_BLACK_HOLE = -1620004, - SAY_BERSERK = -1620007, - SAY_SUMMON_COLLAPSING_STAR = -1620008, - SAY_ENGADED_FOR_FIRTS_TIME = -1620001, - SAY_SUMMON1 = -1620010, - SAY_SUMMON2 = -1620011, - SAY_SUMMON3 = -1620012, - SAY_DEATH_1 = -1620013, - SAY_DEATH_2 = -1620014, - SAY_DEATH_3 = -1620015, - SAY_DEATH_4 = -1620009, - SAY_DEFEAT_1 = -1620016, - SAY_DEFEAT_2 = -1620017, - SAY_DEFEAT_3 = -1620018 + SAY_AGGRO = -1603000, + SAY_SLAY_1 = -1603001, + SAY_SLAY_2 = -1603002, + SAY_ENGADED_FOR_FIRTS_TIME = -1603003, + SAY_PHASE_2 = -1603004, + SAY_SUMMON_COLLAPSING_STAR = -1603005, + SAY_DEATH_1 = -1603006, + SAY_DEATH_2 = -1603007, + SAY_DEATH_3 = -1603008, + SAY_DEATH_4 = -1603009, + SAY_DEATH_5 = -1603010, + SAY_BERSERK = -1603011, + SAY_BIG_BANG_1 = -1603012, + SAY_BIG_BANG_2 = -1603013, + SAY_TIMER_1 = -1603014, + SAY_TIMER_2 = -1603015, + SAY_TIMER_3 = -1603016, + SAY_SUMMON_1 = -1603017, + SAY_SUMMON_2 = -1603018, + SAY_SUMMON_3 = -1603019, }; struct boss_algalonAI : public ScriptedAI @@ -87,6 +87,7 @@ struct boss_algalonAI : public ScriptedAI boss_algalonAI(Creature *c) : ScriptedAI(c) { pInstance = c->GetInstanceData(); + Summon = false; // not in reset. intro speech done only once. } ScriptedInstance* pInstance; @@ -107,33 +108,43 @@ struct boss_algalonAI : public ScriptedAI uint64 BlackHoleGUID; bool Enrage; - bool m_bIsHeroicMode; bool Summon; void EnterCombat(Unit* who) { - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->SetReactState(REACT_PASSIVE); + if (Summon) + { + DoScriptText(SAY_AGGRO, m_creature); + m_creature->InterruptSpell(CURRENT_CHANNELED_SPELL); + DoZoneInCombat(who->ToCreature()); + } + else + { + m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + m_creature->SetReactState(REACT_PASSIVE); + uiStep = 1; + } + + if (pInstance) + pInstance->SetData(TYPE_ALGALON, IN_PROGRESS); } void KilledUnit(Unit *victim) { - DoScriptText(RAND(SAY_KILL_1,SAY_KILL_2), me); + DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), m_creature); } void Reset() { Phase = 1; - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - DoScriptText(SAY_DEFEAT_1, me); - DoScriptText(SAY_DEFEAT_2, me); - DoScriptText(SAY_DEFEAT_3, me); + m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); if (pInstance) pInstance->SetData(TYPE_ALGALON, NOT_STARTED); BlackHoleGUID = 0; + uiPhase_timer = 0; Ascend_Timer = 480000; //8 minutes QuantumStrike_Timer = 4000 + rand()%10000; Berserk_Timer = 360000; //6 minutes @@ -141,6 +152,7 @@ struct boss_algalonAI : public ScriptedAI BigBang_Timer = 90000; PhasePunch_Timer = 8000; CosmicSmash_Timer = urand(30000, 60000); + Enrage = false; } void JumpToNextStep(uint32 uiTimer) @@ -149,21 +161,14 @@ struct boss_algalonAI : public ScriptedAI ++uiStep; } - void Aggro(Unit* pWho) - { - me->InterruptSpell(CURRENT_CHANNELED_SPELL); - me->SetInCombatWithZone(); - if (pInstance) - pInstance->SetData(TYPE_ALGALON, IN_PROGRESS); - } - void DespawnCollapsingStar() { if (m_lCollapsingStarGUIDList.empty()) return; + for(std::list<uint64>::iterator itr = m_lCollapsingStarGUIDList.begin(); itr != m_lCollapsingStarGUIDList.end(); ++itr) { - if (Creature* pTemp = (Creature*)Unit::GetUnit(*me, *itr)) + if (Creature* pTemp = Unit::GetCreature(*m_creature, *itr)) { if (pTemp->isAlive()) pTemp->ForcedDespawn(); @@ -177,18 +182,17 @@ struct boss_algalonAI : public ScriptedAI if (pSummoned->GetEntry() == CREATURE_COLLAPSING_STAR) { Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0); - if (me->getVictim()) - pSummoned->AI()->AttackStart(pTarget ? pTarget : me->getVictim()); + if (m_creature->getVictim()) + pSummoned->AI()->AttackStart(pTarget ? pTarget : m_creature->getVictim()); m_lCollapsingStarGUIDList.push_back(pSummoned->GetGUID()); } } void SummonCollapsingStar(Unit* target) { - DoScriptText(SAY_SUMMON_COLLAPSING_STAR, me); - me->SummonCreature(CREATURE_COLLAPSING_STAR,target->GetPositionX()+15.0,target->GetPositionY()+15.0,target->GetPositionZ(),0, TEMPSUMMON_TIMED_DESPAWN, 100000); - DoScriptText(SAY_BLACK_HOLE, me); - me->SummonCreature(CREATURE_BLACK_HOLE,target->GetPositionX()+15.0,target->GetPositionY()+15.0,target->GetPositionZ(),0, TEMPSUMMON_TIMED_DESPAWN, 27000); + DoScriptText(SAY_SUMMON_COLLAPSING_STAR, m_creature); + m_creature->SummonCreature(CREATURE_COLLAPSING_STAR,target->GetPositionX()+15.0,target->GetPositionY()+15.0,target->GetPositionZ(),0, TEMPSUMMON_TIMED_DESPAWN, 100000); + m_creature->SummonCreature(CREATURE_BLACK_HOLE,target->GetPositionX()+15.0,target->GetPositionY()+15.0,target->GetPositionZ(),0, TEMPSUMMON_TIMED_DESPAWN, 27000); } void UpdateAI(const uint32 diff) @@ -197,25 +201,29 @@ struct boss_algalonAI : public ScriptedAI if (!UpdateVictim()) return; - if ((me->GetHealth()*100 / me->GetMaxHealth()) < 20 && Phase == 1) + if (Phase == 1 && HealthBelowPct(20)) { Phase = 2; - DoScriptText(SAY_PHASE_2, me); + DoScriptText(SAY_PHASE_2, m_creature); } - if ((me->GetHealth()*100 / me->GetMaxHealth()) < 2) + if (HealthBelowPct(2)) { - me->SummonGameObject(GAMEOBJECT_GIVE_OF_THE_OBSERVER, 1634.258667, -295.101166,417.321381,0,0,0,0,0,-10); + m_creature->SummonGameObject(GAMEOBJECT_GIVE_OF_THE_OBSERVER, 1634.258667, -295.101166,417.321381,0,0,0,0,0,-10); - DoScriptText(SAY_DEATH_1, me); - DoScriptText(SAY_DEATH_2, me); - DoScriptText(SAY_DEATH_3, me); - DoScriptText(SAY_DEATH_4, me); + // All of them. or random? + DoScriptText(SAY_DEATH_1, m_creature); + DoScriptText(SAY_DEATH_2, m_creature); + DoScriptText(SAY_DEATH_3, m_creature); + DoScriptText(SAY_DEATH_4, m_creature); + DoScriptText(SAY_DEATH_5, m_creature); - me->DisappearAndDie(); + m_creature->DisappearAndDie(); if (pInstance) pInstance->SetData(TYPE_ALGALON, DONE); + + return; } if (Phase == 1) @@ -226,60 +234,76 @@ struct boss_algalonAI : public ScriptedAI { switch(uiStep) { - case 1: DoScriptText(SAY_SUMMON1, m_creature); break; JumpToNextStep(3000); - case 2: DoScriptText(SAY_SUMMON2, m_creature); break; JumpToNextStep(3000); - case 3: DoScriptText(SAY_SUMMON3, m_creature); break; JumpToNextStep(3000); - case 4: DoScriptText(SAY_ENGADED_FOR_FIRTS_TIME, m_creature); break; JumpToNextStep(3000); - case 5: DoScriptText(SAY_AGGRO, m_creature); break; - case 6: m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); break; - case 7: m_creature->SetReactState(REACT_AGGRESSIVE); break; + case 1: + DoScriptText(SAY_SUMMON_1, m_creature); + JumpToNextStep(3000); + break; + case 2: + DoScriptText(SAY_SUMMON_2, m_creature); + JumpToNextStep(3000); + break; + case 3: + DoScriptText(SAY_SUMMON_3, m_creature); + JumpToNextStep(3000); + break; + case 4: + DoScriptText(SAY_ENGADED_FOR_FIRTS_TIME, m_creature); + JumpToNextStep(3000); + break; + case 5: + m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + m_creature->SetReactState(REACT_AGGRESSIVE); + Summon = true; + break; } - }else uiPhase_timer -= diff; + } else uiPhase_timer -= diff; + + return; } - if(QuantumStrike_Timer <= diff) + if (QuantumStrike_Timer <= diff) { - DoCast(me->getVictim(), m_bIsHeroicMode ? H_SPELL_QUANTUM_STRIKE : SPELL_QUANTUM_STRIKE, true); + DoCast(m_creature->getVictim(), RAID_MODE(SPELL_QUANTUM_STRIKE,H_SPELL_QUANTUM_STRIKE), true); - QuantumStrike_Timer = 4000 + rand()%10000; - }else QuantumStrike_Timer -= diff; + QuantumStrike_Timer = urand(4000, 14000); + } else QuantumStrike_Timer -= diff; - if(BigBang_Timer <= diff) + if (BigBang_Timer <= diff) { - DoScriptText(RAND(SAY_BIG_BANG_1,SAY_BIG_BANG_2), me); - DoCast(me->getVictim(), m_bIsHeroicMode ? H_SPELL_BIG_BANG : SPELL_BIG_BANG, true); + DoScriptText(RAND(SAY_BIG_BANG_1,SAY_BIG_BANG_2), m_creature); + DoCast(m_creature->getVictim(), RAID_MODE(SPELL_BIG_BANG,H_SPELL_BIG_BANG), true); BigBang_Timer = 90000; - }else BigBang_Timer -= diff; + } else BigBang_Timer -= diff; - if(Ascend_Timer <= diff) + if (Ascend_Timer <= diff) { - DoCast(me->getVictim(),SPELL_ASCEND, true); + DoCast(m_creature->getVictim(),SPELL_ASCEND, true); Ascend_Timer = 480000; - }else Ascend_Timer -= diff; + } else Ascend_Timer -= diff; - if(PhasePunch_Timer <= diff) + if (PhasePunch_Timer <= diff) { - DoCast(me->getVictim(),SPELL_PHASE_PUNCH, true); + DoCast(m_creature->getVictim(),SPELL_PHASE_PUNCH, true); PhasePunch_Timer = 8000; - }else PhasePunch_Timer -= diff; + } else PhasePunch_Timer -= diff; - if(CosmicSmash_Timer <= diff) + if (CosmicSmash_Timer <= diff) { - DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), m_bIsHeroicMode ? H_SPELL_COSMIC_SMASH : SPELL_COSMIC_SMASH, true); + DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), RAID_MODE(SPELL_COSMIC_SMASH,H_SPELL_COSMIC_SMASH), true); CosmicSmash_Timer = urand(30000, 60000); - }else CosmicSmash_Timer -= diff; + } else CosmicSmash_Timer -= diff; - if(Berserk_Timer <= diff) + if (Berserk_Timer <= diff) { - DoScriptText(SAY_BERSERK, me); - DoCast(me->getVictim(),SPELL_BERSERK, true); + DoScriptText(SAY_BERSERK, m_creature); + DoCast(m_creature->getVictim(),SPELL_BERSERK, true); Berserk_Timer = 360000; - }else Berserk_Timer -= diff; + } else Berserk_Timer -= diff; DoMeleeAttackIfReady(); @@ -292,9 +316,9 @@ struct boss_algalonAI : public ScriptedAI { if (Ascend_Timer <= diff) { - DoCast(me, SPELL_ASCEND); - DoScriptText(SAY_BERSERK, me); - Ascend_Timer = 360000 + rand()%5000; + DoCast(m_creature, SPELL_ASCEND); + DoScriptText(SAY_BERSERK, m_creature); + Ascend_Timer = urand(360000,365000); Enrage = false; } else Ascend_Timer -= diff; } @@ -303,13 +327,13 @@ struct boss_algalonAI : public ScriptedAI DoMeleeAttackIfReady(); } }; + //Collapsing Star struct mob_collapsing_starAI : public ScriptedAI { mob_collapsing_starAI(Creature *pCreature) : ScriptedAI(pCreature) { pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); - Reset(); } ScriptedInstance* pInstance; @@ -326,11 +350,11 @@ struct mob_collapsing_starAI : public ScriptedAI if (!UpdateVictim()) return; - if(BlackHoleExplosion_Timer <= diff) + if (BlackHoleExplosion_Timer <= diff) { - me->CastSpell(me, SPELL_BLACK_HOLE_EXPLOSION, false); + m_creature->CastSpell(m_creature, SPELL_BLACK_HOLE_EXPLOSION, false); BlackHoleExplosion_Timer = 0; - }else BlackHoleExplosion_Timer -= diff; + } else BlackHoleExplosion_Timer -= diff; } }; diff --git a/src/scripts/northrend/ulduar/ulduar/boss_assembly_of_iron.cpp b/src/scripts/northrend/ulduar/ulduar/boss_assembly_of_iron.cpp index 2bb001b06da..d792fca56da 100644 --- a/src/scripts/northrend/ulduar/ulduar/boss_assembly_of_iron.cpp +++ b/src/scripts/northrend/ulduar/ulduar/boss_assembly_of_iron.cpp @@ -62,8 +62,9 @@ EndScriptData */ #define SPELL_LIGHTNING_TENDRILS_H 63486 #define SPELL_STORMSHIELD 64187 -enum eEnums +enum Events { + EVENT_NONE, EVENT_ENRAGE, // Steelbreaker EVENT_FUSION_PUNCH, @@ -81,8 +82,35 @@ enum eEnums EVENT_LIGHTNING_WHIRL, EVENT_LIGHTNING_TENDRILS, EVENT_STORMSHIELD, - MAX_EVENT +}; +enum Yells +{ + SAY_STEELBREAKER_AGGRO = -1603020, + SAY_STEELBREAKER_SLAY_1 = -1603021, + SAY_STEELBREAKER_SLAY_2 = -1603022, + SAY_STEELBREAKER_POWER = -1603023, + SAY_STEELBREAKER_DEATH_1 = -1603024, + SAY_STEELBREAKER_DEATH_2 = -1603025, + SAY_STEELBREAKER_BERSERK = -1603026, + + SAY_MOLGEIM_AGGRO = -1603030, + SAY_MOLGEIM_SLAY_1 = -1603031, + SAY_MOLGEIM_SLAY_2 = -1603032, + SAY_MOLGEIM_RUNE_DEATH = -1603033, + SAY_MOLGEIM_SUMMON = -1603034, + SAY_MOLGEIM_DEATH_1 = -1603035, + SAY_MOLGEIM_DEATH_2 = -1603036, + SAY_MOLGEIM_BERSERK = -1603037, + + SAY_BRUNDIR_AGGRO = -1603040, + SAY_BRUNDIR_SLAY_1 = -1603041, + SAY_BRUNDIR_SLAY_2 = -1603042, + SAY_BRUNDIR_SPECIAL = -1603043, + SAY_BRUNDIR_FLIGHT = -1603044, + SAY_BRUNDIR_DEATH_1 = -1603045, + SAY_BRUNDIR_DEATH_2 = -1603046, + SAY_BRUNDIR_BERSERK = -1603047, }; bool IsEncounterComplete(ScriptedInstance* pInstance, Creature* m_creature) @@ -93,15 +121,13 @@ bool IsEncounterComplete(ScriptedInstance* pInstance, Creature* m_creature) for (uint8 i = 0; i < 3; ++i) { uint64 guid = pInstance->GetData64(DATA_STEELBREAKER+i); - if(!guid) + if (!guid) return false; - if(Creature *boss = (Unit::GetCreature((*m_creature), guid))) + if (Creature *boss = Unit::GetCreature(*m_creature, guid)) { - if(boss->isAlive()) + if (boss->isAlive()) return false; - - continue; } else return false; @@ -121,7 +147,7 @@ struct boss_steelbreakerAI : public ScriptedAI events.Reset(); phase = 0; m_creature->RemoveAllAuras(); - if(pInstance) + if (pInstance) pInstance->SetData(TYPE_ASSEMBLY, NOT_STARTED); } @@ -131,6 +157,7 @@ struct boss_steelbreakerAI : public ScriptedAI void EnterCombat(Unit *who) { + DoScriptText(SAY_STEELBREAKER_AGGRO, m_creature); DoZoneInCombat(); DoCast(m_creature, RAID_MODE(SPELL_HIGH_VOLTAGE, SPELL_HIGH_VOLTAGE_H)); events.ScheduleEvent(EVENT_ENRAGE, 900000); @@ -142,46 +169,46 @@ struct boss_steelbreakerAI : public ScriptedAI ++phase; events.SetPhase(phase); events.RescheduleEvent(EVENT_FUSION_PUNCH, 15000); - if(phase >= 2) + if (phase >= 2) events.RescheduleEvent(EVENT_STATIC_DISRUPTION, 30000); - if(phase >= 3) + if (phase >= 3) events.RescheduleEvent(EVENT_OVERWHELMING_POWER, rand()%5000); } void DamageTaken(Unit* pKiller, uint32 &damage) { - if(damage >= m_creature->GetHealth()) + if (damage >= m_creature->GetHealth()) { - if(Creature* Brundir = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_STORMCALLER_BRUNDIR) : 0)) - if(Brundir->isAlive()) - { + if (Creature* Brundir = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_STORMCALLER_BRUNDIR) : 0)) + if (Brundir->isAlive()) Brundir->SetHealth(Brundir->GetMaxHealth()); - } - if(Creature* Molgeim = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_RUNEMASTER_MOLGEIM) : 0)) - if(Molgeim->isAlive()) - { + if (Creature* Molgeim = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_RUNEMASTER_MOLGEIM) : 0)) + if (Molgeim->isAlive()) Molgeim->SetHealth(Molgeim->GetMaxHealth()); - } - DoCast(SPELL_SUPERCHARGE); + + DoCast(SPELL_SUPERCHARGE); } } void JustDied(Unit* Killer) { - if(IsEncounterComplete(pInstance, m_creature) && pInstance) + DoScriptText(RAND(SAY_STEELBREAKER_DEATH_1,SAY_STEELBREAKER_DEATH_2), m_creature); + if (IsEncounterComplete(pInstance, m_creature) && pInstance) pInstance->SetData(TYPE_ASSEMBLY, DONE); } void KilledUnit(Unit *who) { - if(phase == 3) + DoScriptText(RAND(SAY_STEELBREAKER_SLAY_1,SAY_STEELBREAKER_SLAY_2), m_creature); + + if (phase == 3) DoCast(m_creature, SPELL_ELECTRICAL_CHARGE); } void SpellHit(Unit *from, const SpellEntry *spell) { - if(spell->Id == SPELL_SUPERCHARGE) + if (spell->Id == SPELL_SUPERCHARGE) UpdatePhase(); } @@ -197,23 +224,23 @@ struct boss_steelbreakerAI : public ScriptedAI switch(eventId) { case EVENT_ENRAGE: + DoScriptText(SAY_STEELBREAKER_BERSERK, m_creature); DoCast(SPELL_BERSERK); - break; + break; case EVENT_FUSION_PUNCH: - DoCast(me->getVictim(), RAID_MODE(SPELL_FUSION_PUNCH_H, SPELL_FUSION_PUNCH)); - events.ScheduleEvent(EVENT_FUSION_PUNCH, 13000 + (rand()%9)*1000); - break; + DoCast(me->getVictim(), RAID_MODE(SPELL_FUSION_PUNCH, SPELL_FUSION_PUNCH_H)); + events.ScheduleEvent(EVENT_FUSION_PUNCH, urand(13000, 22000)); + break; case EVENT_STATIC_DISRUPTION: - { - Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM); - DoCast(pTarget, RAID_MODE(SPELL_STATIC_DISRUPTION_H, SPELL_STATIC_DISRUPTION)); - events.ScheduleEvent(EVENT_STATIC_DISRUPTION, 20000 + (rand()%20)*1000); - } - break; + if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM)) + DoCast(pTarget, RAID_MODE(SPELL_STATIC_DISRUPTION, SPELL_STATIC_DISRUPTION_H)); + events.ScheduleEvent(EVENT_STATIC_DISRUPTION, urand(20000, 40000)); + break; case EVENT_OVERWHELMING_POWER: + DoScriptText(SAY_STEELBREAKER_POWER, m_creature); DoCast(me->getVictim(), RAID_MODE(SPELL_OVERWHELMING_POWER, SPELL_OVERWHELMING_POWER_H)); events.ScheduleEvent(EVENT_OVERWHELMING_POWER, RAID_MODE(60000, 35000)); - break; + break; } } @@ -230,7 +257,7 @@ struct boss_runemaster_molgeimAI : public ScriptedAI void Reset() { - if(pInstance) + if (pInstance) pInstance->SetData(TYPE_ASSEMBLY, NOT_STARTED); events.Reset(); m_creature->RemoveAllAuras(); @@ -243,6 +270,7 @@ struct boss_runemaster_molgeimAI : public ScriptedAI void EnterCombat(Unit* who) { + DoScriptText(SAY_MOLGEIM_AGGRO, m_creature); DoZoneInCombat(); events.ScheduleEvent(EVENT_ENRAGE, 900000); UpdatePhase(); @@ -254,40 +282,43 @@ struct boss_runemaster_molgeimAI : public ScriptedAI events.SetPhase(phase); events.RescheduleEvent(EVENT_SHIELD_OF_RUNES, 27000); events.RescheduleEvent(EVENT_RUNE_OF_POWER, 60000); - if(phase >= 2) + if (phase >= 2) events.RescheduleEvent(EVENT_RUNE_OF_DEATH, 30000); - if(phase >= 3) - events.RescheduleEvent(EVENT_RUNE_OF_SUMMONING, 20000+(rand()%10)*1000); + if (phase >= 3) + events.RescheduleEvent(EVENT_RUNE_OF_SUMMONING, urand(20000,30000)); } void DamageTaken(Unit* pKiller, uint32 &damage) { - if(damage >= m_creature->GetHealth()) + if (damage >= m_creature->GetHealth()) { - if(Creature* Steelbreaker = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_STEELBREAKER) : 0)) - if(Steelbreaker->isAlive()) - { + if (Creature* Steelbreaker = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_STEELBREAKER) : 0)) + if (Steelbreaker->isAlive()) Steelbreaker->SetHealth(Steelbreaker->GetMaxHealth()); - } - if(Creature* Brundir = Unit::GetCreature((*m_creature), pInstance ? pInstance->GetData64(DATA_STORMCALLER_BRUNDIR) : 0)) - if(Brundir->isAlive()) - { + if (Creature* Brundir = Unit::GetCreature((*m_creature), pInstance ? pInstance->GetData64(DATA_STORMCALLER_BRUNDIR) : 0)) + if (Brundir->isAlive()) Brundir->SetHealth(Brundir->GetMaxHealth()); - } + DoCast(m_creature, SPELL_SUPERCHARGE); } } void JustDied(Unit* Killer) { - if(IsEncounterComplete(pInstance, m_creature) && pInstance) + DoScriptText(RAND(SAY_MOLGEIM_DEATH_1,SAY_MOLGEIM_DEATH_2), m_creature); + if (IsEncounterComplete(pInstance, m_creature) && pInstance) pInstance->SetData(TYPE_ASSEMBLY, DONE); } + void KilledUnit(Unit *who) + { + DoScriptText(RAND(SAY_MOLGEIM_SLAY_1,SAY_MOLGEIM_SLAY_2), m_creature); + } + void SpellHit(Unit *from, const SpellEntry *spell) { - if(spell->Id == SPELL_SUPERCHARGE) + if (spell->Id == SPELL_SUPERCHARGE) UpdatePhase(); } @@ -303,35 +334,34 @@ struct boss_runemaster_molgeimAI : public ScriptedAI switch(eventId) { case EVENT_ENRAGE: + DoScriptText(SAY_MOLGEIM_BERSERK, m_creature); DoCast(SPELL_BERSERK); - break; + break; case EVENT_RUNE_OF_POWER: // Improve target selection; random alive friendly { - Unit *Target = DoSelectLowestHpFriendly(60); - if(!Target || (Target && !Target->isAlive())) - Target = m_creature; - DoCast(Target, SPELL_RUNE_OF_POWER); + Unit *pTarget = DoSelectLowestHpFriendly(60); + if (!pTarget || (pTarget && !pTarget->isAlive())) + pTarget = m_creature; + DoCast(pTarget, SPELL_RUNE_OF_POWER); events.ScheduleEvent(EVENT_RUNE_OF_POWER, 60000); + break; } - break; case EVENT_SHIELD_OF_RUNES: DoCast(m_creature, RAID_MODE(SPELL_SHIELD_OF_RUNES, SPELL_SHIELD_OF_RUNES_H)); - events.ScheduleEvent(EVENT_SHIELD_OF_RUNES, 27000+ (rand()%7)*1000); - break; + events.ScheduleEvent(EVENT_SHIELD_OF_RUNES, urand(27000,34000)); + break; case EVENT_RUNE_OF_DEATH: - { - Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM); - DoCast(pTarget, SPELL_RUNE_OF_DEATH); - events.ScheduleEvent(EVENT_RUNE_OF_DEATH, 30000+ (rand()%10)*1000); - } - break; + DoScriptText(SAY_MOLGEIM_RUNE_DEATH, m_creature); + if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM)) + DoCast(pTarget, SPELL_RUNE_OF_DEATH); + events.ScheduleEvent(EVENT_RUNE_OF_DEATH, urand(30000,40000)); + break; case EVENT_RUNE_OF_SUMMONING: - { - Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM); - DoCast(pTarget, SPELL_RUNE_OF_SUMMONING); - events.ScheduleEvent(EVENT_RUNE_OF_SUMMONING, 20000+(rand()%10)*1000); - } - break; + DoScriptText(SAY_MOLGEIM_SUMMON, m_creature); + if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM)) + DoCast(pTarget, SPELL_RUNE_OF_SUMMONING); + events.ScheduleEvent(EVENT_RUNE_OF_SUMMONING, urand(20000,30000)); + break; } } @@ -346,29 +376,29 @@ struct mob_lightning_elementalAI : public ScriptedAI Charge(); } - Unit* Target; - void Charge() { - Target = m_creature->SelectNearestTarget(); - m_creature->AddThreat(Target, 5000000.0f); - AttackStart(Target); + Unit* pTarget = m_creature->SelectNearestTarget(); + m_creature->AddThreat(pTarget, 5000000.0f); + AttackStart(pTarget); } void UpdateAI(const uint32 diff) { - if(!m_creature->isInCombat()) + if (!m_creature->isInCombat()) return; - if(m_creature->IsWithinMeleeRange(Target)) + if (!UpdateVictim()) + return; + + if (m_creature->IsWithinMeleeRange(m_creature->getVictim())) { - DoCast(Target, RAID_MODE(SPELL_LIGHTNING_BLAST, SPELL_LIGHTNING_BLAST_H)); + DoCast(m_creature->getVictim(), RAID_MODE(SPELL_LIGHTNING_BLAST, SPELL_LIGHTNING_BLAST_H)); m_creature->Kill(m_creature); // hack until spell works } - m_creature->GetMotionMaster()->MoveChase(Target); // needed at every update? + m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); // needed at every update? } - }; struct mob_rune_of_summoningAI : public ScriptedAI @@ -394,7 +424,7 @@ struct boss_stormcaller_brundirAI : public ScriptedAI void Reset() { - if(pInstance) + if (pInstance) pInstance->SetData(TYPE_ASSEMBLY, NOT_STARTED); m_creature->RemoveAllAuras(); events.Reset(); @@ -407,6 +437,7 @@ struct boss_stormcaller_brundirAI : public ScriptedAI void EnterCombat(Unit* who) { + DoScriptText(SAY_BRUNDIR_AGGRO, m_creature); DoZoneInCombat(); events.ScheduleEvent(EVENT_ENRAGE, 900000); UpdatePhase(); @@ -416,33 +447,28 @@ struct boss_stormcaller_brundirAI : public ScriptedAI { ++phase; events.SetPhase(phase); - events.RescheduleEvent(EVENT_CHAIN_LIGHTNING, 9000+ (rand()%8)*1000); - events.RescheduleEvent(EVENT_OVERLOAD, 60000+ (rand()%65)*1000); - if(phase >= 2) - events.RescheduleEvent(EVENT_LIGHTNING_WHIRL, 20000+ (rand()%20)*1000); - if(phase >= 3) + events.RescheduleEvent(EVENT_CHAIN_LIGHTNING, urand(9000,17000)); + events.RescheduleEvent(EVENT_OVERLOAD, urand(60000,125000)); + if (phase >= 2) + events.RescheduleEvent(EVENT_LIGHTNING_WHIRL, urand(20000,40000)); + if (phase >= 3) { DoCast(m_creature, SPELL_STORMSHIELD); - events.RescheduleEvent(EVENT_LIGHTNING_TENDRILS, 40000+ (rand()%40)*1000); + events.RescheduleEvent(EVENT_LIGHTNING_TENDRILS, urand(40000,80000)); } - } void DamageTaken(Unit* pKiller, uint32 &damage) { - if(damage >= m_creature->GetHealth()) + if (damage >= m_creature->GetHealth()) { - if(Creature* Steelbreaker = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_STEELBREAKER) : 0)) - if(Steelbreaker->isAlive()) - { + if (Creature* Steelbreaker = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_STEELBREAKER) : 0)) + if (Steelbreaker->isAlive()) Steelbreaker->SetHealth(Steelbreaker->GetMaxHealth()); - } - if(Creature* Molgeim = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_RUNEMASTER_MOLGEIM) : 0)) - if(Molgeim->isAlive()) - { + if (Creature* Molgeim = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_RUNEMASTER_MOLGEIM) : 0)) + if (Molgeim->isAlive()) Molgeim->SetHealth(Molgeim->GetMaxHealth()); - } DoCast(SPELL_SUPERCHARGE); } @@ -450,16 +476,20 @@ struct boss_stormcaller_brundirAI : public ScriptedAI void JustDied(Unit* Killer) { - if(IsEncounterComplete(pInstance, m_creature) && pInstance) + DoScriptText(RAND(SAY_BRUNDIR_DEATH_1,SAY_BRUNDIR_DEATH_2), m_creature); + if (IsEncounterComplete(pInstance, m_creature) && pInstance) pInstance->SetData(TYPE_ASSEMBLY, DONE); } + void KilledUnit(Unit *who) + { + DoScriptText(RAND(SAY_BRUNDIR_SLAY_1,SAY_BRUNDIR_SLAY_2), m_creature); + } + void SpellHit(Unit *from, const SpellEntry *spell) { - if(spell->Id == SPELL_SUPERCHARGE) - { + if (spell->Id == SPELL_SUPERCHARGE) UpdatePhase(); - } } void UpdateAI(const uint32 diff) @@ -474,28 +504,27 @@ struct boss_stormcaller_brundirAI : public ScriptedAI switch(eventId) { case EVENT_ENRAGE: + DoScriptText(SAY_BRUNDIR_BERSERK, m_creature); DoCast(SPELL_BERSERK); - break; + break; case EVENT_CHAIN_LIGHTNING: - { - Unit* Target = SelectUnit(SELECT_TARGET_RANDOM,0); - DoCast(Target, RAID_MODE(SPELL_CHAIN_LIGHTNING_N , SPELL_CHAIN_LIGHTNING_H)); - events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 9000+ (rand()%8)*1000); - } - break; + if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0)) + DoCast(pTarget, RAID_MODE(SPELL_CHAIN_LIGHTNING_N , SPELL_CHAIN_LIGHTNING_H)); + events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, urand(9000,17000)); + break; case EVENT_OVERLOAD: DoCast(RAID_MODE(SPELL_OVERLOAD , SPELL_OVERLOAD_H)); - events.ScheduleEvent(EVENT_OVERLOAD, 60000+ (rand()%65)*1000); - break; + events.ScheduleEvent(EVENT_OVERLOAD, urand(60000,125000)); + break; case EVENT_LIGHTNING_WHIRL: DoCast(RAID_MODE(SPELL_LIGHTNING_WHIRL , SPELL_LIGHTNING_WHIRL_H)); - events.ScheduleEvent(EVENT_LIGHTNING_WHIRL, 20000+ (rand()%20)*1000); - break; + events.ScheduleEvent(EVENT_LIGHTNING_WHIRL, urand(20000,40000)); + break; case EVENT_LIGHTNING_TENDRILS: DoCast(RAID_MODE(SPELL_LIGHTNING_TENDRILS, SPELL_LIGHTNING_TENDRILS_H)); events.DelayEvents(15000, 5000); DoResetThreat(); - break; + break; } } diff --git a/src/scripts/northrend/ulduar/ulduar/boss_auriaya.cpp b/src/scripts/northrend/ulduar/ulduar/boss_auriaya.cpp index 70109eeef03..c9103d3b82d 100644 --- a/src/scripts/northrend/ulduar/ulduar/boss_auriaya.cpp +++ b/src/scripts/northrend/ulduar/ulduar/boss_auriaya.cpp @@ -24,44 +24,47 @@ #define SPELL_SETINEL_BLAST 64679 #define SPELL_SONIC_SCREECH 64422 #define SPELL_SUMMON_SWARMING_GUARDIAN 64397 -//wrong text ids. correct are beetwen -1000000 AND -1999999 -//beetwen -2000000 and -2999999 are custom texts so wtf? -#define SAY_AGGRO -2615016 -#define SAY_SLAY_1 -2615017 + +enum Yells +{ + SAY_AGGRO = -1603050, + SAY_SLAY_1 = -1603051, + SAY_SLAY_2 = -1603052, + SAY_DEATH = -1603053, + SAY_BERSERK = -1603054, +}; struct boss_auriaya_AI : public BossAI { boss_auriaya_AI(Creature *pCreature) : BossAI(pCreature, TYPE_AURIAYA) { - m_pInstance = pCreature->GetInstanceData(); } - ScriptedInstance* m_pInstance; - uint32 TERRIFYING_SCREECH_Timer; uint32 SONIC_SCREECH_Timer; void Reset() { + _Reset(); TERRIFYING_SCREECH_Timer = 180000; SONIC_SCREECH_Timer = 30000; } void EnterCombat(Unit* who) { + _EnterCombat(); DoScriptText(SAY_AGGRO,m_creature); } + void KilledUnit(Unit* victim) { - DoScriptText(SAY_SLAY_1, m_creature); + DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), m_creature); } void JustDied(Unit *victim) { - DoScriptText(SAY_SLAY_1, m_creature); - - if (m_pInstance) - m_pInstance->SetData(TYPE_AURIAYA, DONE); + DoScriptText(SAY_DEATH, m_creature); + _JustDied(); } void MoveInLineOfSight(Unit* who) {} @@ -74,7 +77,6 @@ struct boss_auriaya_AI : public BossAI if (TERRIFYING_SCREECH_Timer <= diff) { DoCast(SPELL_TERRIFYING_SCREECH); - DoScriptText(SAY_SLAY_1, m_creature); TERRIFYING_SCREECH_Timer = 180000; } else TERRIFYING_SCREECH_Timer -= diff; @@ -92,6 +94,7 @@ CreatureAI* GetAI_boss_auriaya(Creature* pCreature) { return new boss_auriaya_AI (pCreature); } + void AddSC_boss_auriaya() { Script *newscript; diff --git a/src/scripts/northrend/ulduar/ulduar/boss_flame_leviathan.cpp b/src/scripts/northrend/ulduar/ulduar/boss_flame_leviathan.cpp index dd28fb5ff41..b167156f2d9 100644 --- a/src/scripts/northrend/ulduar/ulduar/boss_flame_leviathan.cpp +++ b/src/scripts/northrend/ulduar/ulduar/boss_flame_leviathan.cpp @@ -20,40 +20,38 @@ #include "ulduar.h" #include "Vehicle.h" -#define SPELL_PURSUED 62374 -#define SPELL_GATHERING_SPEED 62375 -#define SPELL_BATTERING_RAM 62376 -#define SPELL_FLAME_VENTS 62396 -#define SPELL_MISSILE_BARRAGE 62400 -#define SPELL_SYSTEMS_SHUTDOWN 62475 - -#define SPELL_FLAME_CANNON 62395 -//#define SPELL_FLAME_CANNON 64692 trigger the same spell - -#define SPELL_OVERLOAD_CIRCUIT 62399 - -#define SPELL_SEARING_FLAME 62402 - -#define SPELL_BLAZE 62292 - -#define SPELL_SMOKE_TRAIL 63575 - -#define SPELL_MIMIRON_INFERNO 62910 - -#define SPELL_HODIR_FURY 62297 - -#define SPELL_ELECTROSHOCK 62522 +enum Spells +{ + SPELL_PURSUED = 62374, + SPELL_GATHERING_SPEED = 62375, + SPELL_BATTERING_RAM = 62376, + SPELL_FLAME_VENTS = 62396, + SPELL_MISSILE_BARRAGE = 62400, + SPELL_SYSTEMS_SHUTDOWN = 62475, + + SPELL_FLAME_CANNON = 62395, +// SPELL_FLAME_CANNON = 64692, trigger the same spell + + SPELL_OVERLOAD_CIRCUIT = 62399, + SPELL_SEARING_FLAME = 62402, + SPELL_BLAZE = 62292, + SPELL_SMOKE_TRAIL = 63575, + SPELL_MIMIRON_INFERNO = 62910, + SPELL_HODIR_FURY = 62297, + SPELL_ELECTROSHOCK = 62522, +}; -enum Mobs +enum Creatures { - MOB_MECHANOLIFT = 33214, - MOB_LIQUID = 33189, - MOB_CONTAINER = 33218, + MOB_MECHANOLIFT = 33214, + MOB_LIQUID = 33189, + MOB_CONTAINER = 33218, }; enum Events { - EVENT_PURSUE = 1, + EVENT_NONE, + EVENT_PURSUE, EVENT_MISSILE, EVENT_VENT, EVENT_SPEED, @@ -64,41 +62,59 @@ enum Events enum Seats { - SEAT_PLAYER = 0, - SEAT_TURRET = 1, - SEAT_DEVICE = 2, + SEAT_PLAYER = 0, + SEAT_TURRET = 1, + SEAT_DEVICE = 2, +}; + +enum Yells +{ + SAY_AGGRO = -1603060, + SAY_SLAY = -1603061, + SAY_DEATH = -1603062, + SAY_TARGET_1 = -1603063, + SAY_TARGET_2 = -1603064, + SAY_TARGET_3 = -1603065, + SAY_HARDMODE = -1603066, + SAY_TOWER_NONE = -1603067, + SAY_TOWER_FROST = -1603068, + SAY_TOWER_FLAME = -1603069, + SAY_TOWER_NATURE = -1603070, + SAY_TOWER_STORM = -1603071, + SAY_PLAYER_RIDING = -1603072, + SAY_OVERLOAD_1 = -1603073, + SAY_OVERLOAD_2 = -1603074, + SAY_OVERLOAD_3 = -1603075, }; struct boss_flame_leviathanAI : public BossAI { - boss_flame_leviathanAI(Creature *pCreature) : BossAI(pCreature, TYPE_LEVIATHAN), vehicle(me->GetVehicleKit()) + boss_flame_leviathanAI(Creature *pCreature) : BossAI(pCreature, TYPE_LEVIATHAN), vehicle(pCreature->GetVehicleKit()) { - m_pInstance = pCreature->GetInstanceData(); assert(vehicle); } - ScriptedInstance* m_pInstance; - Vehicle *vehicle; void Reset() { _Reset(); - me->SetReactState(REACT_AGGRESSIVE); + m_creature->SetReactState(REACT_AGGRESSIVE); } void EnterCombat(Unit *who) { _EnterCombat(); - me->SetReactState(REACT_DEFENSIVE); + DoScriptText(SAY_AGGRO, m_creature); + m_creature->SetReactState(REACT_DEFENSIVE); events.ScheduleEvent(EVENT_PURSUE, 0); events.ScheduleEvent(EVENT_MISSILE, 1500); events.ScheduleEvent(EVENT_VENT, 20000); events.ScheduleEvent(EVENT_SPEED, 15000); events.ScheduleEvent(EVENT_SUMMON, 0); - //events.ScheduleEvent(EVENT_MIMIRON_INFERNO, 60000 + (rand()%60000)); // Not Blizzlike - //events.ScheduleEvent(EVENT_HODIR_FURY, 60000 + (rand()%60000)); // Not Blizzlike - if (Creature *turret = CAST_CRE(vehicle->GetPassenger(7))) + //events.ScheduleEvent(EVENT_MIMIRON_INFERNO, urand(60000, 120000)); // Not Blizzlike + //events.ScheduleEvent(EVENT_HODIR_FURY, urand(60000, 120000)); // Not Blizzlike + if (Creature *turret = CAST_CRE(vehicle->GetPassenger(SEAT_TURRET))) turret->AI()->DoZoneInCombat(); } @@ -111,8 +127,8 @@ struct boss_flame_leviathanAI : public BossAI void JustDied(Unit *victim) { - if (m_pInstance) - m_pInstance->SetData(TYPE_LEVIATHAN, DONE); + DoScriptText(SAY_DEATH, m_creature); + _JustDied(); } void SpellHit(Unit *caster, const SpellEntry *spell) @@ -120,15 +136,15 @@ struct boss_flame_leviathanAI : public BossAI if(spell->Id == 62472) vehicle->InstallAllAccessories(); else if(spell->Id == SPELL_ELECTROSHOCK) - me->InterruptSpell(CURRENT_CHANNELED_SPELL); + m_creature->InterruptSpell(CURRENT_CHANNELED_SPELL); } void UpdateAI(const uint32 diff) { - if (!me->isInCombat()) + if (!m_creature->isInCombat()) return; - if (me->getThreatManager().isThreatListEmpty()) + if (m_creature->getThreatManager().isThreatListEmpty()) { EnterEvadeMode(); return; @@ -136,11 +152,11 @@ struct boss_flame_leviathanAI : public BossAI events.Update(diff); - if (me->hasUnitState(UNIT_STAT_CASTING)) + if (m_creature->hasUnitState(UNIT_STAT_CASTING)) return; uint32 eventId = events.GetEvent(); - if (!me->getVictim()) + if (!m_creature->getVictim()) eventId = EVENT_PURSUE; switch(eventId) @@ -150,13 +166,12 @@ struct boss_flame_leviathanAI : public BossAI DoCastAOE(SPELL_PURSUED, true); //events.RepeatEvent(35000); // this should not be used because eventId may be overriden events.RescheduleEvent(EVENT_PURSUE, 35000); - if(!me->getVictim()) // all siege engines and demolishers are dead + if(!m_creature->getVictim()) // all siege engines and demolishers are dead UpdateVictim(); // begin to kill other things return; case EVENT_MISSILE: - //TODO: without target no visual effect - //DoCastAOE(SPELL_MISSILE_BARRAGE); - DoCast(me->getVictim(), SPELL_MISSILE_BARRAGE); + if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM)) + DoCast(pTarget, SPELL_MISSILE_BARRAGE); events.RepeatEvent(1500); return; case EVENT_VENT: @@ -169,17 +184,18 @@ struct boss_flame_leviathanAI : public BossAI return; case EVENT_SUMMON: if(summons.size() < 15) // 4seat+1turret+10lift - if(Creature *lift = DoSummonFlyer(MOB_MECHANOLIFT, me, rand()%20 + 20, 50, 0)) + if(Creature *lift = DoSummonFlyer(MOB_MECHANOLIFT, me, urand(20,40), 50, 0)) lift->GetMotionMaster()->MoveRandom(100); events.RepeatEvent(2000); return; case EVENT_MIMIRON_INFERNO: // Not Blizzlike - DoCast(me->getVictim(), SPELL_MIMIRON_INFERNO); - events.RepeatEvent(60000 + (rand()%60000)); + DoCast(m_creature->getVictim(), SPELL_MIMIRON_INFERNO); + events.RepeatEvent(urand(60000, 120000)); return; case EVENT_HODIR_FURY: // Not Blizzlike - DoCast(me->getVictim(), SPELL_HODIR_FURY); - events.RepeatEvent(60000 + (rand()%60000)); + DoCast(m_creature->getVictim(), SPELL_HODIR_FURY); + events.RepeatEvent(urand(60000, 120000)); + return; default: events.PopEvent(); break; @@ -197,7 +213,7 @@ struct boss_flame_leviathan_seatAI : public PassiveAI { assert(vehicle); #ifdef BOSS_DEBUG - me->SetReactState(REACT_AGGRESSIVE); + m_creature->SetReactState(REACT_AGGRESSIVE); #endif } @@ -214,17 +230,17 @@ struct boss_flame_leviathan_seatAI : public PassiveAI void PassengerBoarded(Unit *who, int8 seatId, bool apply) { - if(!me->GetVehicle()) + if (!m_creature->GetVehicle()) return; - if(seatId == SEAT_PLAYER) + if (seatId == SEAT_PLAYER) { if(!apply) return; if(Creature *turret = CAST_CRE(vehicle->GetPassenger(SEAT_TURRET))) { - turret->setFaction(me->GetVehicleBase()->getFaction()); + turret->setFaction(m_creature->GetVehicleBase()->getFaction()); turret->SetUInt32Value(UNIT_FIELD_FLAGS, 0); // unselectable turret->AI()->AttackStart(who); } @@ -234,12 +250,12 @@ struct boss_flame_leviathan_seatAI : public PassiveAI device->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } } - else if(seatId == SEAT_TURRET) + else if (seatId == SEAT_TURRET) { - if(apply) + if (apply) return; - if(Unit *device = vehicle->GetPassenger(SEAT_DEVICE)) + if (Unit *device = vehicle->GetPassenger(SEAT_DEVICE)) { device->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); device->SetUInt32Value(UNIT_FIELD_FLAGS, 0); // unselectable @@ -254,7 +270,7 @@ struct boss_flame_leviathan_defense_turretAI : public TurretAI void DamageTaken(Unit *who, uint32 &damage) { - if(!CanAIAttack(who)) + if (!CanAIAttack(who)) damage = 0; } @@ -274,15 +290,15 @@ struct boss_flame_leviathan_overload_deviceAI : public PassiveAI { if(param == EVENT_SPELLCLICK) { - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - if(me->GetVehicle()) + m_creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK); + m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + if(m_creature->GetVehicle()) { - if(Unit *player = me->GetVehicle()->GetPassenger(SEAT_PLAYER)) + if(Unit *player = m_creature->GetVehicle()->GetPassenger(SEAT_PLAYER)) { player->ExitVehicle(); - me->GetVehicleBase()->CastSpell(player, SPELL_SMOKE_TRAIL, true); - if(Unit *leviathan = me->GetVehicleBase()->GetVehicleBase()) + m_creature->GetVehicleBase()->CastSpell(player, SPELL_SMOKE_TRAIL, true); + if(Unit *leviathan = m_creature->GetVehicleBase()->GetVehicleBase()) player->GetMotionMaster()->MoveKnockbackFrom(leviathan->GetPositionX(), leviathan->GetPositionY(), 30, 30); } } @@ -296,18 +312,18 @@ struct boss_flame_leviathan_safety_containerAI : public PassiveAI void MovementInform(uint32 type, uint32 id) { - if(id == me->GetEntry()) + if(id == m_creature->GetEntry()) { if(Creature *liquid = DoSummon(MOB_LIQUID, me, 0)) liquid->CastSpell(liquid, 62494, true); - me->DisappearAndDie(); // this will relocate creature to sky + m_creature->DisappearAndDie(); // this will relocate creature to sky } } void UpdateAI(const uint32 diff) { - if(!me->GetVehicle() && me->isSummon() && me->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE) - me->GetMotionMaster()->MoveFall(409.8f, me->GetEntry()); + if(!m_creature->GetVehicle() && m_creature->isSummon() && m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE) + m_creature->GetMotionMaster()->MoveFall(409.8f, m_creature->GetEntry()); } }; @@ -315,7 +331,7 @@ struct spell_pool_of_tarAI : public TriggerAI { spell_pool_of_tarAI(Creature *c) : TriggerAI(c) { - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } void DamageTaken(Unit *who, uint32 &damage) @@ -325,8 +341,8 @@ struct spell_pool_of_tarAI : public TriggerAI void SpellHit(Unit* caster, const SpellEntry *spell) { - if(spell->SchoolMask & SPELL_SCHOOL_MASK_FIRE && !me->HasAura(SPELL_BLAZE)) - me->CastSpell(me, SPELL_BLAZE, true); + if(spell->SchoolMask & SPELL_SCHOOL_MASK_FIRE && !m_creature->HasAura(SPELL_BLAZE)) + m_creature->CastSpell(me, SPELL_BLAZE, true); } }; diff --git a/src/scripts/northrend/ulduar/ulduar/boss_freya.cpp b/src/scripts/northrend/ulduar/ulduar/boss_freya.cpp index e44cdffff66..9e5dcc1eb55 100644 --- a/src/scripts/northrend/ulduar/ulduar/boss_freya.cpp +++ b/src/scripts/northrend/ulduar/ulduar/boss_freya.cpp @@ -19,42 +19,64 @@ #include "ScriptedPch.h" #include "ulduar.h" -/* -#define SAY_AGGRO -1 -#define SAY_SLAY -1 -*/ +enum Yells +{ + SAY_AGGRO = -1603180, + SAY_AGGRO_WITH_ELDER = -1603181, + SAY_SLAY_1 = -1603182, + SAY_SLAY_2 = -1603183, + SAY_DEATH = -1603184, + SAY_BERSERK = -1603185, + SAY_SUMMON_CONSERVATOR = -1603186, + SAY_SUMMON_TRIO = -1603187, + SAY_SUMMON_LASHERS = -1603188, + SAY_YS_HELP = -1603189, + + // Elder Brightleaf + SAY_BRIGHTLEAF_AGGRO = -1603190, + SAY_BRIGHTLEAF_SLAY_1 = -1603191, + SAY_BRIGHTLEAF_SLAY_2 = -1603192, + SAY_BRIGHTLEAF_DEATH = -1603193, + + // Elder Ironbranch + SAY_IRONBRANCH_AGGRO = -1603194, + SAY_IRONBRANCH_SLAY_1 = -1603195, + SAY_IRONBRANCH_SLAY_2 = -1603196, + SAY_IRONBRANCH_DEATH = -1603197, + + // Elder Stonebark + SAY_STONEBARK_AGGRO = -1603198, + SAY_STONEBARK_SLAY_1 = -1603199, + SAY_STONEBARK_SLAY_2 = -1603200, + SAY_STONEBARK_DEATH = -1603201, +}; struct boss_freyaAI : public BossAI { boss_freyaAI(Creature* pCreature) : BossAI(pCreature, TYPE_FREYA) { - m_pInstance = pCreature->GetInstanceData(); - Reset(); } - ScriptedInstance* m_pInstance; - void Reset() { + _Reset(); } void KilledUnit(Unit *victim) { + DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), m_creature); } void JustDied(Unit *victim) { - if (m_pInstance) - m_pInstance->SetData(TYPE_FREYA, DONE); + DoScriptText(SAY_DEATH, m_creature); + _JustDied(); } - void Aggro(Unit* pWho) + void EnterCombat(Unit* pWho) { -// DoScriptText(SAY_AGGRO, m_creature); - m_creature->SetInCombatWithZone(); - - if (m_pInstance) - m_pInstance->SetData(TYPE_FREYA, IN_PROGRESS); + DoScriptText(SAY_AGGRO, m_creature); + _EnterCombat(); } void UpdateAI(const uint32 diff) diff --git a/src/scripts/northrend/ulduar/ulduar/boss_general_vezax.cpp b/src/scripts/northrend/ulduar/ulduar/boss_general_vezax.cpp index a9f1be65f2d..f84c638d3e3 100644 --- a/src/scripts/northrend/ulduar/ulduar/boss_general_vezax.cpp +++ b/src/scripts/northrend/ulduar/ulduar/boss_general_vezax.cpp @@ -18,3 +18,14 @@ #include "ScriptedPch.h" #include "ulduar.h" + +enum Yells +{ + SAY_AGGRO = -1603290, + SAY_SLAY_1 = -1603291, + SAY_SLAY_2 = -1603292, + SAY_KITE = -1603293, + SAY_DEATH = -1603294, + SAY_BERSERK = -1603295, + SAY_HARDMODE_ON = -1603296, +}; diff --git a/src/scripts/northrend/ulduar/ulduar/boss_hodir.cpp b/src/scripts/northrend/ulduar/ulduar/boss_hodir.cpp index 4bf9d4f3479..4feb2168f97 100644 --- a/src/scripts/northrend/ulduar/ulduar/boss_hodir.cpp +++ b/src/scripts/northrend/ulduar/ulduar/boss_hodir.cpp @@ -19,42 +19,45 @@ #include "ScriptedPch.h" #include "ulduar.h" -/* -#define SAY_AGGRO -1 -#define SAY_SLAY -1 -*/ +enum Yells +{ + SAY_AGGRO = -1603210, + SAY_SLAY_1 = -1603211, + SAY_SLAY_2 = -1603212, + SAY_FLASH_FREEZE = -1603213, + SAY_STALACTITE = -1603214, + SAY_DEATH = -1603215, + SAY_BERSERK = -1603216, + SAY_YS_HELP = -1603217, + SAY_HARD_MODE_MISSED = -1603218, +}; struct boss_hodirAI : public BossAI { boss_hodirAI(Creature *pCreature) : BossAI(pCreature, TYPE_HODIR) { - m_pInstance = pCreature->GetInstanceData(); - Reset(); } - ScriptedInstance* m_pInstance; - void Reset() { + _Reset(); } void KilledUnit(Unit *victim) { + DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), m_creature); } void JustDied(Unit *victim) { - if (m_pInstance) - m_pInstance->SetData(TYPE_HODIR, DONE); + DoScriptText(SAY_DEATH, m_creature); + _JustDied(); } - void Aggro(Unit* pWho) + void EnterCombat(Unit* pWho) { -// DoScriptText(SAY_AGGRO, m_creature); - m_creature->SetInCombatWithZone(); - - if (m_pInstance) - m_pInstance->SetData(TYPE_HODIR, IN_PROGRESS); + DoScriptText(SAY_AGGRO, m_creature); + _EnterCombat(); } void UpdateAI(const uint32 diff) @@ -67,9 +70,7 @@ struct boss_hodirAI : public BossAI DoMeleeAttackIfReady(); EnterEvadeIfOutOfCombatArea(diff); - } - }; CreatureAI* GetAI_boss_hodir(Creature* pCreature) @@ -86,4 +87,3 @@ void AddSC_boss_hodir() newscript->RegisterSelf(); } - diff --git a/src/scripts/northrend/ulduar/ulduar/boss_ignis.cpp b/src/scripts/northrend/ulduar/ulduar/boss_ignis.cpp index 80c81e40616..3e51b7d39cc 100644 --- a/src/scripts/northrend/ulduar/ulduar/boss_ignis.cpp +++ b/src/scripts/northrend/ulduar/ulduar/boss_ignis.cpp @@ -23,37 +23,50 @@ #define SPELL_SCORCH 62546 #define SPELL_SLAG_POT 62717 -//wrong ids. not in db -#define SAY_AGGRO -10000002 -#define SAY_SLAY -1000003 +enum Yells +{ + SAY_AGGRO = -1603220, + SAY_SLAY_1 = -1603221, + SAY_SLAY_2 = -1603222, + SAY_DEATH = -1603223, + SAY_SUMMON = -1603224, + SAY_SLAG_POT = -1603225, + SAY_SCORCH_1 = -1603226, + SAY_SCORCH_2 = -1603227, + SAY_BERSERK = -1603228, +}; struct boss_ignis_AI : public BossAI { boss_ignis_AI(Creature *pCreature) : BossAI(pCreature, TYPE_IGNIS) {} - uint32 FLAME_JETS_Timer; - uint32 SCORCH_Timer; - uint32 SLAG_POT_Timer; + uint32 uiFlameJetsTimer; + uint32 uiScorchTimer; + uint32 uiSlagPotTimer; void Reset() { - FLAME_JETS_Timer = 32000; - SCORCH_Timer = 100; - SLAG_POT_Timer = 100; + _Reset(); + uiFlameJetsTimer = 32000; + uiScorchTimer = 100; + uiSlagPotTimer = 100; } void EnterCombat(Unit* who) { DoScriptText(SAY_AGGRO,m_creature); + _EnterCombat(); } + void KilledUnit(Unit* victim) { - DoScriptText(SAY_SLAY, m_creature); + DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), m_creature); } void JustDied(Unit *victim) { - DoScriptText(SAY_SLAY, m_creature); + DoScriptText(SAY_DEATH, m_creature); + _JustDied(); } void MoveInLineOfSight(Unit* who) {} @@ -63,7 +76,7 @@ struct boss_ignis_AI : public BossAI if (!UpdateVictim()) return; - if(m_creature->GetPositionY() < 150 || m_creature->GetPositionX() < 450) // Not Blizzlike, anti-exploit to prevent players from pulling bosses to vehicles. + if (m_creature->GetPositionY() < 150 || m_creature->GetPositionX() < 450) // Not Blizzlike, anti-exploit to prevent players from pulling bosses to vehicles. { m_creature->RemoveAllAuras(); m_creature->DeleteThreatList(); @@ -71,26 +84,28 @@ struct boss_ignis_AI : public BossAI m_creature->GetMotionMaster()->MoveTargetedHome(); } - if (FLAME_JETS_Timer <= diff) + if (uiFlameJetsTimer <= diff) { DoCast(SPELL_FLAME_JETS); - DoScriptText(SAY_SLAY, m_creature); - FLAME_JETS_Timer = 25000; - } else FLAME_JETS_Timer -= diff; + uiFlameJetsTimer = 25000; + } else uiFlameJetsTimer -= diff; - if (SCORCH_Timer <= diff) + if (uiScorchTimer <= diff) { + DoScriptText(RAND(SAY_SCORCH_1,SAY_SCORCH_2), m_creature); DoCast(SPELL_SCORCH); - SCORCH_Timer = 20000; - } else SCORCH_Timer -= diff; + uiScorchTimer = 20000; + } else uiScorchTimer -= diff; - if (SLAG_POT_Timer <= diff) + if (uiSlagPotTimer <= diff) { if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + { + DoScriptText(SAY_SLAG_POT, m_creature); DoCast(pTarget, SPELL_SLAG_POT); - DoScriptText(SAY_SLAY, m_creature); - SLAG_POT_Timer = 30000; - } else SLAG_POT_Timer -= diff; + } + uiSlagPotTimer = 30000; + } else uiSlagPotTimer -= diff; DoMeleeAttackIfReady(); } diff --git a/src/scripts/northrend/ulduar/ulduar/boss_kologarn.cpp b/src/scripts/northrend/ulduar/ulduar/boss_kologarn.cpp index ab07e5c1327..d78916564e7 100644 --- a/src/scripts/northrend/ulduar/ulduar/boss_kologarn.cpp +++ b/src/scripts/northrend/ulduar/ulduar/boss_kologarn.cpp @@ -37,19 +37,29 @@ enum Events EVENT_SWEEP, }; +enum Yells +{ + SAY_AGGRO = -1603230, + SAY_SLAY_1 = -1603231, + SAY_SLAY_2 = -1603232, + SAY_LEFT_ARM_GONE = -1603233, + SAY_RIGHT_ARM_GONE = -1603234, + SAY_SHOCKWAVE = -1603235, + SAY_GRAB_PLAYER = -1603236, + SAY_DEATH = -1603237, + SAY_BERSERK = -1603238, +}; + struct boss_kologarnAI : public BossAI { - boss_kologarnAI(Creature *pCreature) : BossAI(pCreature, TYPE_KOLOGARN), vehicle(me->GetVehicleKit()), + boss_kologarnAI(Creature *pCreature) : BossAI(pCreature, TYPE_KOLOGARN), vehicle(pCreature->GetVehicleKit()), left(false), right(false) { - m_pInstance = me->GetInstanceData(); assert(vehicle); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); // i think this is a hack, but there is no other way to disable his rotation } - ScriptedInstance* m_pInstance; - Vehicle *vehicle; bool left, right; @@ -60,17 +70,22 @@ struct boss_kologarnAI : public BossAI void JustDied(Unit *victim) { - if (m_pInstance) - m_pInstance->SetData(TYPE_KOLOGARN, DONE); + DoScriptText(SAY_DEATH, m_creature); + _JustDied(); + } + + void KilledUnit(Unit* who) + { + DoScriptText(RAND(SAY_SLAY_2,SAY_SLAY_2), m_creature); } void PassengerBoarded(Unit *who, int8 seatId, bool apply) { - if(who->GetTypeId() == TYPEID_UNIT) + if (who->GetTypeId() == TYPEID_UNIT) { - if(who->GetEntry() == 32933) + if (who->GetEntry() == 32933) left = apply; - else if(who->GetEntry() == 32934) + else if (who->GetEntry() == 32934) right = apply; who->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); CAST_CRE(who)->SetReactState(REACT_PASSIVE); @@ -79,6 +94,7 @@ struct boss_kologarnAI : public BossAI void EnterCombat(Unit *who) { + DoScriptText(SAY_AGGRO, m_creature); _EnterCombat(); events.ScheduleEvent(EVENT_SMASH, 5000); events.ScheduleEvent(EVENT_SWEEP, 10000); @@ -87,18 +103,19 @@ struct boss_kologarnAI : public BossAI void UpdateAI(const uint32 diff) { - if(!UpdateVictim()) + if (!UpdateVictim()) return; events.Update(diff); - if(me->hasUnitState(UNIT_STAT_CASTING)) + if (me->hasUnitState(UNIT_STAT_CASTING)) return; // TODO: because we are using hack, he is stunned and cannot cast, so we use triggered for every spell switch(events.GetEvent()) { - case EVENT_NONE: break; + case EVENT_NONE: + break; case EVENT_SMASH: if(left && right) DoCastVictim(SPELL_TWO_ARM_SMASH, true); diff --git a/src/scripts/northrend/ulduar/ulduar/boss_mimiron.cpp b/src/scripts/northrend/ulduar/ulduar/boss_mimiron.cpp index a9f1be65f2d..2b9994d5d9b 100644 --- a/src/scripts/northrend/ulduar/ulduar/boss_mimiron.cpp +++ b/src/scripts/northrend/ulduar/ulduar/boss_mimiron.cpp @@ -18,3 +18,27 @@ #include "ScriptedPch.h" #include "ulduar.h" + +enum Yells +{ + SAY_AGGRO = -1603240, + SAY_HARDMODE_ON = -1603241, + SAY_MKII_ACTIVATE = -1603242, + SAY_MKII_SLAY_1 = -1603243, + SAY_MKII_SLAY_2 = -1603244, + SAY_MKII_DEATH = -1603245, + SAY_VX001_ACTIVATE = -1603246, + SAY_VX001_SLAY_1 = -1603247, + SAY_VX001_SLAY_2 = -1603248, + SAY_VX001_DEATH = -1603249, + SAY_AERIAL_ACTIVATE = -1603250, + SAY_AERIAL_SLAY_1 = -1603251, + SAY_AERIAL_SLAY_2 = -1603252, + SAY_AERIAL_DEATH = -1603253, + SAY_V07TRON_ACTIVATE = -1603254, + SAY_V07TRON_SLAY_1 = -1603255, + SAY_V07TRON_SLAY_2 = -1603256, + SAY_V07TRON_DEATH = -1603257, + SAY_BERSERK = -1603258, + SAY_YS_HELP = -1603259, +}; diff --git a/src/scripts/northrend/ulduar/ulduar/boss_thorim.cpp b/src/scripts/northrend/ulduar/ulduar/boss_thorim.cpp index c81c9308b9f..40112eb3a3d 100644 --- a/src/scripts/northrend/ulduar/ulduar/boss_thorim.cpp +++ b/src/scripts/northrend/ulduar/ulduar/boss_thorim.cpp @@ -19,42 +19,60 @@ #include "ScriptedPch.h" #include "ulduar.h" -/* -#define SAY_AGGRO -1 -#define SAY_SLAY -1 -*/ +enum Yells +{ + SAY_AGGRO_1 = -1603270, + SAY_AGGRO_2 = -1603271, + SAY_SPECIAL_1 = -1603272, + SAY_SPECIAL_2 = -1603273, + SAY_SPECIAL_3 = -1603274, + SAY_JUMPDOWN = -1603275, + SAY_SLAY_1 = -1603276, + SAY_SLAY_2 = -1603277, + SAY_BERSERK = -1603278, + SAY_WIPE = -1603279, + SAY_DEATH = -1603280, + SAY_END_NORMAL_1 = -1603281, + SAY_END_NORMAL_2 = -1603282, + SAY_END_NORMAL_3 = -1603283, + SAY_END_HARD_1 = -1603284, + SAY_END_HARD_2 = -1603285, + SAY_END_HARD_3 = -1603286, + SAY_YS_HELP = -1603287, +}; struct boss_thorimAI : public BossAI { boss_thorimAI(Creature* pCreature) : BossAI(pCreature, TYPE_THORIM) { - m_pInstance = pCreature->GetInstanceData(); - Reset(); } - ScriptedInstance* m_pInstance; - void Reset() { + _Reset(); + } + + void EnterEvadeMode() + { + DoScriptText(SAY_WIPE, m_creature); + _EnterEvadeMode(); } void KilledUnit(Unit *victim) { + DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), m_creature); } void JustDied(Unit *victim) { - if (m_pInstance) - m_pInstance->SetData(TYPE_THORIM, DONE); + DoScriptText(SAY_DEATH, m_creature); + _JustDied(); } - void Aggro(Unit* pWho) + void EnterCombat(Unit* pWho) { -// DoScriptText(SAY_AGGRO, m_creature); - m_creature->SetInCombatWithZone(); - - if (m_pInstance) - m_pInstance->SetData(TYPE_THORIM, IN_PROGRESS); + DoScriptText(RAND(SAY_AGGRO_1,SAY_AGGRO_2), m_creature); + _EnterCombat(); } void UpdateAI(const uint32 diff) @@ -67,9 +85,7 @@ struct boss_thorimAI : public BossAI DoMeleeAttackIfReady(); EnterEvadeIfOutOfCombatArea(diff); - } - }; CreatureAI* GetAI_boss_thorim(Creature* pCreature) @@ -84,5 +100,4 @@ void AddSC_boss_thorim() newscript->Name = "boss_thorim"; newscript->GetAI = &GetAI_boss_thorim; newscript->RegisterSelf(); - } diff --git a/src/scripts/northrend/ulduar/ulduar/boss_xt002.cpp b/src/scripts/northrend/ulduar/ulduar/boss_xt002.cpp index 82913a5ea2c..9d2c9f8d6fb 100644 --- a/src/scripts/northrend/ulduar/ulduar/boss_xt002.cpp +++ b/src/scripts/northrend/ulduar/ulduar/boss_xt002.cpp @@ -16,86 +16,788 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/* + TODO: + Add achievments + Boombot explosion only hurt allies to the npc at the moment + Boombot explosion visual + Test the enrage timer + Fix gravity bomb - tractor beam. + Fix void zone spell + If the boss is to close to a scrap pile -> no summon + make the life sparks visible... +*/ + #include "ScriptedPch.h" #include "ulduar.h" -#define SPELL_SEARING_LIGHT 63018 -#define SPELL_SONIC_BOOM 38897 +enum Spells +{ + SPELL_TYMPANIC_TANTRUM = 62776, + SPELL_SEARING_LIGHT_10 = 63018, + SPELL_SEARING_LIGHT_25 = 65121, + + SPELL_GRAVITY_BOMB_10 = 63024, + SPELL_GRAVITY_BOMB_25 = 63234, + SPELL_GRAVITY_BOMB_AURA_10 = 63025, + SPELL_GRAVITY_BOMB_AURA_25 = 63233, + + SPELL_HEARTBREAK_10 = 65737, + SPELL_HEARTBREAK_25 = 64193, + + SPELL_ENRAGE = 26662, + + //------------------VOID ZONE-------------------- + SPELL_VOID_ZONE_10 = 64203, + SPELL_VOID_ZONE_25 = 64235, + + // Life Spark + SPELL_STATIC_CHARGED_10 = 64227, + SPELL_STATIC_CHARGED_25 = 64236, + SPELL_SHOCK = 64230, + + //----------------XT-002 HEART------------------- + SPELL_EXPOSED_HEART = 63849, + + //---------------XM-024 PUMMELLER---------------- + SPELL_ARCING_SMASH = 8374, + SPELL_TRAMPLE = 5568, + SPELL_UPPERCUT = 10966, + + //------------------BOOMBOT----------------------- + SPELL_BOOM = 62834, +}; + +enum Timers +{ + TIMER_TYMPANIC_TANTRUM_MIN = 32000, + TIMER_TYMPANIC_TANTRUM_MAX = 36000, + TIMER_SEARING_LIGHT = 20000, + TIMER_SPAWN_LIFE_SPARK = 9000, + TIMER_GRAVITY_BOMB = 20000, + TIMER_HEART_PHASE = 30000, + TIMER_ENRAGE = 600000, + TIMER_GRAVITY_BOMB_AURA = 8900, + + TIMER_VOID_ZONE = 3000, + + // Life Spark + TIMER_SHOCK = 12000, + + // Pummeller + // Timers may be off + TIMER_ARCING_SMASH = 27000, + TIMER_TRAMPLE = 22000, + TIMER_UPPERCUT = 17000, + + TIMER_SPAWN_ADD = 12000, +}; + +enum Creatures +{ + NPC_VOID_ZONE = 34001, + NPC_LIFE_SPARK = 34004, + NPC_XT002_HEART = 33329, + NPC_XS013_SCRAPBOT = 33343, + NPC_XM024_PUMMELLER = 33344, + NPC_XE321_BOOMBOT = 33346, +}; + +enum Actions +{ + ACTION_ENTER_HARD_MODE = 0, +}; + +enum XT002Data +{ + DATA_TRANSFERED_HEALTH = 0, +}; + +enum Yells +{ + SAY_AGGRO = -1603300, + SAY_HEART_OPENED = -1603301, + SAY_HEART_CLOSED = -1603302, + SAY_TYMPANIC_TANTRUM = -1603303, + SAY_SLAY_1 = -1603304, + SAY_SLAY_2 = -1603305, + SAY_BERSERK = -1603306, + SAY_DEATH = -1603307, + SAY_SUMMON = -1603308, +}; + +//#define GRAVITY_BOMB_DMG_MIN_10 11700 +//#define GRAVITY_BOMB_DMG_MAX_10 12300 +//#define GRAVITY_BOMB_DMG_MIN_25 14625 +//#define GRAVITY_BOMB_DMG_MAX_25 15375 +//#define GRAVITY_BOMB_RADIUS 12 + +//#define VOID_ZONE_DMG_10 5000 +//#define VOID_ZONE_DMG_25 7500 +//#define VOID_ZONE_RADIUS -#define SAY_AGGRO -1000000 -#define SAY_SLAY -1000001 +/************************************************ +-----------------SPAWN LOCATIONS----------------- +************************************************/ +//Shared Z-level +#define SPAWN_Z 412 +//Lower right +#define LR_X 796 +#define LR_Y -94 +//Lower left +#define LL_X 796 +#define LL_Y 57 +//Upper right +#define UR_X 890 +#define UR_Y -82 +//Upper left +#define UL_X 894 +#define UL_Y 62 + +/*------------------------------------------------------- + * + * XT-002 DECONSTRUCTOR + * + *///---------------------------------------------------- struct boss_xt002_AI : public BossAI { boss_xt002_AI(Creature *pCreature) : BossAI(pCreature, TYPE_XT002) { - m_pInstance = pCreature->GetInstanceData(); } - ScriptedInstance* m_pInstance; + uint32 uiSearingLightTimer; + uint32 uiSpawnLifeSparkTimer; + uint32 uiGravityBombTimer; + uint32 uiGravityBombAuraTimer; + uint32 uiTympanicTantrumTimer; + uint32 uiHeartPhaseTimer; + uint32 uiSpawnAddTimer; + uint32 uiEnrageTimer; + + bool searing_light_active; + uint64 uiSearingLightTarget; - uint32 SEARING_LIGHT_Timer; - uint32 SONIC_BOOM_Timer; + bool gravity_bomb_active; + uint64 uiGravityBombTarget; + + uint8 phase; + uint8 heart_exposed; + bool enraged; + + uint32 transferHealth; + bool enterHardMode; + bool hardMode; void Reset() { - SEARING_LIGHT_Timer = 100; - SONIC_BOOM_Timer = 20; + m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NOT_SELECTABLE); + + //Makes XT-002 to cast a light bomb 10 seconds after aggro. + uiSearingLightTimer = TIMER_SEARING_LIGHT/2; + uiSpawnLifeSparkTimer = TIMER_SPAWN_LIFE_SPARK; + uiGravityBombTimer = TIMER_GRAVITY_BOMB; + uiGravityBombAuraTimer = TIMER_GRAVITY_BOMB_AURA; + uiHeartPhaseTimer = TIMER_HEART_PHASE; + uiSpawnAddTimer = TIMER_SPAWN_ADD; + uiEnrageTimer = TIMER_ENRAGE; + + //Tantrum is casted a bit slower the first time. + uiTympanicTantrumTimer = urand(TIMER_TYMPANIC_TANTRUM_MIN, TIMER_TYMPANIC_TANTRUM_MAX) * 2; + + searing_light_active = false; + gravity_bomb_active = false; + enraged = false; + hardMode = false; + enterHardMode = false; + + phase = 1; + heart_exposed = 0; } void EnterCombat(Unit* who) { - DoScriptText(SAY_AGGRO,m_creature); + DoScriptText(SAY_AGGRO, m_creature); + _EnterCombat(); } + + void DoAction(const int32 action) + { + switch (action) + { + case ACTION_ENTER_HARD_MODE: + if (!hardMode) + { + hardMode = true; + + // Enter hard mode + enterHardMode = true; + + // set max health + m_creature->SetHealth(m_creature->GetMaxHealth()); + + // Get his heartbreak buff + m_creature->CastSpell(m_creature, RAID_MODE(SPELL_HEARTBREAK_10, SPELL_HEARTBREAK_25), true); + } + break; + } + } + + void SetData(uint32 id, uint32 value) + { + switch(id) + { + case DATA_TRANSFERED_HEALTH: + transferHealth = value; + break; + } + } + void KilledUnit(Unit* victim) { - DoScriptText(SAY_SLAY, m_creature); + DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), m_creature); } void JustDied(Unit *victim) { - DoScriptText(SAY_SLAY, m_creature); + DoScriptText(SAY_DEATH, m_creature); + _JustDied(); + } + + void UpdateAI(const uint32 diff) + { + if (!UpdateVictim()) + return; + + if (enterHardMode) + { + SetPhaseOne(); + enterHardMode = false; + } + + // Handles spell casting. These spells only occur during phase 1 and hard mode + if (phase == 1 || hardMode) + { + if (uiSearingLightTimer <= diff) + { + if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) + { + DoCast(pTarget, RAID_MODE(SPELL_SEARING_LIGHT_10, SPELL_SEARING_LIGHT_25)); + uiSearingLightTarget = pTarget->GetGUID(); + } + uiSpawnLifeSparkTimer = TIMER_SPAWN_LIFE_SPARK; + if (hardMode) + searing_light_active = true; + uiSearingLightTimer = TIMER_SEARING_LIGHT; + } else uiSearingLightTimer -= diff; + + if (uiGravityBombTimer <= diff) + { + if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) + { + DoCast(pTarget, RAID_MODE(SPELL_GRAVITY_BOMB_10,SPELL_GRAVITY_BOMB_25)); + uiGravityBombTarget = pTarget->GetGUID(); + } + uiGravityBombTimer = TIMER_GRAVITY_BOMB; + gravity_bomb_active = true; + } else uiGravityBombTimer -= diff; + + if (uiTympanicTantrumTimer <= 0) + { + DoScriptText(SAY_TYMPANIC_TANTRUM, m_creature); + DoCast(SPELL_TYMPANIC_TANTRUM); + uiTympanicTantrumTimer = urand(TIMER_TYMPANIC_TANTRUM_MIN, TIMER_TYMPANIC_TANTRUM_MAX); + } else uiTympanicTantrumTimer -= diff; + } + + if (!hardMode) + { + if (phase == 1) + { + if (HealthBelowPct(75) && heart_exposed == 0) + { + exposeHeart(); + } + else if (HealthBelowPct(50) && heart_exposed == 1) + { + exposeHeart(); + } + else if (HealthBelowPct(25) && heart_exposed == 2) + { + exposeHeart(); + } + + DoMeleeAttackIfReady(); + } + else + { + //Stop moving + m_creature->StopMoving(); + + //Start summoning adds + if (uiSpawnAddTimer <= diff) + { + DoScriptText(SAY_SUMMON, m_creature); + + // Spawn Pummeller + switch (rand() % 4) + { + case 0: m_creature->SummonCreature(NPC_XM024_PUMMELLER, LR_X, LR_Y, SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break; + case 1: m_creature->SummonCreature(NPC_XM024_PUMMELLER, LL_X, LL_Y, SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break; + case 2: m_creature->SummonCreature(NPC_XM024_PUMMELLER, UR_X, UR_Y, SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break; + case 3: m_creature->SummonCreature(NPC_XM024_PUMMELLER, UL_X, UL_Y, SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break; + } + + // Spawn 5 Bombs + for (int8 n = 0; n < 5; n++) + { + //Some randomes are added so they wont spawn in a pile + switch(rand() % 4) + { + case 0: m_creature->SummonCreature(NPC_XS013_SCRAPBOT, irand(LR_X - 3, LR_X + 3), irand(LR_Y - 3, LR_Y + 3), SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break; + case 1: m_creature->SummonCreature(NPC_XS013_SCRAPBOT, irand(LL_X - 3, LL_X + 3), irand(LL_Y - 3, LL_Y + 3), SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break; + case 2: m_creature->SummonCreature(NPC_XS013_SCRAPBOT, irand(UR_X - 3, UR_X + 3), irand(UR_Y - 3, UR_Y + 3), SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break; + case 3: m_creature->SummonCreature(NPC_XS013_SCRAPBOT, irand(UL_X - 3, UL_X + 3), irand(UL_Y - 3, UL_Y + 3), SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break; + } + } + + //Spawn 5 Scrapbots + switch (rand() % 4) + { + case 0: m_creature->SummonCreature(NPC_XE321_BOOMBOT, LR_X, LR_Y, SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break; + case 1: m_creature->SummonCreature(NPC_XE321_BOOMBOT, LL_X, LL_Y, SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break; + case 2: m_creature->SummonCreature(NPC_XE321_BOOMBOT, UR_X, UR_Y, SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break; + case 3: m_creature->SummonCreature(NPC_XE321_BOOMBOT, UL_X, UL_Y, SPAWN_Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); break; + } + + uiSpawnAddTimer = TIMER_SPAWN_ADD; + } else uiSpawnAddTimer -= diff; + + // Is the phase over? + if (uiHeartPhaseTimer <= diff) + { + DoScriptText(SAY_HEART_CLOSED, m_creature); + SetPhaseOne(); + } + else + uiHeartPhaseTimer -= diff; + } + } + else + { + // Adding life sparks when searing light debuff runs out if hard mode + if (searing_light_active) + { + if (uiSpawnLifeSparkTimer <= diff) + { + if (Unit *pSearingLightTarget = m_creature->GetUnit(*m_creature, uiSearingLightTarget)) + pSearingLightTarget->SummonCreature(NPC_LIFE_SPARK, pSearingLightTarget->GetPositionX(), pSearingLightTarget->GetPositionY(), pSearingLightTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); + uiSpawnLifeSparkTimer = TIMER_SPAWN_LIFE_SPARK; + searing_light_active = false; + } else uiSpawnLifeSparkTimer -= diff; + } + + DoMeleeAttackIfReady(); + } + + if (gravity_bomb_active) + { + if (uiGravityBombAuraTimer <= diff) + { + if (Unit *pGravityBombTarget = m_creature->GetUnit(*m_creature, uiGravityBombTarget)) + { + pGravityBombTarget->RemoveAurasDueToSpell(RAID_MODE(SPELL_GRAVITY_BOMB_10,SPELL_GRAVITY_BOMB_25)); + if (hardMode) + { + //Remains spawned for 3 minutes + pGravityBombTarget->SummonCreature(NPC_VOID_ZONE, pGravityBombTarget->GetPositionX(), pGravityBombTarget->GetPositionY(), pGravityBombTarget->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 180000); + } + } + + gravity_bomb_active = false; + uiGravityBombAuraTimer = TIMER_GRAVITY_BOMB_AURA; + //gravityBomb(); + } else uiGravityBombAuraTimer -= diff; + } + + //Enrage stuff + if (!enraged) + if (uiEnrageTimer <= diff) + { + DoScriptText(SAY_BERSERK, m_creature); + DoCast(m_creature, SPELL_ENRAGE); + enraged = true; + } else uiEnrageTimer -= diff; + } + + void exposeHeart() + { + //Make untargetable + m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + + //Summon the heart npc + m_creature->SummonCreature(NPC_XT002_HEART, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ() + 7, 0, TEMPSUMMON_TIMED_DESPAWN, TIMER_HEART_PHASE); + + // Start "end of phase 2 timer" + uiHeartPhaseTimer = TIMER_HEART_PHASE; + + //Phase 2 has offically started + phase = 2; + heart_exposed++; + + //Reset the add spawning timer + uiSpawnAddTimer = TIMER_SPAWN_ADD; + + DoScriptText(SAY_HEART_OPENED, m_creature); + } + + void SetPhaseOne() + { + uiSearingLightTimer = TIMER_SEARING_LIGHT / 2; + uiGravityBombTimer = TIMER_GRAVITY_BOMB; + uiTympanicTantrumTimer = urand(TIMER_TYMPANIC_TANTRUM_MIN, TIMER_TYMPANIC_TANTRUM_MAX); + uiSpawnAddTimer = TIMER_SPAWN_ADD; + + if (!hardMode) + m_creature->ModifyHealth(-transferHealth); + + m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + phase = 1; + } + + // TODO: put in comment and kept for reference. The spell should be fixed properly in spell system, if necessary. + ////Have to do this the custom way since the original spell messes up player movement + //void gravityBomb() + //{ + // uint32 maxDamage = RAID_MODE(GRAVITY_BOMB_DMG_MAX_10, GRAVITY_BOMB_DMG_MAX_25); + // uint32 minDamage = RAID_MODE(GRAVITY_BOMB_DMG_MIN_10, GRAVITY_BOMB_DMG_MIN_25); + // uint16 range = GRAVITY_BOMB_RADIUS; + // Map* pMap = me->GetMap(); + // if (pMap && pMap->IsDungeon()) + // { + // Map::PlayerList const &PlayerList = pMap->GetPlayers(); + // for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + // { + // //If a player is within the range of the spell + // if (i->getSource() && i->getSource()->GetDistance2d(pGravityBombTarget) <= range) + // { + // //Deal damage to the victim + // int32 damage = urand(minDamage, maxDamage); + // i->getSource()->ModifyHealth(-damage); + // m_creature->SendSpellNonMeleeDamageLog(i->getSource(), SPELL_GRAVITY_BOMB_AURA_10, damage, SPELL_SCHOOL_MASK_SHADOW, 0, 0, false, 0); + + // //Replacing the tractor beam effect + // i->getSource()->JumpTo(pGravityBombTarget, 5); + // } + // } + // } + //} +}; + +CreatureAI* GetAI_boss_xt002(Creature* pCreature) +{ + return new boss_xt002_AI(pCreature); +} + +/*------------------------------------------------------- + * + * XT-002 HEART + * + *///---------------------------------------------------- +struct mob_xt002_heartAI : public ScriptedAI +{ + mob_xt002_heartAI(Creature* pCreature) : ScriptedAI(pCreature) + { + m_pInstance = pCreature->GetInstanceData(); + m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_STUNNED); + m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + DoCast(m_creature, SPELL_EXPOSED_HEART); + } + ScriptedInstance* m_pInstance; + + void JustDied(Unit *victim) + { if (m_pInstance) - m_pInstance->SetData(TYPE_XT002, DONE); + if (Creature* pXT002 = m_creature->GetCreature(*m_creature, m_pInstance->GetData64(TYPE_XT002))) + if (pXT002->AI()) + pXT002->AI()->DoAction(ACTION_ENTER_HARD_MODE); + + //removes the aura + m_creature->RemoveAurasDueToSpell(SPELL_EXPOSED_HEART); + } + + void DamageTaken(Unit *pDone, uint32 &damage) + { + if (Creature* pXT002 = m_creature->GetCreature(*m_creature, m_pInstance->GetData64(TYPE_XT002))) + if (pXT002->AI()) + { + uint32 health = m_creature->GetHealth(); + health -= damage; + if (health < 0) + health = 0; + + pXT002->AI()->SetData(DATA_TRANSFERED_HEALTH, m_creature->GetMaxHealth() - health); + } } +}; - void MoveInLineOfSight(Unit* who) {} +CreatureAI* GetAI_mob_xt002_heart(Creature* pCreature) +{ + return new mob_xt002_heartAI(pCreature); +} + +/*------------------------------------------------------- + * + * XS-013 SCRAPBOT + * + *///---------------------------------------------------- +struct mob_scrapbotAI : public ScriptedAI +{ + mob_scrapbotAI(Creature* pCreature) : ScriptedAI(pCreature) + { + m_pInstance = m_creature->GetInstanceData(); + } + + ScriptedInstance* m_pInstance; + + void Reset() + { + m_creature->SetReactState(REACT_PASSIVE); + + if (Creature* pXT002 = m_creature->GetCreature(*m_creature, m_pInstance->GetData64(TYPE_XT002))) + m_creature->GetMotionMaster()->MoveChase(pXT002); + } + + void UpdateAI(const uint32 diff) + { + if (Creature* pXT002 = m_creature->GetCreature(*m_creature, m_pInstance->GetData64(TYPE_XT002))) + { + if (m_creature->GetDistance2d(pXT002) <= 0.5) + { + // TODO Send raid message + + // Increase health with 1 percent + pXT002->ModifyHealth(pXT002->GetMaxHealth() * 0.01); + + // Despawns the scrapbot + m_creature->ForcedDespawn(); + } + } + } +}; + +CreatureAI* GetAI_mob_scrapbot(Creature* pCreature) +{ + return new mob_scrapbotAI(pCreature); +} + +/*------------------------------------------------------- + * + * XM-024 PUMMELLER + * + *///---------------------------------------------------- +struct mob_pummellerAI : public ScriptedAI +{ + mob_pummellerAI(Creature* pCreature) : ScriptedAI(pCreature) + { + m_pInstance = pCreature->GetInstanceData(); + } + + ScriptedInstance* m_pInstance; + int32 uiArcingSmashTimer; + int32 uiTrampleTimer; + int32 uiUppercutTimer; + + void Reset() + { + uiArcingSmashTimer = TIMER_ARCING_SMASH; + uiTrampleTimer = TIMER_TRAMPLE; + uiUppercutTimer = TIMER_UPPERCUT; + } void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; - - if(m_creature->GetPositionX() < 700) // Not Blizzlike, anti-exploit to prevent players from pulling bosses to vehicles. + + if (m_creature->IsWithinMeleeRange(m_creature->getVictim())) { - m_creature->RemoveAllAuras(); - m_creature->DeleteThreatList(); - m_creature->CombatStop(false); - m_creature->GetMotionMaster()->MoveTargetedHome(); + if (uiArcingSmashTimer <= diff) + { + DoCast(m_creature->getVictim(), SPELL_ARCING_SMASH); + uiArcingSmashTimer = TIMER_ARCING_SMASH; + } else uiArcingSmashTimer -= diff; + + if (uiTrampleTimer <= diff) + { + DoCast(m_creature->getVictim(), SPELL_TRAMPLE); + uiTrampleTimer = TIMER_TRAMPLE; + } else uiTrampleTimer -= diff; + + if (uiUppercutTimer <= diff) + { + DoCast(m_creature->getVictim(), SPELL_UPPERCUT); + uiUppercutTimer = TIMER_UPPERCUT; + } else uiUppercutTimer -= diff; } - if (SEARING_LIGHT_Timer <= diff) + DoMeleeAttackIfReady(); + } +}; + +CreatureAI* GetAI_mob_pummeller(Creature* pCreature) +{ + return new mob_pummellerAI(pCreature); +} + +/*------------------------------------------------------- + * + * XE-321 BOOMBOT + * + *///---------------------------------------------------- +struct mob_boombotAI : public ScriptedAI +{ + mob_boombotAI(Creature* pCreature) : ScriptedAI(pCreature) + { + m_pInstance = pCreature->GetInstanceData(); + } + + ScriptedInstance* m_pInstance; + + void Reset() + { + m_creature->SetReactState(REACT_PASSIVE); + + if (Creature* pXT002 = m_creature->GetCreature(*m_creature, m_pInstance->GetData64(TYPE_XT002))) + m_creature->GetMotionMaster()->MoveChase(pXT002); + } + + void JustDied(Unit *killer) + { + DoCast(SPELL_BOOM); + } + + void UpdateAI(const uint32 diff) + { + if (Creature* pXT002 = m_creature->GetCreature(*m_creature, m_pInstance->GetData64(TYPE_XT002))) { - DoCast(m_creature, SPELL_SEARING_LIGHT); - DoScriptText(SAY_SLAY, m_creature); - SEARING_LIGHT_Timer = 50000; - } else SEARING_LIGHT_Timer -= diff; + if (m_creature->GetDistance2d(pXT002) <= 0.5) + { + //Explosion + DoCast(m_creature, SPELL_BOOM); + + //Despawns the boombot + m_creature->ForcedDespawn(); + } + } + } +}; - if (SONIC_BOOM_Timer <= diff) +CreatureAI* GetAI_mob_boombot(Creature* pCreature) +{ + return new mob_boombotAI(pCreature); +} + +/*------------------------------------------------------- + * + * VOID ZONE + * + *///---------------------------------------------------- +struct mob_void_zoneAI : public ScriptedAI +{ + mob_void_zoneAI(Creature* pCreature) : ScriptedAI(pCreature) + { + m_pInstance = pCreature->GetInstanceData(); + m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); + } + + ScriptedInstance* m_pInstance; + uint32 uiVoidZoneTimer; + + void Reset() + { + uiVoidZoneTimer = TIMER_VOID_ZONE; + } + + void UpdateAI(const uint32 diff) + { + if (uiVoidZoneTimer <= diff) { - DoCast(m_creature->getVictim(), SPELL_SONIC_BOOM); - SONIC_BOOM_Timer = 20000; - } else SONIC_BOOM_Timer -= diff; + //voidZone(); + uiVoidZoneTimer = TIMER_VOID_ZONE; + } else uiVoidZoneTimer -= diff; + } - DoMeleeAttackIfReady(); + // TODO: put in comment and kept for reference. The spell should be fixed properly in spell system, if necessary. + //void voidZone() + //{ + // Map* pMap = me->GetMap(); + // if (pMap && pMap->IsDungeon()) + // { + // Map::PlayerList const &PlayerList = pMap->GetPlayers(); + // for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + // { + // // If a player is within the range of the spell + // if (i->getSource() && i->getSource()->GetDistance2d(m_creature) <= 16) + // { + // // Deal damage to the victim + // int32 damage = RAID_MODE(VOID_ZONE_DMG_10, VOID_ZONE_DMG_25); + // m_creature->DealDamage(i->getSource(), damage, NULL, SPELL_DIRECT_DAMAGE, SPELL_SCHOOL_MASK_SHADOW); + // } + // } + // } + //} +}; + +CreatureAI* GetAI_mob_void_zone(Creature* pCreature) +{ + return new mob_void_zoneAI(pCreature); +} + +/*------------------------------------------------------- + * + * LIFE SPARK + * + *///---------------------------------------------------- +struct mob_life_sparkAI : public ScriptedAI +{ + mob_life_sparkAI(Creature* pCreature) : ScriptedAI(pCreature) + { + m_pInstance = pCreature->GetInstanceData(); + } + + ScriptedInstance* m_pInstance; + uint32 uiShockTimer; + + void Reset() + { + DoCast(m_creature, RAID_MODE(SPELL_STATIC_CHARGED_10, SPELL_STATIC_CHARGED_25)); + uiShockTimer = 0; // first one is immediate. + } + + void UpdateAI(const uint32 diff) + { + if (!UpdateVictim()) + return; + + if (uiShockTimer <= diff) + { + if (m_creature->IsWithinMeleeRange(m_creature->getVictim())) + { + DoCast(m_creature->getVictim(), SPELL_SHOCK); + uiShockTimer = TIMER_SHOCK; + } + } + else uiShockTimer -= diff; } }; -CreatureAI* GetAI_boss_xt002(Creature* pCreature) +CreatureAI* GetAI_mob_life_spark(Creature* pCreature) { - return new boss_xt002_AI (pCreature); + return new mob_life_sparkAI(pCreature); } + void AddSC_boss_xt002() { Script *newscript; @@ -104,4 +806,34 @@ void AddSC_boss_xt002() newscript->Name = "boss_xt002"; newscript->GetAI = &GetAI_boss_xt002; newscript->RegisterSelf(); + + newscript = new Script; + newscript->Name = "mob_xt002_heart"; + newscript->GetAI = &GetAI_mob_xt002_heart; + newscript->RegisterSelf(); + + newscript = new Script; + newscript->Name = "mob_scrapbot"; + newscript->GetAI = &GetAI_mob_scrapbot; + newscript->RegisterSelf(); + + newscript = new Script; + newscript->Name = "mob_pummeller"; + newscript->GetAI = &GetAI_mob_pummeller; + newscript->RegisterSelf(); + + newscript = new Script; + newscript->Name = "mob_boombot"; + newscript->GetAI = &GetAI_mob_boombot; + newscript->RegisterSelf(); + + newscript = new Script; + newscript->Name = "mob_void_zone"; + newscript->GetAI = &GetAI_mob_void_zone; + newscript->RegisterSelf(); + + newscript = new Script; + newscript->Name = "mob_life_spark"; + newscript->GetAI = &GetAI_mob_life_spark; + newscript->RegisterSelf(); } diff --git a/src/scripts/northrend/ulduar/ulduar/boss_yoggsaron.cpp b/src/scripts/northrend/ulduar/ulduar/boss_yoggsaron.cpp index a9f1be65f2d..e87b6648e8e 100644 --- a/src/scripts/northrend/ulduar/ulduar/boss_yoggsaron.cpp +++ b/src/scripts/northrend/ulduar/ulduar/boss_yoggsaron.cpp @@ -18,3 +18,33 @@ #include "ScriptedPch.h" #include "ulduar.h" + +enum Sara_Yells +{ + SAY_SARA_PREFIGHT_1 = -1603310, + SAY_SARA_PREFIGHT_2 = -1603311, + SAY_SARA_AGGRO_1 = -1603312, + SAY_SARA_AGGRO_2 = -1603313, + SAY_SARA_AGGRO_3 = -1603314, + SAY_SARA_SLAY_1 = -1603315, + SAY_SARA_SLAY_2 = -1603316, + WHISP_SARA_INSANITY = -1603317, + SAY_SARA_PHASE2_1 = -1603318, + SAY_SARA_PHASE2_2 = -1603319, +}; + +enum YoggSaron_Yells +{ + SAY_PHASE2_1 = -1603330, + SAY_PHASE2_2 = -1603331, + SAY_PHASE2_3 = -1603332, + SAY_PHASE2_4 = -1603333, + SAY_PHASE2_5 = -1603334, + SAY_PHASE3 = -1603335, + SAY_VISION = -1603336, + SAY_SLAY_1 = -1603337, + SAY_SLAY_2 = -1603338, + WHISP_INSANITY_1 = -1603339, + WHISP_INSANITY_2 = -1603340, + SAY_DEATH = -1603341, +}; |