Merge pull request #12813 from MitchesD/misc_2

Scripts/ScarletMonastery: rewritten InstanceScript and some bosses conve...
This commit is contained in:
Duarte Duarte
2014-08-21 14:45:32 +01:00
12 changed files with 616 additions and 470 deletions
@@ -70,6 +70,11 @@ class boss_arcanist_doan : public CreatureScript
events.ScheduleEvent(EVENT_POLYMORPH, 30 * IN_MILLISECONDS);
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
@@ -119,7 +124,7 @@ class boss_arcanist_doan : public CreatureScript
CreatureAI* GetAI(Creature* creature) const override
{
return new boss_arcanist_doanAI(creature);
return GetInstanceAI<boss_arcanist_doanAI>(creature);
}
};
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
* Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -25,79 +24,104 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "scarlet_monastery.h"
enum Spells
{
SPELL_CALLOFTHEGRAVE = 17831,
SPELL_CALL_OF_THE_GRAVE = 17831,
SPELL_TERRIFY = 7399,
SPELL_SOULSIPHON = 7290
SPELL_SOUL_SIPHON = 7290
};
enum Events
{
EVENT_CALL_OF_GRAVE = 1,
EVENT_TERRIFY,
EVENT_SOUL_SIPHON
};
class boss_azshir_the_sleepless : public CreatureScript
{
public:
boss_azshir_the_sleepless() : CreatureScript("boss_azshir_the_sleepless") { }
public:
boss_azshir_the_sleepless() : CreatureScript("boss_azshir_the_sleepless") { }
CreatureAI* GetAI(Creature* creature) const override
{
return new boss_azshir_the_sleeplessAI(creature);
}
struct boss_azshir_the_sleeplessAI : public ScriptedAI
{
boss_azshir_the_sleeplessAI(Creature* creature) : ScriptedAI(creature) { }
uint32 SoulSiphon_Timer;
uint32 CallOftheGrave_Timer;
uint32 Terrify_Timer;
void Reset() override
struct boss_azshir_the_sleeplessAI : public BossAI
{
SoulSiphon_Timer = 1;
CallOftheGrave_Timer = 30000;
Terrify_Timer = 20000;
}
void EnterCombat(Unit* /*who*/) override { }
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
//If we are <50% hp cast Soul Siphon rank 1
if (!HealthAbovePct(50) && !me->IsNonMeleeSpellCast(false))
boss_azshir_the_sleeplessAI(Creature* creature) : BossAI(creature, DATA_AZSHIR)
{
//SoulSiphon_Timer
if (SoulSiphon_Timer <= diff)
_siphon = false;
}
void Reset() override
{
_Reset();
_siphon = false;
}
void EnterCombat(Unit* /*who*/) override
{
_EnterCombat();
events.ScheduleEvent(EVENT_CALL_OF_GRAVE, 30000);
events.ScheduleEvent(EVENT_TERRIFY, 20000);
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
}
void DamageTaken(Unit* /*done_by*/, uint32& /*damage*/) override
{
if (HealthBelowPct(50) && !_siphon)
{
DoCastVictim(SPELL_SOULSIPHON);
DoCastVictim(SPELL_SOUL_SIPHON);
events.ScheduleEvent(EVENT_SOUL_SIPHON, 20000);
_siphon = true;
}
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
//SoulSiphon_Timer = 20000;
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_CALL_OF_GRAVE:
DoCastVictim(SPELL_CALL_OF_THE_GRAVE);
events.ScheduleEvent(EVENT_CALL_OF_GRAVE, 30000);
break;
case EVENT_TERRIFY:
DoCastVictim(SPELL_TERRIFY);
events.ScheduleEvent(EVENT_TERRIFY, 20000);
break;
case EVENT_SOUL_SIPHON:
DoCastVictim(SPELL_SOUL_SIPHON);
events.ScheduleEvent(EVENT_SOUL_SIPHON, 20000);
break;
default:
break;
}
}
else SoulSiphon_Timer -= diff;
DoMeleeAttackIfReady();
}
//CallOfTheGrave_Timer
if (CallOftheGrave_Timer <= diff)
{
DoCastVictim(SPELL_CALLOFTHEGRAVE);
CallOftheGrave_Timer = 30000;
}
else CallOftheGrave_Timer -= diff;
private:
bool _siphon;
};
//Terrify_Timer
if (Terrify_Timer <= diff)
{
DoCastVictim(SPELL_TERRIFY);
Terrify_Timer = 20000;
}
else Terrify_Timer -= diff;
DoMeleeAttackIfReady();
CreatureAI* GetAI(Creature* creature) const override
{
return GetInstanceAI<boss_azshir_the_sleeplessAI>(creature);
}
};
};
void AddSC_boss_azshir_the_sleepless()
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
* Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -16,15 +15,9 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* ScriptData
SDName: Boss_Bloodmage_Thalnos
SD%Complete: 100
SDComment:
SDCategory: Scarlet Monastery
EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "scarlet_monastery.h"
enum Yells
{
@@ -38,95 +31,102 @@ enum Spells
SPELL_FLAMESHOCK = 8053,
SPELL_SHADOWBOLT = 1106,
SPELL_FLAMESPIKE = 8814,
SPELL_FIRENOVA = 16079,
SPELL_FIRENOVA = 16079
};
enum Events
{
EVENT_FLAME_SHOCK = 1,
EVENT_SHADOW_BOLT,
EVENT_FLAME_SPIKE,
EVENT_FIRE_NOVA
};
class boss_bloodmage_thalnos : public CreatureScript
{
public:
boss_bloodmage_thalnos() : CreatureScript("boss_bloodmage_thalnos") { }
public:
boss_bloodmage_thalnos() : CreatureScript("boss_bloodmage_thalnos") { }
CreatureAI* GetAI(Creature* creature) const override
{
return new boss_bloodmage_thalnosAI(creature);
}
struct boss_bloodmage_thalnosAI : public ScriptedAI
{
boss_bloodmage_thalnosAI(Creature* creature) : ScriptedAI(creature) { }
bool HpYell;
uint32 FlameShock_Timer;
uint32 ShadowBolt_Timer;
uint32 FlameSpike_Timer;
uint32 FireNova_Timer;
void Reset() override
struct boss_bloodmage_thalnosAI : public BossAI
{
HpYell = false;
FlameShock_Timer = 10000;
ShadowBolt_Timer = 2000;
FlameSpike_Timer = 8000;
FireNova_Timer = 40000;
}
boss_bloodmage_thalnosAI(Creature* creature) : BossAI(creature, DATA_BLOODMAGE_THALNOS)
{
_hpYell = false;
}
void EnterCombat(Unit* /*who*/) override
void Reset() override
{
_hpYell = false;
_Reset();
}
void EnterCombat(Unit* /*who*/) override
{
Talk(SAY_AGGRO);
_EnterCombat();
events.ScheduleEvent(EVENT_FLAME_SHOCK, 10000);
events.ScheduleEvent(EVENT_SHADOW_BOLT, 2000);
events.ScheduleEvent(EVENT_FLAME_SPIKE, 8000);
events.ScheduleEvent(EVENT_FIRE_NOVA, 40000);
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
}
void KilledUnit(Unit* /*victim*/) override
{
Talk(SAY_KILL);
}
void DamageTaken(Unit* /*done_by*/, uint32& /*damage*/) override
{
if (HealthBelowPct(35) && !_hpYell)
{
Talk(SAY_HEALTH);
_hpYell = true;
}
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_FLAME_SHOCK:
DoCastVictim(SPELL_FLAMESHOCK);
events.ScheduleEvent(EVENT_FLAME_SHOCK, urand(10000, 15000));
break;
case EVENT_SHADOW_BOLT:
DoCastVictim(SPELL_SHADOWBOLT);
events.ScheduleEvent(EVENT_SHADOW_BOLT, 2000);
break;
case EVENT_FLAME_SPIKE:
DoCastVictim(SPELL_FLAMESPIKE);
events.ScheduleEvent(EVENT_FLAME_SPIKE, 30000);
break;
case EVENT_FIRE_NOVA:
DoCastVictim(SPELL_FIRENOVA);
events.ScheduleEvent(EVENT_FIRE_NOVA, 40000);
break;
default:
break;
}
}
void UpdateAI(uint32 diff) override
{
BossAI::UpdateAI(diff);
}
private:
bool _hpYell;
};
CreatureAI* GetAI(Creature* creature) const override
{
Talk(SAY_AGGRO);
return GetInstanceAI<boss_bloodmage_thalnosAI>(creature);
}
void KilledUnit(Unit* /*Victim*/) override
{
Talk(SAY_KILL);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
//If we are <35% hp
if (!HpYell && !HealthAbovePct(35))
{
Talk(SAY_HEALTH);
HpYell = true;
}
//FlameShock_Timer
if (FlameShock_Timer <= diff)
{
DoCastVictim(SPELL_FLAMESHOCK);
FlameShock_Timer = urand(10000, 15000);
}
else FlameShock_Timer -= diff;
//FlameSpike_Timer
if (FlameSpike_Timer <= diff)
{
DoCastVictim(SPELL_FLAMESPIKE);
FlameSpike_Timer = 30000;
}
else FlameSpike_Timer -= diff;
//FireNova_Timer
if (FireNova_Timer <= diff)
{
DoCastVictim(SPELL_FIRENOVA);
FireNova_Timer = 40000;
}
else FireNova_Timer -= diff;
//ShadowBolt_Timer
if (ShadowBolt_Timer <= diff)
{
DoCastVictim(SPELL_SHADOWBOLT);
ShadowBolt_Timer = 2000;
}
else ShadowBolt_Timer -= diff;
DoMeleeAttackIfReady();
}
};
};
void AddSC_boss_bloodmage_thalnos()
@@ -155,13 +155,13 @@ public:
{
npc_wisp_invisAI(Creature* creature) : ScriptedAI(creature)
{
Creaturetype = delay = spell = spell2 = 0;
Creaturetype = delay = _spell = _spell2 = 0;
}
uint32 Creaturetype;
uint32 delay;
uint32 spell;
uint32 spell2;
uint32 _spell;
uint32 _spell2;
void Reset() override { }
void EnterCombat(Unit* /*who*/) override { }
void SetType(uint32 _type)
@@ -169,24 +169,24 @@ public:
switch (Creaturetype = _type)
{
case 1:
spell = SPELL_PUMPKIN_AURA_GREEN;
_spell = SPELL_PUMPKIN_AURA_GREEN;
break;
case 2:
delay = 15000;
spell = SPELL_BODY_FLAME;
spell2 = SPELL_DEATH;
_spell = SPELL_BODY_FLAME;
_spell2 = SPELL_DEATH;
break;
case 3:
delay = 15000;
spell = SPELL_SMOKE;
_spell = SPELL_SMOKE;
break;
case 4:
delay = 7000;
spell2 = SPELL_WISP_BLUE;
_spell2 = SPELL_WISP_BLUE;
break;
}
if (spell)
DoCast(me, spell);
if (_spell)
DoCast(me, _spell);
}
void SpellHit(Unit* /*caster*/, const SpellInfo* spell) override
@@ -196,7 +196,6 @@ public:
}
void MoveInLineOfSight(Unit* who) override
{
if (!who || Creaturetype != 1 || !who->isTargetableForAttack())
return;
@@ -212,8 +211,8 @@ public:
if (delay <= diff)
{
me->RemoveAurasDueToSpell(SPELL_SMOKE);
if (spell2)
DoCast(me, spell2);
if (_spell2)
DoCast(me, _spell2);
delay = 0;
} else delay -= diff;
}
@@ -435,7 +434,7 @@ public:
}
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
//instance->SetData(DATA_HORSEMAN_EVENT, NOT_STARTED);
//instance->SetBossState(DATA_HORSEMAN_EVENT, NOT_STARTED);
}
void FlyMode()
@@ -471,7 +470,7 @@ public:
break;
}
case 6:
instance->SetData(GAMEOBJECT_PUMPKIN_SHRINE, 0); //hide gameobject
instance->SetData(DATA_PUMPKIN_SHRINE, 0); //hide gameobject
break;
case 19:
me->SetDisableGravity(false);
@@ -493,7 +492,7 @@ public:
void EnterCombat(Unit* /*who*/) override
{
instance->SetData(DATA_HORSEMAN_EVENT, IN_PROGRESS);
instance->SetBossState(DATA_HORSEMAN_EVENT, IN_PROGRESS);
DoZoneInCombat();
}
@@ -503,7 +502,6 @@ public:
}
void MoveInLineOfSight(Unit* who) override
{
if (withhead && Phase != 0)
ScriptedAI::MoveInLineOfSight(who);
@@ -567,7 +565,7 @@ public:
flame->CastSpell(flame, SPELL_BODY_FLAME, false);
if (Creature* wisp = DoSpawnCreature(WISP_INVIS, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 60000))
ENSURE_AI(npc_wisp_invis::npc_wisp_invisAI, wisp->AI())->SetType(4);
instance->SetData(DATA_HORSEMAN_EVENT, DONE);
instance->SetBossState(DATA_HORSEMAN_EVENT, DONE);
Map::PlayerList const& players = me->GetMap()->GetPlayers();
if (!players.isEmpty())
@@ -852,7 +850,6 @@ public:
}
void MoveInLineOfSight(Unit* who) override
{
if (!who || !me->IsValidAttackTarget(who) || me->GetVictim())
return;
@@ -880,9 +877,9 @@ public:
InstanceScript* instance = player->GetInstanceScript();
if (instance)
{
if (instance->GetData(DATA_HORSEMAN_EVENT) != NOT_STARTED)
if (instance->GetBossState(DATA_HORSEMAN_EVENT) != NOT_STARTED)
return true;
instance->SetData(DATA_HORSEMAN_EVENT, IN_PROGRESS);
instance->SetBossState(DATA_HORSEMAN_EVENT, IN_PROGRESS);
}
/* if (soil->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER && player->getLevel() > 64)
{
@@ -26,6 +26,7 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "ScriptedEscortAI.h"
#include "scarlet_monastery.h"
enum Says
{
@@ -44,89 +45,103 @@ enum Spells
SPELL_FRENZY = 8269
};
enum Entry
enum Npcs
{
ENTRY_SCARLET_TRAINEE = 6575,
ENTRY_SCARLET_MYRMIDON = 4295
NPC_SCARLET_TRAINEE = 6575,
NPC_SCARLET_MYRMIDON = 4295
};
enum Events
{
EVENT_CLEAVE = 1,
EVENT_WHIRLWIND
};
Position const ScarletTraineePos = { 1939.18f, -431.58f, 17.09f, 6.22f };
class boss_herod : public CreatureScript
{
public:
boss_herod() : CreatureScript("boss_herod") { }
public:
boss_herod() : CreatureScript("boss_herod") { }
CreatureAI* GetAI(Creature* creature) const override
{
return new boss_herodAI(creature);
}
struct boss_herodAI : public ScriptedAI
{
boss_herodAI(Creature* creature) : ScriptedAI(creature) { }
bool Enrage;
uint32 Cleave_Timer;
uint32 Whirlwind_Timer;
void Reset() override
struct boss_herodAI : public BossAI
{
Enrage = false;
Cleave_Timer = 12000;
Whirlwind_Timer = 60000;
}
void EnterCombat(Unit* /*who*/) override
{
Talk(SAY_AGGRO);
DoCast(me, SPELL_RUSHINGCHARGE);
}
void KilledUnit(Unit* /*victim*/) override
{
Talk(SAY_KILL);
}
void JustDied(Unit* /*killer*/) override
{
for (uint8 i = 0; i < 20; ++i)
me->SummonCreature(ENTRY_SCARLET_TRAINEE, 1939.18f, -431.58f, 17.09f, 6.22f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 600000);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
//If we are <30% hp goes Enraged
if (!Enrage && !HealthAbovePct(30) && !me->IsNonMeleeSpellCast(false))
boss_herodAI(Creature* creature) : BossAI(creature, DATA_HEROD)
{
Talk(EMOTE_ENRAGE);
Talk(SAY_ENRAGE);
DoCast(me, SPELL_FRENZY);
Enrage = true;
_enrage = false;
}
//Cleave_Timer
if (Cleave_Timer <= diff)
void Reset() override
{
DoCastVictim(SPELL_CLEAVE);
Cleave_Timer = 12000;
_enrage = false;
_Reset();
}
else Cleave_Timer -= diff;
// Whirlwind_Timer
if (Whirlwind_Timer <= diff)
void EnterCombat(Unit* /*who*/) override
{
Talk(SAY_WHIRLWIND);
DoCastVictim(SPELL_WHIRLWIND);
Whirlwind_Timer = 30000;
}
else Whirlwind_Timer -= diff;
Talk(SAY_AGGRO);
DoCast(me, SPELL_RUSHINGCHARGE);
_EnterCombat();
DoMeleeAttackIfReady();
events.ScheduleEvent(EVENT_CLEAVE, 12000);
events.ScheduleEvent(EVENT_WHIRLWIND, 60000);
}
void KilledUnit(Unit* /*victim*/) override
{
Talk(SAY_KILL);
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
for (uint8 i = 0; i < 20; ++i)
me->SummonCreature(NPC_SCARLET_TRAINEE, ScarletTraineePos, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 600000);
}
void DamageTaken(Unit* /*done_by*/, uint32& /*damage*/) override
{
if (HealthBelowPct(30) && !_enrage)
{
Talk(EMOTE_ENRAGE);
Talk(SAY_ENRAGE);
DoCast(me, SPELL_FRENZY);
_enrage = true;
}
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_CLEAVE:
DoCastVictim(SPELL_CLEAVE);
events.ScheduleEvent(EVENT_CLEAVE, 12000);
break;
case EVENT_WHIRLWIND:
Talk(SAY_WHIRLWIND);
DoCastVictim(SPELL_WHIRLWIND);
events.ScheduleEvent(EVENT_WHIRLWIND, 30000);
break;
default:
break;
}
}
void UpdateAI(uint32 diff) override
{
BossAI::UpdateAI(diff);
}
private:
bool _enrage;
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetInstanceAI<boss_herodAI>(creature);
}
};
};
class npc_scarlet_trainee : public CreatureScript
@@ -25,6 +25,7 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "scarlet_monastery.h"
enum Spells
{
@@ -43,12 +44,15 @@ public:
CreatureAI* GetAI(Creature* creature) const override
{
return new boss_high_inquisitor_fairbanksAI(creature);
return GetInstanceAI<boss_high_inquisitor_fairbanksAI>(creature);
}
struct boss_high_inquisitor_fairbanksAI : public ScriptedAI
{
boss_high_inquisitor_fairbanksAI(Creature* creature) : ScriptedAI(creature) { }
boss_high_inquisitor_fairbanksAI(Creature* creature) : ScriptedAI(creature)
{
instance = creature->GetInstanceScript();
}
uint32 CurseOfBlood_Timer;
uint32 DispelMagic_Timer;
@@ -57,6 +61,7 @@ public:
uint32 Sleep_Timer;
uint32 Dispel_Timer;
bool PowerWordShield;
InstanceScript* instance;
void Reset() override
{
@@ -69,12 +74,19 @@ public:
PowerWordShield = false;
me->SetStandState(UNIT_STAND_STATE_DEAD);
me->SetUInt32Value(UNIT_FIELD_BYTES_1, 7);
instance->SetBossState(DATA_HIGH_INQUISITOR_FAIRBANKS, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) override
{
me->SetStandState(UNIT_STAND_STATE_STAND);
me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
instance->SetBossState(DATA_HIGH_INQUISITOR_FAIRBANKS, IN_PROGRESS);
}
void JustDied(Unit* /*killer*/) override
{
instance->SetBossState(DATA_HIGH_INQUISITOR_FAIRBANKS, DONE);
}
void UpdateAI(uint32 diff) override
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
* Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -16,15 +15,9 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* ScriptData
SDName: Boss_Houndmaster_Loksey
SD%Complete: 100
SDComment:
SDCategory: Scarlet Monastery
EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "scarlet_monastery.h"
enum Yells
{
@@ -37,47 +30,60 @@ enum Spells
SPELL_BLOODLUST = 6742
};
enum Events
{
EVENT_BLOODLUST = 1
};
class boss_houndmaster_loksey : public CreatureScript
{
public:
boss_houndmaster_loksey() : CreatureScript("boss_houndmaster_loksey") { }
public:
boss_houndmaster_loksey() : CreatureScript("boss_houndmaster_loksey") { }
CreatureAI* GetAI(Creature* creature) const override
{
return new boss_houndmaster_lokseyAI(creature);
}
struct boss_houndmaster_lokseyAI : public ScriptedAI
{
boss_houndmaster_lokseyAI(Creature* creature) : ScriptedAI(creature) { }
uint32 BloodLust_Timer;
void Reset() override
struct boss_houndmaster_lokseyAI : public BossAI
{
BloodLust_Timer = 20000;
}
boss_houndmaster_lokseyAI(Creature* creature) : BossAI(creature, DATA_HOUNDMASTER_LOKSEY) { }
void EnterCombat(Unit* /*who*/) override
{
Talk(SAY_AGGRO);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
if (BloodLust_Timer <= diff)
void Reset() override
{
DoCast(me, SPELL_BLOODLUST);
BloodLust_Timer = 20000;
_Reset();
}
else BloodLust_Timer -= diff;
DoMeleeAttackIfReady();
void EnterCombat(Unit* /*who*/) override
{
Talk(SAY_AGGRO);
_EnterCombat();
events.ScheduleEvent(EVENT_BLOODLUST, 20000);
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_BLOODLUST:
DoCast(me, SPELL_BLOODLUST);
events.ScheduleEvent(EVENT_BLOODLUST, 20000);
break;
default:
break;
}
}
void UpdateAI(uint32 diff) override
{
BossAI::UpdateAI(diff);
}
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetInstanceAI<boss_houndmaster_lokseyAI>(creature);
}
};
};
void AddSC_boss_houndmaster_loksey()
@@ -69,11 +69,13 @@ public:
ShadowWordPain_Timer = 5000;
Yell60 = false;
Yell30 = false;
instance->SetBossState(DATA_INTERROGATOR_VISHAS, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) override
{
Talk(SAY_AGGRO);
instance->SetBossState(DATA_INTERROGATOR_VISHAS, IN_PROGRESS);
}
void KilledUnit(Unit* /*Victim*/) override
@@ -86,6 +88,7 @@ public:
//Any other Actions to do with vorrel? setStandState?
if (Creature* vorrel = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_VORREL)))
vorrel->AI()->Talk(SAY_TRIGGER_VORREL);
instance->SetBossState(DATA_INTERROGATOR_VISHAS, DONE);
}
void UpdateAI(uint32 diff) override
@@ -95,7 +95,7 @@ public:
me->SetStandState(UNIT_STAND_STATE_STAND);
if (me->IsAlive())
instance->SetData(TYPE_MOGRAINE_AND_WHITE_EVENT, NOT_STARTED);
instance->SetBossState(DATA_MOGRAINE_AND_WHITE_EVENT, NOT_STARTED);
_bHasDied = false;
_bHeal = false;
@@ -104,8 +104,8 @@ public:
void JustReachedHome() override
{
if (instance->GetData(TYPE_MOGRAINE_AND_WHITE_EVENT) != NOT_STARTED)
instance->SetData(TYPE_MOGRAINE_AND_WHITE_EVENT, FAIL);
if (instance->GetBossState(DATA_MOGRAINE_AND_WHITE_EVENT) != NOT_STARTED)
instance->SetBossState(DATA_MOGRAINE_AND_WHITE_EVENT, FAIL);
}
void EnterCombat(Unit* /*who*/) override
@@ -129,7 +129,7 @@ public:
//On first death, fake death and open door, as well as initiate whitemane if exist
if (Unit* Whitemane = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_WHITEMANE)))
{
instance->SetData(TYPE_MOGRAINE_AND_WHITE_EVENT, IN_PROGRESS);
instance->SetBossState(DATA_MOGRAINE_AND_WHITE_EVENT, IN_PROGRESS);
Whitemane->GetMotionMaster()->MovePoint(1, 1163.113370f, 1398.856812f, 32.527786f);
@@ -163,7 +163,7 @@ public:
Talk(SAY_MO_RESURRECTED);
_bFakeDeath = false;
instance->SetData(TYPE_MOGRAINE_AND_WHITE_EVENT, SPECIAL);
instance->SetBossState(DATA_MOGRAINE_AND_WHITE_EVENT, SPECIAL);
}
}
@@ -172,7 +172,7 @@ public:
if (!UpdateVictim())
return;
if (_bHasDied && !_bHeal && instance->GetData(TYPE_MOGRAINE_AND_WHITE_EVENT) == SPECIAL)
if (_bHasDied && !_bHeal && instance->GetBossState(DATA_MOGRAINE_AND_WHITE_EVENT) == SPECIAL)
{
//On resurrection, stop fake death and heal whitemane and resume fight
if (Unit* Whitemane = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_WHITEMANE)))
@@ -254,12 +254,12 @@ public:
_bCanResurrect = false;
if (me->IsAlive())
instance->SetData(TYPE_MOGRAINE_AND_WHITE_EVENT, NOT_STARTED);
instance->SetBossState(DATA_MOGRAINE_AND_WHITE_EVENT, NOT_STARTED);
}
void AttackStart(Unit* who) override
{
if (instance->GetData(TYPE_MOGRAINE_AND_WHITE_EVENT) == NOT_STARTED)
if (instance->GetBossState(DATA_MOGRAINE_AND_WHITE_EVENT) == NOT_STARTED)
return;
ScriptedAI::AttackStart(who);
@@ -25,84 +25,87 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "scarlet_monastery.h"
enum Spells
{
SPELL_LICHSLAP = 28873,
SPELL_FROSTBOLTVOLLEY = 8398,
SPELL_FROSTBOLT_VOLLEY = 8398,
SPELL_MINDFLAY = 17313,
SPELL_FROSTNOVA = 15531
};
enum Events
{
EVENT_LICH_SLAP = 1,
EVENT_FROSTBOLT_VOLLEY,
EVENT_MIND_FLAY,
EVENT_FROST_NOVA
};
class boss_scorn : public CreatureScript
{
public:
boss_scorn() : CreatureScript("boss_scorn") { }
public:
boss_scorn() : CreatureScript("boss_scorn") { }
CreatureAI* GetAI(Creature* creature) const override
{
return new boss_scornAI(creature);
}
struct boss_scornAI : public ScriptedAI
{
boss_scornAI(Creature* creature) : ScriptedAI(creature) { }
uint32 LichSlap_Timer;
uint32 FrostboltVolley_Timer;
uint32 MindFlay_Timer;
uint32 FrostNova_Timer;
void Reset() override
struct boss_scornAI : public BossAI
{
LichSlap_Timer = 45000;
FrostboltVolley_Timer = 30000;
MindFlay_Timer = 30000;
FrostNova_Timer = 30000;
}
boss_scornAI(Creature* creature) : BossAI(creature, DATA_SCORN) { }
void EnterCombat(Unit* /*who*/) override { }
void Reset() override
{
_Reset();
}
void UpdateAI(uint32 diff) override
void EnterCombat(Unit* /*who*/) override
{
_EnterCombat();
events.ScheduleEvent(EVENT_LICH_SLAP, 45000);
events.ScheduleEvent(EVENT_FROSTBOLT_VOLLEY, 30000);
events.ScheduleEvent(EVENT_MIND_FLAY, 30000);
events.ScheduleEvent(EVENT_FROST_NOVA, 30000);
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
}
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_LICH_SLAP:
DoCastVictim(SPELL_LICHSLAP);
events.ScheduleEvent(EVENT_LICH_SLAP, 45000);
break;
case EVENT_FROSTBOLT_VOLLEY:
DoCastVictim(SPELL_FROSTBOLT_VOLLEY);
events.ScheduleEvent(EVENT_FROSTBOLT_VOLLEY, 20000);
break;
case EVENT_MIND_FLAY:
DoCastVictim(SPELL_MINDFLAY);
events.ScheduleEvent(EVENT_MIND_FLAY, 20000);
break;
case EVENT_FROST_NOVA:
DoCastVictim(SPELL_FROSTNOVA);
events.ScheduleEvent(EVENT_FROST_NOVA, 15000);
break;
default:
break;
}
}
void UpdateAI(uint32 diff) override
{
BossAI::UpdateAI(diff);
}
};
CreatureAI* GetAI(Creature* creature) const override
{
if (!UpdateVictim())
return;
//LichSlap_Timer
if (LichSlap_Timer <= diff)
{
DoCastVictim(SPELL_LICHSLAP);
LichSlap_Timer = 45000;
}
else LichSlap_Timer -= diff;
//FrostboltVolley_Timer
if (FrostboltVolley_Timer <= diff)
{
DoCastVictim(SPELL_FROSTBOLTVOLLEY);
FrostboltVolley_Timer = 20000;
}
else FrostboltVolley_Timer -= diff;
//MindFlay_Timer
if (MindFlay_Timer <= diff)
{
DoCastVictim(SPELL_MINDFLAY);
MindFlay_Timer = 20000;
}
else MindFlay_Timer -= diff;
//FrostNova_Timer
if (FrostNova_Timer <= diff)
{
DoCastVictim(SPELL_FROSTNOVA);
FrostNova_Timer = 15000;
}
else FrostNova_Timer -= diff;
DoMeleeAttackIfReady();
return GetInstanceAI<boss_scornAI>(creature);
}
};
};
void AddSC_boss_scorn()
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
* Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -16,146 +15,205 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* ScriptData
SDName: Instance_Scarlet_Monastery
SD%Complete: 50
SDComment:
SDCategory: Scarlet Monastery
EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "InstanceScript.h"
#include "scarlet_monastery.h"
enum Entry
DoorData const doorData[] =
{
ENTRY_PUMPKIN_SHRINE = 186267,
ENTRY_HORSEMAN = 23682,
ENTRY_HEAD = 23775,
ENTRY_PUMPKIN = 23694
{ GO_HIGH_INQUISITORS_DOOR, DATA_MOGRAINE_AND_WHITE_EVENT, DOOR_TYPE_ROOM, BOUNDARY_NONE },
{ 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
};
#define MAX_ENCOUNTER 2
class instance_scarlet_monastery : public InstanceMapScript
{
public:
instance_scarlet_monastery() : InstanceMapScript("instance_scarlet_monastery", 189) { }
public:
instance_scarlet_monastery() : InstanceMapScript("instance_scarlet_monastery", 189) { }
InstanceScript* GetInstanceScript(InstanceMap* map) const override
{
return new instance_scarlet_monastery_InstanceMapScript(map);
}
struct instance_scarlet_monastery_InstanceMapScript : public InstanceScript
{
instance_scarlet_monastery_InstanceMapScript(Map* map) : InstanceScript(map) { }
uint64 PumpkinShrineGUID;
uint64 HorsemanGUID;
uint64 HeadGUID;
std::set<uint64> HorsemanAdds;
uint64 MograineGUID;
uint64 WhitemaneGUID;
uint64 VorrelGUID;
uint64 DoorHighInquisitorGUID;
uint32 encounter[MAX_ENCOUNTER];
void Initialize() override
struct instance_scarlet_monastery_InstanceMapScript : public InstanceScript
{
memset(&encounter, 0, sizeof(encounter));
PumpkinShrineGUID = 0;
HorsemanGUID = 0;
HeadGUID = 0;
HorsemanAdds.clear();
MograineGUID = 0;
WhitemaneGUID = 0;
VorrelGUID = 0;
DoorHighInquisitorGUID = 0;
}
void OnGameObjectCreate(GameObject* go) override
{
switch (go->GetEntry())
instance_scarlet_monastery_InstanceMapScript(Map* map) : InstanceScript(map)
{
case ENTRY_PUMPKIN_SHRINE: PumpkinShrineGUID = go->GetGUID();break;
case 104600: DoorHighInquisitorGUID = go->GetGUID(); break;
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
PumpkinShrineGUID = 0;
HorsemanGUID = 0;
HeadGUID = 0;
MograineGUID = 0;
WhitemaneGUID = 0;
VorrelGUID = 0;
HorsemanAdds.clear();
}
}
void OnCreatureCreate(Creature* creature) override
{
switch (creature->GetEntry())
void OnGameObjectCreate(GameObject* go) override
{
case ENTRY_HORSEMAN: HorsemanGUID = creature->GetGUID(); break;
case ENTRY_HEAD: HeadGUID = creature->GetGUID(); break;
case ENTRY_PUMPKIN: HorsemanAdds.insert(creature->GetGUID());break;
case 3976: MograineGUID = creature->GetGUID(); break;
case 3977: WhitemaneGUID = creature->GetGUID(); break;
case 3981: VorrelGUID = creature->GetGUID(); break;
}
}
void SetData(uint32 type, uint32 data) override
{
switch (type)
{
case TYPE_MOGRAINE_AND_WHITE_EVENT:
if (data == IN_PROGRESS)
DoUseDoorOrButton(DoorHighInquisitorGUID);
if (data == FAIL)
DoUseDoorOrButton(DoorHighInquisitorGUID);
encounter[0] = data;
break;
case GAMEOBJECT_PUMPKIN_SHRINE:
HandleGameObject(PumpkinShrineGUID, false);
break;
case DATA_HORSEMAN_EVENT:
encounter[1] = data;
if (data == DONE)
switch (go->GetEntry())
{
for (std::set<uint64>::const_iterator itr = HorsemanAdds.begin(); itr != HorsemanAdds.end(); ++itr)
{
Creature* add = instance->GetCreature(*itr);
if (add && add->IsAlive())
add->Kill(add);
}
HorsemanAdds.clear();
HandleGameObject(PumpkinShrineGUID, false);
case GO_PUMPKIN_SHRINE:
PumpkinShrineGUID = go->GetGUID();
break;
case GO_HIGH_INQUISITORS_DOOR:
AddDoor(go, true);
break;
default:
break;
}
break;
}
}
uint64 GetData64(uint32 type) const override
{
switch (type)
void OnGameObjectRemove(GameObject* go) override
{
//case GAMEOBJECT_PUMPKIN_SHRINE: return PumpkinShrineGUID;
//case DATA_HORSEMAN: return HorsemanGUID;
//case DATA_HEAD: return HeadGUID;
case DATA_MOGRAINE: return MograineGUID;
case DATA_WHITEMANE: return WhitemaneGUID;
case DATA_VORREL: return VorrelGUID;
case DATA_DOOR_WHITEMANE: return DoorHighInquisitorGUID;
switch (go->GetEntry())
{
case GO_HIGH_INQUISITORS_DOOR:
AddDoor(go, false);
break;
default:
break;
}
}
return 0;
}
uint32 GetData(uint32 type) const override
void OnCreatureCreate(Creature* creature) override
{
switch (creature->GetEntry())
{
case NPC_HORSEMAN:
HorsemanGUID = creature->GetGUID();
break;
case NPC_HEAD:
HeadGUID = creature->GetGUID();
break;
case NPC_PUMPKIN:
HorsemanAdds.insert(creature->GetGUID());
break;
case NPC_MOGRAINE:
MograineGUID = creature->GetGUID();
break;
case NPC_WHITEMANE:
WhitemaneGUID = creature->GetGUID();
break;
case NPC_VORREL:
VorrelGUID = creature->GetGUID();
break;
default:
break;
}
}
void SetData(uint32 type, uint32 /*data*/) override
{
switch (type)
{
case DATA_PUMPKIN_SHRINE:
HandleGameObject(PumpkinShrineGUID, false);
break;
default:
break;
}
}
bool SetBossState(uint32 type, EncounterState state) override
{
if (!InstanceScript::SetBossState(type, state))
return false;
switch (type)
{
case DATA_HORSEMAN_EVENT:
if (state == DONE)
{
for (uint64 guid : HorsemanAdds)
{
Creature* add = instance->GetCreature(guid);
if (add && add->IsAlive())
add->Kill(add);
}
HorsemanAdds.clear();
HandleGameObject(PumpkinShrineGUID, false);
}
break;
default:
break;
}
return true;
}
uint64 GetData64(uint32 type) const override
{
switch (type)
{
case DATA_MOGRAINE:
return MograineGUID;
case DATA_WHITEMANE:
return WhitemaneGUID;
case DATA_VORREL:
return VorrelGUID;
default:
break;
}
return 0;
}
std::string GetSaveData() override
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << "S M " << GetBossSaveData();
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
}
void Load(const char* str) override
{
if (!str)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(str);
char dataHead1, dataHead2;
std::istringstream loadStream(str);
loadStream >> dataHead1 >> dataHead2;
if (dataHead1 == 'S' && dataHead2 == 'M')
{
for (uint8 i = 0; i < EncounterCount; ++i)
{
uint32 tmpState;
loadStream >> tmpState;
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
tmpState = NOT_STARTED;
SetBossState(i, EncounterState(tmpState));
}
}
else
OUT_LOAD_INST_DATA_FAIL;
OUT_LOAD_INST_DATA_COMPLETE;
}
protected:
uint64 PumpkinShrineGUID;
uint64 HorsemanGUID;
uint64 HeadGUID;
uint64 MograineGUID;
uint64 WhitemaneGUID;
uint64 VorrelGUID;
std::set<uint64> HorsemanAdds;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override
{
if (type == TYPE_MOGRAINE_AND_WHITE_EVENT)
return encounter[0];
if (type == DATA_HORSEMAN_EVENT)
return encounter[1];
return 0;
return new instance_scarlet_monastery_InstanceMapScript(map);
}
};
};
void AddSC_instance_scarlet_monastery()
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
* Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -19,19 +18,43 @@
#ifndef SCARLET_M_
#define SCARLET_M_
uint32 const EncounterCount = 10;
enum DataTypes
{
TYPE_MOGRAINE_AND_WHITE_EVENT = 1,
DATA_MOGRAINE_AND_WHITE_EVENT = 1,
DATA_MOGRAINE = 2,
DATA_WHITEMANE = 3,
DATA_DOOR_WHITEMANE = 4,
DATA_HORSEMAN_EVENT = 5,
GAMEOBJECT_PUMPKIN_SHRINE = 6,
DATA_HORSEMAN_EVENT = 4,
DATA_PUMPKIN_SHRINE = 5,
DATA_VORREL = 7,
DATA_ARCANIST_DOAN = 8
DATA_VORREL = 6,
DATA_ARCANIST_DOAN = 7,
DATA_AZSHIR = 8,
DATA_BLOODMAGE_THALNOS = 9,
DATA_HEROD = 10,
DATA_HIGH_INQUISITOR_FAIRBANKS = 11,
DATA_HOUNDMASTER_LOKSEY = 12,
DATA_INTERROGATOR_VISHAS = 13,
DATA_SCORN = 14
};
enum CreatureIds
{
NPC_MOGRAINE = 3976,
NPC_WHITEMANE = 3977,
NPC_VORREL = 3981,
NPC_HORSEMAN = 23682,
NPC_HEAD = 23775,
NPC_PUMPKIN = 23694
};
enum GameObjectIds
{
GO_HIGH_INQUISITORS_DOOR = 104600,
GO_PUMPKIN_SHRINE = 186267
};
#endif // SCARLET_M_