*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();
|
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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user