*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();
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);
@@ -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,8 +150,26 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public BossAI
events.Update(diff);
if (Phase1_Timer<diff && Phase==1)
if(Phase == 1)
{
while(uint32 eventId = events.GetEvent())
{
switch(eventId)
{
case EVENT_WASTE:
DoSummon(MOB_WASTE, Pos[RAND(0,3,6,9)]);
events.RepeatEvent(3000);
break;
case EVENT_ABOMIN:
DoSummon(MOB_ABOMINATION, Pos[RAND(1,4,7,10)]);
events.RepeatEvent(25000);
break;
case EVENT_WEAVER:
DoSummon(MOB_WEAVER, Pos[RAND(0,3,6,9)]);
events.RepeatEvent(20000);
break;
case EVENT_PHASE:
events.Reset();
events.ScheduleEvent(EVENT_BOLT, 2000);
events.ScheduleEvent(EVENT_NOVA, 15000);
events.ScheduleEvent(EVENT_DETONATE, 20000);
@@ -161,25 +180,9 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public BossAI
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())
{
switch(eventId)
{
case EVENT_WASTE:
DoSummon(MOB_WASTE, Pos[RAND(0,3,6,9)]);
events.ScheduleEvent(EVENT_WASTE, 3000);
break;
case EVENT_ABOMIN:
DoSummon(MOB_ABOMINATION, Pos[RAND(1,4,7,10)]);
events.ScheduleEvent(EVENT_ABOMIN, 25000);
break;
case EVENT_WEAVER:
DoSummon(MOB_WEAVER, Pos[RAND(0,3,6,9)]);
events.ScheduleEvent(EVENT_WEAVER, 20000);
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;
}
}
@@ -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();
}
+31
View File
@@ -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;