diff options
4 files changed, 64 insertions, 36 deletions
diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp index ecc9a8d8d03..a10d41a3bf7 100644 --- a/src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp +++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp @@ -113,7 +113,6 @@ struct TRINITY_DLL_DECL boss_gothikAI : public BossAI { liveTrigger.clear(); deadTrigger.clear(); - me->setActive(false); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2); me->SetReactState(REACT_PASSIVE); _Reset(); @@ -136,7 +135,6 @@ struct TRINITY_DLL_DECL boss_gothikAI : public BossAI } _EnterCombat(); - me->setActive(true); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2); waveCount = 0; events.ScheduleEvent(EVENT_SUMMON, 30000); diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_kelthuzad.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_kelthuzad.cpp index f21985a8f4f..f2886cdf764 100644 --- a/src/bindings/scripts/scripts/zone/naxxramas/boss_kelthuzad.cpp +++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_kelthuzad.cpp @@ -65,6 +65,8 @@ enum Event EVENT_ABOMIN, EVENT_WEAVER, EVENT_ICECROWN, + + EVENT_PHASE, }; #define SPELL_FROST_BOLT HEROIC(28478,55802) @@ -103,7 +105,6 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public BossAI uint32 GuardiansOfIcecrown_Count; - uint32 Phase1_Timer; uint32 Phase; uint32 GuardiansOfIcecrown_Timer; @@ -115,7 +116,6 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public BossAI GuardiansOfIcecrown_Timer = 5000; //5 seconds for summoning each Guardian of Icecrown in phase 3 - Phase1_Timer = 228000; //Phase 1 lasts 3 minutes and 48 seconds Phase=0; } @@ -140,6 +140,7 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public BossAI events.ScheduleEvent(EVENT_WASTE, 3000); events.ScheduleEvent(EVENT_ABOMIN, 25000); events.ScheduleEvent(EVENT_WEAVER, 20000); + events.ScheduleEvent(EVENT_PHASE, 228000); } void UpdateAI(const uint32 diff) @@ -149,37 +150,39 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public BossAI events.Update(diff); - if (Phase1_Timer<diff && Phase==1) - { - events.ScheduleEvent(EVENT_BOLT, 2000); - events.ScheduleEvent(EVENT_NOVA, 15000); - events.ScheduleEvent(EVENT_DETONATE, 20000); - events.ScheduleEvent(EVENT_FISSURE, 25000); - events.ScheduleEvent(EVENT_BLAST, (rand()%30+30)*1000); - if(HeroicMode) - events.ScheduleEvent(EVENT_CHAIN, (rand()%30+30)*1000); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - me->SetReactState(REACT_AGGRESSIVE); - Phase=2; - }else Phase1_Timer-=diff; - if(Phase == 1) { - while(uint32 eventId = events.ExecuteEvent()) + while(uint32 eventId = events.GetEvent()) { switch(eventId) { case EVENT_WASTE: DoSummon(MOB_WASTE, Pos[RAND(0,3,6,9)]); - events.ScheduleEvent(EVENT_WASTE, 3000); + events.RepeatEvent(3000); break; case EVENT_ABOMIN: DoSummon(MOB_ABOMINATION, Pos[RAND(1,4,7,10)]); - events.ScheduleEvent(EVENT_ABOMIN, 25000); + events.RepeatEvent(25000); break; case EVENT_WEAVER: DoSummon(MOB_WEAVER, Pos[RAND(0,3,6,9)]); - events.ScheduleEvent(EVENT_WEAVER, 20000); + events.RepeatEvent(20000); + break; + case EVENT_PHASE: + events.Reset(); + events.ScheduleEvent(EVENT_BOLT, 2000); + events.ScheduleEvent(EVENT_NOVA, 15000); + events.ScheduleEvent(EVENT_DETONATE, 20000); + events.ScheduleEvent(EVENT_FISSURE, 25000); + events.ScheduleEvent(EVENT_BLAST, (rand()%30+30)*1000); + if(HeroicMode) + events.ScheduleEvent(EVENT_CHAIN, (rand()%30+30)*1000); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + me->SetReactState(REACT_AGGRESSIVE); + Phase = 2; + return; + default: + events.PopEvent(); break; } } @@ -212,23 +215,23 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public BossAI if(me->hasUnitState(UNIT_STAT_CASTING)) return; - if(uint32 eventId = events.ExecuteEvent()) + if(uint32 eventId = events.GetEvent()) { switch(eventId) { case EVENT_BOLT: DoCast(m_creature->getVictim(),SPELL_FROST_BOLT); - events.ScheduleEvent(EVENT_BOLT, 2000); + events.RepeatEvent(2000); return; case EVENT_NOVA: DoCastAOE(SPELL_FROST_BOLT_AOE); - events.ScheduleEvent(EVENT_NOVA, 15000); + events.RepeatEvent(15000); return; case EVENT_CHAIN: if(Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0, true)) DoCast(target, SPELL_CHAINS_OF_KELTHUZAD); DoScriptText(SAY_CHAIN, me); - events.ScheduleEvent(EVENT_CHAIN, (rand()%30+30)*1000); + events.RepeatEvent((rand()%30+30)*1000); return; case EVENT_DETONATE: { @@ -250,20 +253,23 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public BossAI DoScriptText(SAY_SPECIAL, me); } - events.ScheduleEvent(EVENT_DETONATE, 20000); + events.RepeatEvent(20000); return; } case EVENT_FISSURE: if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0)) DoCast(target, SPELL_SHADOW_FISURE); - events.ScheduleEvent(EVENT_FISSURE, 25000); + events.RepeatEvent(25000); return; case EVENT_BLAST: if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0, true)) DoCast(target, SPELL_FROST_BLAST); if(rand()%2) DoScriptText(SAY_FROST_BLAST, m_creature); - events.ScheduleEvent(EVENT_BLAST, (rand()%30+30)*1000); + events.RepeatEvent((rand()%30+30)*1000); + return; + default: + events.PopEvent(); return; } } diff --git a/src/bindings/scripts/scripts/zone/naxxramas/boss_noth.cpp b/src/bindings/scripts/scripts/zone/naxxramas/boss_noth.cpp index 8ce017a936e..e29143b6d12 100644 --- a/src/bindings/scripts/scripts/zone/naxxramas/boss_noth.cpp +++ b/src/bindings/scripts/scripts/zone/naxxramas/boss_noth.cpp @@ -67,17 +67,10 @@ struct TRINITY_DLL_DECL boss_nothAI : public BossAI uint32 waveCount, balconyCount; - void Reset() - { - _Reset(); - me->setActive(false); - } - void EnterCombat(Unit *who) { _EnterCombat(); DoScriptText(SAY_AGGRO, me); - me->setActive(true); balconyCount = 0; EnterPhaseGround(); } diff --git a/src/game/CreatureAIImpl.h b/src/game/CreatureAIImpl.h index e48ef516b2c..4bb21f1d5ba 100644 --- a/src/game/CreatureAIImpl.h +++ b/src/game/CreatureAIImpl.h @@ -129,6 +129,20 @@ class EventMap : private std::map<uint32, uint32> ScheduleEvent(eventId, time, gcd, phase); } + void RepeatEvent(uint32 time) + { + if(empty()) + return; + uint32 eventId = begin()->second; + erase(begin()); + insert(std::make_pair(time, eventId)); + } + + void PopEvent() + { + erase(begin()); + } + uint32 ExecuteEvent() { while(!empty()) @@ -147,6 +161,23 @@ class EventMap : private std::map<uint32, uint32> return 0; } + uint32 GetEvent() + { + while(!empty()) + { + if(begin()->first > m_time) + return 0; + else if(m_phase && (begin()->second & 0xFF000000) && !(begin()->second & m_phase)) + erase(begin()); + else + { + uint32 eventId = (begin()->second & 0x0000FFFF); + return eventId; + } + } + return 0; + } + void DelayEvents(uint32 time, uint32 gcd) { time += m_time; |