aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_gothik.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_kelthuzad.cpp60
-rw-r--r--src/bindings/scripts/scripts/zone/naxxramas/boss_noth.cpp7
-rw-r--r--src/game/CreatureAIImpl.h31
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;