*Some update of kelthuzad script.
--HG-- branch : trunk
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user