*Some update of kelthuzad script.

--HG--
branch : trunk
This commit is contained in:
megamage
2009-06-08 00:35:43 -05:00
parent 70423d04ff
commit 963ee5d917
4 changed files with 64 additions and 36 deletions
@@ -113,7 +113,6 @@ struct TRINITY_DLL_DECL boss_gothikAI : public BossAI
{ {
liveTrigger.clear(); liveTrigger.clear();
deadTrigger.clear(); deadTrigger.clear();
me->setActive(false);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
me->SetReactState(REACT_PASSIVE); me->SetReactState(REACT_PASSIVE);
_Reset(); _Reset();
@@ -136,7 +135,6 @@ struct TRINITY_DLL_DECL boss_gothikAI : public BossAI
} }
_EnterCombat(); _EnterCombat();
me->setActive(true);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
waveCount = 0; waveCount = 0;
events.ScheduleEvent(EVENT_SUMMON, 30000); events.ScheduleEvent(EVENT_SUMMON, 30000);
@@ -65,6 +65,8 @@ enum Event
EVENT_ABOMIN, EVENT_ABOMIN,
EVENT_WEAVER, EVENT_WEAVER,
EVENT_ICECROWN, EVENT_ICECROWN,
EVENT_PHASE,
}; };
#define SPELL_FROST_BOLT HEROIC(28478,55802) #define SPELL_FROST_BOLT HEROIC(28478,55802)
@@ -103,7 +105,6 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public BossAI
uint32 GuardiansOfIcecrown_Count; uint32 GuardiansOfIcecrown_Count;
uint32 Phase1_Timer;
uint32 Phase; uint32 Phase;
uint32 GuardiansOfIcecrown_Timer; 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 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; Phase=0;
} }
@@ -140,6 +140,7 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public BossAI
events.ScheduleEvent(EVENT_WASTE, 3000); events.ScheduleEvent(EVENT_WASTE, 3000);
events.ScheduleEvent(EVENT_ABOMIN, 25000); events.ScheduleEvent(EVENT_ABOMIN, 25000);
events.ScheduleEvent(EVENT_WEAVER, 20000); events.ScheduleEvent(EVENT_WEAVER, 20000);
events.ScheduleEvent(EVENT_PHASE, 228000);
} }
void UpdateAI(const uint32 diff) void UpdateAI(const uint32 diff)
@@ -149,37 +150,39 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public BossAI
events.Update(diff); 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) if(Phase == 1)
{ {
while(uint32 eventId = events.ExecuteEvent()) while(uint32 eventId = events.GetEvent())
{ {
switch(eventId) switch(eventId)
{ {
case EVENT_WASTE: case EVENT_WASTE:
DoSummon(MOB_WASTE, Pos[RAND(0,3,6,9)]); DoSummon(MOB_WASTE, Pos[RAND(0,3,6,9)]);
events.ScheduleEvent(EVENT_WASTE, 3000); events.RepeatEvent(3000);
break; break;
case EVENT_ABOMIN: case EVENT_ABOMIN:
DoSummon(MOB_ABOMINATION, Pos[RAND(1,4,7,10)]); DoSummon(MOB_ABOMINATION, Pos[RAND(1,4,7,10)]);
events.ScheduleEvent(EVENT_ABOMIN, 25000); events.RepeatEvent(25000);
break; break;
case EVENT_WEAVER: case EVENT_WEAVER:
DoSummon(MOB_WEAVER, Pos[RAND(0,3,6,9)]); 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; break;
} }
} }
@@ -212,23 +215,23 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public BossAI
if(me->hasUnitState(UNIT_STAT_CASTING)) if(me->hasUnitState(UNIT_STAT_CASTING))
return; return;
if(uint32 eventId = events.ExecuteEvent()) if(uint32 eventId = events.GetEvent())
{ {
switch(eventId) switch(eventId)
{ {
case EVENT_BOLT: case EVENT_BOLT:
DoCast(m_creature->getVictim(),SPELL_FROST_BOLT); DoCast(m_creature->getVictim(),SPELL_FROST_BOLT);
events.ScheduleEvent(EVENT_BOLT, 2000); events.RepeatEvent(2000);
return; return;
case EVENT_NOVA: case EVENT_NOVA:
DoCastAOE(SPELL_FROST_BOLT_AOE); DoCastAOE(SPELL_FROST_BOLT_AOE);
events.ScheduleEvent(EVENT_NOVA, 15000); events.RepeatEvent(15000);
return; return;
case EVENT_CHAIN: case EVENT_CHAIN:
if(Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0, true)) if(Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0, true))
DoCast(target, SPELL_CHAINS_OF_KELTHUZAD); DoCast(target, SPELL_CHAINS_OF_KELTHUZAD);
DoScriptText(SAY_CHAIN, me); DoScriptText(SAY_CHAIN, me);
events.ScheduleEvent(EVENT_CHAIN, (rand()%30+30)*1000); events.RepeatEvent((rand()%30+30)*1000);
return; return;
case EVENT_DETONATE: case EVENT_DETONATE:
{ {
@@ -250,20 +253,23 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public BossAI
DoScriptText(SAY_SPECIAL, me); DoScriptText(SAY_SPECIAL, me);
} }
events.ScheduleEvent(EVENT_DETONATE, 20000); events.RepeatEvent(20000);
return; return;
} }
case EVENT_FISSURE: case EVENT_FISSURE:
if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0)) if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(target, SPELL_SHADOW_FISURE); DoCast(target, SPELL_SHADOW_FISURE);
events.ScheduleEvent(EVENT_FISSURE, 25000); events.RepeatEvent(25000);
return; return;
case EVENT_BLAST: case EVENT_BLAST:
if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0, true)) if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0, true))
DoCast(target, SPELL_FROST_BLAST); DoCast(target, SPELL_FROST_BLAST);
if(rand()%2) if(rand()%2)
DoScriptText(SAY_FROST_BLAST, m_creature); 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; return;
} }
} }
@@ -67,17 +67,10 @@ struct TRINITY_DLL_DECL boss_nothAI : public BossAI
uint32 waveCount, balconyCount; uint32 waveCount, balconyCount;
void Reset()
{
_Reset();
me->setActive(false);
}
void EnterCombat(Unit *who) void EnterCombat(Unit *who)
{ {
_EnterCombat(); _EnterCombat();
DoScriptText(SAY_AGGRO, me); DoScriptText(SAY_AGGRO, me);
me->setActive(true);
balconyCount = 0; balconyCount = 0;
EnterPhaseGround(); EnterPhaseGround();
} }
+31
View File
@@ -129,6 +129,20 @@ class EventMap : private std::map<uint32, uint32>
ScheduleEvent(eventId, time, gcd, phase); 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() uint32 ExecuteEvent()
{ {
while(!empty()) while(!empty())
@@ -147,6 +161,23 @@ class EventMap : private std::map<uint32, uint32>
return 0; 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) void DelayEvents(uint32 time, uint32 gcd)
{ {
time += m_time; time += m_time;