Fix Script Naxxramas/Kel'Thuzad. Thanks Scarymovie87.
Fixes issue 464. - fix timers - fix maximum number of spawn abomination or weaver - fix kel'thuzad not attackable after reset. - fix phase 3 start at 45% --HG-- branch : trunk
This commit is contained in:
@@ -15,8 +15,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* ScriptData
|
/* ScriptData
|
||||||
SDName: Boss_KelThuzud
|
SDName: Boss_KelThuzad
|
||||||
SD%Complete: 0
|
SD%Complete: 80%
|
||||||
SDComment: VERIFY SCRIPT
|
SDComment: VERIFY SCRIPT
|
||||||
SDCategory: Naxxramas
|
SDCategory: Naxxramas
|
||||||
EndScriptData */
|
EndScriptData */
|
||||||
@@ -83,7 +83,7 @@ enum Spells
|
|||||||
SPELL_MANA_DETONATION = 27819,
|
SPELL_MANA_DETONATION = 27819,
|
||||||
SPELL_FROST_BLAST = 27808,
|
SPELL_FROST_BLAST = 27808,
|
||||||
SPELL_CHAINS_OF_KELTHUZAD = 28410, //28408 script effect
|
SPELL_CHAINS_OF_KELTHUZAD = 28410, //28408 script effect
|
||||||
SPELL_BERSERK = 28498
|
SPELL_KELTHUZAD_CHANNEL = 29423
|
||||||
};
|
};
|
||||||
|
|
||||||
enum Creatures
|
enum Creatures
|
||||||
@@ -118,16 +118,21 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public BossAI
|
|||||||
|
|
||||||
uint32 Phase;
|
uint32 Phase;
|
||||||
uint32 GuardiansOfIcecrown_Timer;
|
uint32 GuardiansOfIcecrown_Timer;
|
||||||
|
uint8 nAbomination;
|
||||||
|
uint8 nWeaver;
|
||||||
|
|
||||||
void Reset()
|
void Reset()
|
||||||
{
|
{
|
||||||
_Reset();
|
_Reset();
|
||||||
|
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||||
me->SetReactState(REACT_AGGRESSIVE);
|
me->SetReactState(REACT_AGGRESSIVE);
|
||||||
GuardiansOfIcecrown_Count = 0;
|
GuardiansOfIcecrown_Count = 0;
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
Phase=0;
|
Phase=0;
|
||||||
|
nAbomination=0;
|
||||||
|
nWeaver=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void KilledUnit()
|
void KilledUnit()
|
||||||
@@ -144,13 +149,14 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public BossAI
|
|||||||
void EnterCombat(Unit* who)
|
void EnterCombat(Unit* who)
|
||||||
{
|
{
|
||||||
_EnterCombat();
|
_EnterCombat();
|
||||||
|
DoCast(me, SPELL_KELTHUZAD_CHANNEL);
|
||||||
DoScriptText(RAND(SAY_AGGRO_1,SAY_AGGRO_2,SAY_AGGRO_3), me);
|
DoScriptText(RAND(SAY_AGGRO_1,SAY_AGGRO_2,SAY_AGGRO_3), me);
|
||||||
Phase=1;
|
Phase=1;
|
||||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||||
me->SetReactState(REACT_PASSIVE);
|
me->SetReactState(REACT_PASSIVE);
|
||||||
events.ScheduleEvent(EVENT_WASTE, 5000);
|
events.ScheduleEvent(EVENT_WASTE, 30000);
|
||||||
events.ScheduleEvent(EVENT_ABOMIN, 25000);
|
events.ScheduleEvent(EVENT_ABOMIN, 60000);
|
||||||
events.ScheduleEvent(EVENT_WEAVER, 20000);
|
events.ScheduleEvent(EVENT_WEAVER, 80000);
|
||||||
events.ScheduleEvent(EVENT_PHASE, 228000);
|
events.ScheduleEvent(EVENT_PHASE, 228000);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -169,29 +175,46 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public BossAI
|
|||||||
{
|
{
|
||||||
case EVENT_WASTE:
|
case EVENT_WASTE:
|
||||||
DoSummon(NPC_WASTE, Pos[RAND(0,3,6,9)]);
|
DoSummon(NPC_WASTE, Pos[RAND(0,3,6,9)]);
|
||||||
events.RepeatEvent(5000);
|
events.RepeatEvent(urand(2000,5000));
|
||||||
break;
|
break;
|
||||||
case EVENT_ABOMIN:
|
case EVENT_ABOMIN:
|
||||||
DoSummon(NPC_ABOMINATION, Pos[RAND(1,4,7,10)]);
|
if (nAbomination < 8)
|
||||||
events.RepeatEvent(25000);
|
{
|
||||||
|
DoSummon(NPC_ABOMINATION, Pos[RAND(1,4,7,10)]);
|
||||||
|
nAbomination++;
|
||||||
|
events.RepeatEvent(20000);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
events.PopEvent();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case EVENT_WEAVER:
|
case EVENT_WEAVER:
|
||||||
DoSummon(NPC_WEAVER, Pos[RAND(0,3,6,9)]);
|
if (nWeaver < 8)
|
||||||
events.RepeatEvent(20000);
|
{
|
||||||
|
DoSummon(NPC_WEAVER, Pos[RAND(0,3,6,9)]);
|
||||||
|
nWeaver++;
|
||||||
|
events.RepeatEvent(25000);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
events.PopEvent();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case EVENT_PHASE:
|
case EVENT_PHASE:
|
||||||
|
// TODO : Add missing text
|
||||||
events.Reset();
|
events.Reset();
|
||||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||||
me->SetReactState(REACT_AGGRESSIVE);
|
me->SetReactState(REACT_AGGRESSIVE);
|
||||||
events.ScheduleEvent(EVENT_BOLT, urand(1000,10000));
|
events.ScheduleEvent(EVENT_BOLT, urand(5000,10000));
|
||||||
events.ScheduleEvent(EVENT_NOVA, urand(10000,15000));
|
events.ScheduleEvent(EVENT_NOVA, 15000);
|
||||||
events.ScheduleEvent(EVENT_DETONATE, 20000);
|
events.ScheduleEvent(EVENT_DETONATE, urand(30000,40000));
|
||||||
events.ScheduleEvent(EVENT_FISSURE, 25000);
|
events.ScheduleEvent(EVENT_FISSURE, urand(10000,30000));
|
||||||
events.ScheduleEvent(EVENT_BLAST, urand(30000,60000));
|
events.ScheduleEvent(EVENT_BLAST, urand(60000,120000));
|
||||||
if (getDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL)
|
if (getDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL)
|
||||||
events.ScheduleEvent(EVENT_CHAIN, urand(30000,60000));
|
events.ScheduleEvent(EVENT_CHAIN, urand(30000,60000));
|
||||||
Phase = 2;
|
Phase = 2;
|
||||||
return;
|
break;
|
||||||
default:
|
default:
|
||||||
events.PopEvent();
|
events.PopEvent();
|
||||||
break;
|
break;
|
||||||
@@ -200,10 +223,10 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public BossAI
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//start phase 3 when we are 40% health
|
//start phase 3 when we are 45% health
|
||||||
if (Phase != 3)
|
if (Phase != 3)
|
||||||
{
|
{
|
||||||
if (HealthBelowPct(40))
|
if (HealthBelowPct(45))
|
||||||
{
|
{
|
||||||
Phase = 3 ;
|
Phase = 3 ;
|
||||||
DoScriptText(SAY_REQUEST_AID, m_creature);
|
DoScriptText(SAY_REQUEST_AID, m_creature);
|
||||||
@@ -212,10 +235,11 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public BossAI
|
|||||||
DoScriptText(SAY_ANSWER_REQUEST, m_creature);
|
DoScriptText(SAY_ANSWER_REQUEST, m_creature);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (GuardiansOfIcecrown_Count < RAID_MODE(2,5))
|
else if (GuardiansOfIcecrown_Count < RAID_MODE(2,4))
|
||||||
{
|
{
|
||||||
if (GuardiansOfIcecrown_Timer <= diff)
|
if (GuardiansOfIcecrown_Timer <= diff)
|
||||||
{
|
{
|
||||||
|
// TODO : Add missing text
|
||||||
DoSummon(NPC_ICECROWN, Pos[RAND(2,5,8)]);
|
DoSummon(NPC_ICECROWN, Pos[RAND(2,5,8)]);
|
||||||
++GuardiansOfIcecrown_Count;
|
++GuardiansOfIcecrown_Count;
|
||||||
GuardiansOfIcecrown_Timer = 5000;
|
GuardiansOfIcecrown_Timer = 5000;
|
||||||
@@ -232,18 +256,18 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public BossAI
|
|||||||
{
|
{
|
||||||
case EVENT_BOLT:
|
case EVENT_BOLT:
|
||||||
DoCastVictim(RAID_MODE(SPELL_FROST_BOLT,H_SPELL_FROST_BOLT));
|
DoCastVictim(RAID_MODE(SPELL_FROST_BOLT,H_SPELL_FROST_BOLT));
|
||||||
events.RepeatEvent(urand(1000,10000));
|
events.RepeatEvent(urand(5000,10000));
|
||||||
return;
|
break;
|
||||||
case EVENT_NOVA:
|
case EVENT_NOVA:
|
||||||
DoCastAOE(RAID_MODE(SPELL_FROST_BOLT_AOE,H_SPELL_FROST_BOLT_AOE));
|
DoCastAOE(RAID_MODE(SPELL_FROST_BOLT_AOE,H_SPELL_FROST_BOLT_AOE));
|
||||||
events.RepeatEvent(urand(10000,20000));
|
events.RepeatEvent(urand(15000,30000));
|
||||||
return;
|
break;
|
||||||
case EVENT_CHAIN:
|
case EVENT_CHAIN:
|
||||||
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 1, 200, true))
|
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 1, 200, true))
|
||||||
DoCast(pTarget, SPELL_CHAINS_OF_KELTHUZAD);
|
DoCast(pTarget, SPELL_CHAINS_OF_KELTHUZAD);
|
||||||
DoScriptText(RAND(SAY_CHAIN_1,SAY_CHAIN_2), me);
|
DoScriptText(RAND(SAY_CHAIN_1,SAY_CHAIN_2), me);
|
||||||
events.RepeatEvent(urand(30000,60000));
|
events.RepeatEvent(urand(100000,180000));
|
||||||
return;
|
break;
|
||||||
case EVENT_DETONATE:
|
case EVENT_DETONATE:
|
||||||
{
|
{
|
||||||
std::vector<Unit*> unitList;
|
std::vector<Unit*> unitList;
|
||||||
@@ -264,24 +288,24 @@ struct TRINITY_DLL_DECL boss_kelthuzadAI : public BossAI
|
|||||||
DoScriptText(RAND(SAY_SPECIAL_1,SAY_SPECIAL_2,SAY_SPECIAL_3), me);
|
DoScriptText(RAND(SAY_SPECIAL_1,SAY_SPECIAL_2,SAY_SPECIAL_3), me);
|
||||||
}
|
}
|
||||||
|
|
||||||
events.RepeatEvent(20000);
|
events.RepeatEvent(urand(20000,50000));
|
||||||
return;
|
break;
|
||||||
}
|
}
|
||||||
case EVENT_FISSURE:
|
case EVENT_FISSURE:
|
||||||
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
|
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
|
||||||
DoCast(pTarget, SPELL_SHADOW_FISURE);
|
DoCast(pTarget, SPELL_SHADOW_FISURE);
|
||||||
events.RepeatEvent(25000);
|
events.RepeatEvent(urand(10000,45000));
|
||||||
return;
|
break;
|
||||||
case EVENT_BLAST:
|
case EVENT_BLAST:
|
||||||
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 0, true))
|
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 0, true))
|
||||||
DoCast(pTarget, SPELL_FROST_BLAST);
|
DoCast(pTarget, SPELL_FROST_BLAST);
|
||||||
if (rand()%2)
|
if (rand()%2)
|
||||||
DoScriptText(SAY_FROST_BLAST, m_creature);
|
DoScriptText(SAY_FROST_BLAST, m_creature);
|
||||||
events.RepeatEvent(urand(30000,60000));
|
events.RepeatEvent(urand(30000,90000));
|
||||||
return;
|
break;
|
||||||
default:
|
default:
|
||||||
events.PopEvent();
|
events.PopEvent();
|
||||||
return;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ const DoorData doorData[] =
|
|||||||
{181119, BOSS_GOTHIK, DOOR_TYPE_PASSAGE, 0},
|
{181119, BOSS_GOTHIK, DOOR_TYPE_PASSAGE, 0},
|
||||||
{181119, BOSS_HORSEMEN, DOOR_TYPE_ROOM, BOUNDARY_NE},
|
{181119, BOSS_HORSEMEN, DOOR_TYPE_ROOM, BOUNDARY_NE},
|
||||||
{181225, BOSS_SAPPHIRON, DOOR_TYPE_PASSAGE, BOUNDARY_W},
|
{181225, BOSS_SAPPHIRON, DOOR_TYPE_PASSAGE, BOUNDARY_W},
|
||||||
|
{181228, BOSS_KELTHUZAD, DOOR_TYPE_ROOM, BOUNDARY_S},
|
||||||
{0, 0, DOOR_TYPE_ROOM, 0}, // EOF
|
{0, 0, DOOR_TYPE_ROOM, 0}, // EOF
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user