Core/Scripting: Improve boss Thekal script and misc cleanup.

This commit is contained in:
Malcrom
2013-01-13 13:44:11 -03:30
parent a47164b3dd
commit 71bfda55c3
4 changed files with 152 additions and 174 deletions

View File

@@ -27,30 +27,36 @@ EndScriptData */
#include "ScriptedCreature.h"
#include "zulgurub.h"
enum Mandokir
enum Says
{
SAY_AGGRO = 0,
SAY_DING_KILL = 1,
SAY_WATCH = 2,
SAY_WATCH_WHISPER = 3, //is this text for real? easter egg?
SAY_GRATS_JINDO = 0,
SPELL_CHARGE = 24408,
SPELL_CLEAVE = 7160,
SPELL_FEAR = 29321,
SPELL_WHIRLWIND = 15589,
SPELL_MORTAL_STRIKE = 16856,
SPELL_ENRAGE = 24318,
SPELL_WATCH = 24314,
SPELL_LEVEL_UP = 24312,
//Ohgans Spells
SPELL_SUNDERARMOR = 24317,
NPC_SPEAKER = 11391
SAY_AGGRO = 0,
SAY_DING_KILL = 1,
SAY_WATCH = 2,
SAY_WATCH_WHISPER = 3, // is this text for real? easter egg?
SAY_GRATS_JINDO = 0,
};
class boss_mandokir : public CreatureScript //mandokir
enum Spells
{
SPELL_CHARGE = 24408,
SPELL_CLEAVE = 7160,
SPELL_FEAR = 29321,
SPELL_WHIRLWIND = 15589,
SPELL_MORTAL_STRIKE = 16856,
SPELL_ENRAGE = 24318,
SPELL_WATCH = 24314,
SPELL_LEVEL_UP = 24312,
SPELL_SWIFT_ORANGE_RAPTOR = 23243,
// Ohgans Spell
SPELL_SUNDERARMOR = 24317
};
enum CreatureId
{
NPC_SPEAKER = 11391
};
class boss_mandokir : public CreatureScript
{
public: boss_mandokir() : CreatureScript("boss_mandokir") {}
@@ -300,15 +306,10 @@ class boss_mandokir : public CreatureScript //mandokir
}
};
//Ohgan
// Ohgan
class mob_ohgan : public CreatureScript
{
public:
mob_ohgan()
: CreatureScript("mob_ohgan")
{
}
public: mob_ohgan() : CreatureScript("mob_ohgan") {}
struct mob_ohganAI : public ScriptedAI
{

View File

@@ -38,15 +38,15 @@ enum Says
enum Spells
{
SPELL_CHARGE = 22911,
SPELL_ASPECT_OF_MARLI = 24686, // A stun spell
SPELL_ASPECT_OF_MARLI = 24686, // A stun spell
SPELL_ENVOLWINGWEB = 24110,
SPELL_POISONVOLLEY = 24099,
SPELL_SPIDER_FORM = 24084,
//The Spider Spells
SPELL_LEVELUP = 24312 // Not right Spell.
// The Spider Spell
SPELL_LEVELUP = 24312 // Not right Spell.
};
class boss_marli : public CreatureScript // marli
class boss_marli : public CreatureScript
{
public: boss_marli() : CreatureScript("boss_marli") {}
@@ -214,15 +214,10 @@ class boss_marli : public CreatureScript // marli
}
};
//Spawn of Marli
// Spawn of Marli
class mob_spawn_of_marli : public CreatureScript
{
public:
mob_spawn_of_marli()
: CreatureScript("mob_spawn_of_marli")
{
}
public: mob_spawn_of_marli() : CreatureScript("mob_spawn_of_marli") {}
struct mob_spawn_of_marliAI : public ScriptedAI
{

View File

@@ -44,15 +44,12 @@ enum Spells
SPELL_CHARGE = 24193, // Phase 2
SPELL_ENRAGE = 8269, // Phase 2
SPELL_SUMMONTIGERS = 24183, // Phase 2
//Zealot Lor'Khan Spells
// Zealot Lor'Khan Spells
SPELL_SHIELD = 20545,
SPELL_BLOODLUST = 24185,
SPELL_GREATERHEAL = 24208,
SPELL_DISARM = 6713,
//Zealot Zath Spells
// Zealot Zath Spells
SPELL_SWEEPINGSTRIKES = 18765,
SPELL_SINISTERSTRIKE = 15581,
SPELL_GOUGE = 12540,
@@ -73,7 +70,13 @@ enum Events
EVENT_SUMMONTIGERS = 8 // Phase 2
};
class boss_thekal : public CreatureScript // thekal
enum Phases
{
PHASE_ONE = 1,
PHASE_TWO = 2
};
class boss_thekal : public CreatureScript
{
public: boss_thekal() : CreatureScript("boss_thekal") {}
@@ -82,13 +85,11 @@ class boss_thekal : public CreatureScript // thekal
boss_thekalAI(Creature* creature) : BossAI(creature, DATA_THEKAL) {}
bool Enraged;
bool PhaseTwo;
bool WasDead;
void Reset()
{
Enraged = false;
PhaseTwo = false;
WasDead = false;
}
@@ -101,10 +102,10 @@ class boss_thekal : public CreatureScript // thekal
void EnterCombat(Unit* /*who*/)
{
_EnterCombat();
events.ScheduleEvent(EVENT_MORTALCLEAVE, 4000); // Phase 1
events.ScheduleEvent(EVENT_SILENCE, 9000); // Phase 1
events.ScheduleEvent(EVENT_CHECK_TIMER, 10000); // Phase 1
events.ScheduleEvent(EVENT_RESURRECT_TIMER, 10000); // Phase 1
events.ScheduleEvent(EVENT_MORTALCLEAVE, 4000, 0, PHASE_ONE); // Phase 1
events.ScheduleEvent(EVENT_SILENCE, 9000, 0, PHASE_ONE); // Phase 1
events.ScheduleEvent(EVENT_CHECK_TIMER, 10000, 0, PHASE_ONE); // Phase 1
events.ScheduleEvent(EVENT_RESURRECT_TIMER, 10000, 0, PHASE_ONE); // Phase 1
Talk(SAY_AGGRO);
}
@@ -126,140 +127,123 @@ class boss_thekal : public CreatureScript // thekal
while (uint32 eventId = events.ExecuteEvent())
{
if (!PhaseTwo)
switch (eventId)
{
switch (eventId)
{
case EVENT_MORTALCLEAVE:
DoCastVictim(SPELL_MORTALCLEAVE, true);
events.ScheduleEvent(EVENT_MORTALCLEAVE, urand(15000, 20000));
break;
case EVENT_SILENCE:
DoCastVictim(SPELL_SILENCE, true);
events.ScheduleEvent(EVENT_SILENCE, urand(20000, 25000));
break;
case EVENT_RESURRECT_TIMER:
//Thekal will transform to Tiger if he died and was not resurrected after 10 seconds.
if (WasDead)
case EVENT_MORTALCLEAVE:
DoCastVictim(SPELL_MORTALCLEAVE, true);
events.ScheduleEvent(EVENT_MORTALCLEAVE, urand(15000, 20000), 0, PHASE_ONE);
break;
case EVENT_SILENCE:
DoCastVictim(SPELL_SILENCE, true);
events.ScheduleEvent(EVENT_SILENCE, urand(20000, 25000), 0, PHASE_ONE);
break;
case EVENT_RESURRECT_TIMER:
//Thekal will transform to Tiger if he died and was not resurrected after 10 seconds.
if (WasDead)
{
DoCast(me, SPELL_TIGER_FORM);
me->SetObjectScale(2.00f);
me->SetStandState(UNIT_STAND_STATE_STAND);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetFullHealth();
const CreatureTemplate* cinfo = me->GetCreatureTemplate();
me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 40)));
me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 40)));
me->UpdateDamagePhysical(BASE_ATTACK);
DoResetThreat();
events.ScheduleEvent(EVENT_FRENZY, 30000, 0, PHASE_TWO); // Phase 2
events.ScheduleEvent(EVENT_FORCEPUNCH, 4000, 0, PHASE_TWO); // Phase 2
events.ScheduleEvent(EVENT_SPELL_CHARGE, 12000, 0, PHASE_TWO); // Phase 2
events.ScheduleEvent(EVENT_ENRAGE, 32000, 0, PHASE_TWO); // Phase 2
events.ScheduleEvent(EVENT_SUMMONTIGERS, 25000, 0, PHASE_TWO); // Phase 2
events.SetPhase(PHASE_TWO);
}
events.ScheduleEvent(EVENT_RESURRECT_TIMER, 10000, 0, PHASE_ONE);
break;
case EVENT_CHECK_TIMER:
//Check_Timer for the death of LorKhan and Zath.
if (!WasDead)
{
if (instance)
{
DoCast(me, SPELL_TIGER_FORM);
me->SetObjectScale(2.00f);
me->SetStandState(UNIT_STAND_STATE_STAND);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetFullHealth();
const CreatureTemplate* cinfo = me->GetCreatureTemplate();
me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 40)));
me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 40)));
me->UpdateDamagePhysical(BASE_ATTACK);
DoResetThreat();
PhaseTwo = true;
events.ScheduleEvent(EVENT_FRENZY, 30000); // Phase 2
events.ScheduleEvent(EVENT_FORCEPUNCH, 4000); // Phase 2
events.ScheduleEvent(EVENT_SPELL_CHARGE, 12000); // Phase 2
events.ScheduleEvent(EVENT_ENRAGE, 32000); // Phase 2
events.ScheduleEvent(EVENT_SUMMONTIGERS, 25000); // Phase 2
}
events.ScheduleEvent(EVENT_RESURRECT_TIMER, 10000);
break;
case EVENT_CHECK_TIMER:
//Check_Timer for the death of LorKhan and Zath.
if (!WasDead)
{
if (instance)
if (instance->GetData(DATA_LORKHAN) == SPECIAL)
{
if (instance->GetData(DATA_LORKHAN) == SPECIAL)
//Resurrect LorKhan
if (Unit* pLorKhan = Unit::GetUnit(*me, instance->GetData64(DATA_LORKHAN)))
{
//Resurrect LorKhan
if (Unit* pLorKhan = Unit::GetUnit(*me, instance->GetData64(DATA_LORKHAN)))
{
pLorKhan->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
pLorKhan->setFaction(14);
pLorKhan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
pLorKhan->SetFullHealth();
instance->SetData(DATA_LORKHAN, DONE);
}
}
if (instance->GetData(DATA_ZATH) == SPECIAL)
{
//Resurrect Zath
if (Unit* pZath = Unit::GetUnit(*me, instance->GetData64(DATA_ZATH)))
{
pZath->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
pZath->setFaction(14);
pZath->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
pZath->SetFullHealth();
instance->SetData(DATA_ZATH, DONE);
}
pLorKhan->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
pLorKhan->setFaction(14);
pLorKhan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
pLorKhan->SetFullHealth();
instance->SetData(DATA_LORKHAN, DONE);
}
}
events.ScheduleEvent(EVENT_CHECK_TIMER, 5000);
break;
default:
break;
}
if (!WasDead && !HealthAbovePct(5))
{
me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT);
me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE);
me->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetStandState(UNIT_STAND_STATE_SLEEP);
me->AttackStop();
if (instance)
instance->SetData(DATA_THEKAL, SPECIAL);
WasDead=true;
if (instance->GetData(DATA_ZATH) == SPECIAL)
{
//Resurrect Zath
if (Unit* pZath = Unit::GetUnit(*me, instance->GetData64(DATA_ZATH)))
{
pZath->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
pZath->setFaction(14);
pZath->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
pZath->SetFullHealth();
instance->SetData(DATA_ZATH, DONE);
}
}
}
}
}
events.ScheduleEvent(EVENT_CHECK_TIMER, 5000, 0, PHASE_ONE);
break;
case EVENT_FRENZY:
DoCast(me, SPELL_FRENZY);
events.ScheduleEvent(EVENT_FRENZY, 30000, 0, PHASE_TWO);
break;
case EVENT_FORCEPUNCH:
DoCastVictim(SPELL_FORCEPUNCH, true);
events.ScheduleEvent(EVENT_FORCEPUNCH, urand(16000, 21000), 0, PHASE_TWO);
break;
case EVENT_CHARGE:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
{
DoCast(target, SPELL_CHARGE);
DoResetThreat();
AttackStart(target);
}
events.ScheduleEvent(EVENT_CHARGE, urand(15000, 22000), 0, PHASE_TWO);
break;
case EVENT_ENRAGE:
if (HealthBelowPct(11) && !Enraged)
{
DoCast(me, SPELL_ENRAGE);
Enraged = true;
}
events.ScheduleEvent(EVENT_ENRAGE, 30000);
break;
case EVENT_SUMMONTIGERS:
DoCastVictim(SPELL_SUMMONTIGERS, true);
events.ScheduleEvent(EVENT_SUMMONTIGERS, urand(10000, 14000), 0, PHASE_TWO);
break;
default:
break;
}
if (PhaseTwo)
{
switch (eventId)
{
case EVENT_FRENZY:
DoCast(me, SPELL_FRENZY);
events.ScheduleEvent(EVENT_FRENZY, 30000);
break;
case EVENT_FORCEPUNCH:
DoCastVictim(SPELL_FORCEPUNCH, true);
events.ScheduleEvent(EVENT_FORCEPUNCH, 16000, 21000);
break;
case EVENT_CHARGE:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
{
DoCast(target, SPELL_CHARGE);
DoResetThreat();
AttackStart(target);
}
events.ScheduleEvent(EVENT_CHARGE, 15000, 22000);
break;
case EVENT_ENRAGE:
if (HealthBelowPct(11) && !Enraged)
{
DoCast(me, SPELL_ENRAGE);
Enraged = true;
}
events.ScheduleEvent(EVENT_ENRAGE, 30000);
break;
case EVENT_SUMMONTIGERS:
DoCastVictim(SPELL_SUMMONTIGERS, true);
events.ScheduleEvent(EVENT_SUMMONTIGERS, urand(10000, 14000));
break;
default:
break;
}
if (me->IsFullHealth() && WasDead)
WasDead = false;
if (me->IsFullHealth() && WasDead)
{
WasDead = false;
}
if ((events.GetPhaseMask() == PHASE_ONE) && !WasDead && !HealthAbovePct(5))
{
me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT);
me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE);
me->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetStandState(UNIT_STAND_STATE_SLEEP);
me->AttackStop();
if (instance)
instance->SetData(DATA_THEKAL, SPECIAL);
WasDead=true;
}
}
DoMeleeAttackIfReady();
}
};

View File

@@ -42,7 +42,6 @@ enum Spells
SPELL_HOLY_NOVA = 23858,
SPELL_HOLY_FIRE = 23860,
SPELL_HOLY_WRATH = 23979,
// snake form
SPELL_POISON_CLOUD = 23861,
SPELL_VENOM_SPIT = 23862,
@@ -50,7 +49,6 @@ enum Spells
SPELL_PARASITIC_SERPENT = 23865,
SPELL_SUMMON_PARASITIC_SERPENT = 23866,
SPELL_PARASITIC_SERPENT_TRIGGER = 23867,
// used when swapping event-stages
SPELL_VENOXIS_TRANSFORM = 23849, // 50% health - shapechange to cobra
SPELL_FRENZY = 8269 // 20% health - frenzy