aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp462
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp9
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_illucia_barov.cpp9
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp9
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp6
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp9
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp9
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_the_ravenian.cpp9
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp74
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/scholomance.h31
10 files changed, 367 insertions, 260 deletions
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp
index 471f28835cd..1b5aaf83288 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp
@@ -18,214 +18,344 @@
/* ScriptData
SDName: Boss_Darkmaster_Gandling
-SD%Complete: 75
-SDComment: Doors missing in instance script.
+SD%Complete: 90
+SDComment: Doors Not yet reopening.
SDCategory: Scholomance
EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "scholomance.h"
+#include "SpellScript.h"
-#define SPELL_ARCANEMISSILES 22272
-#define SPELL_SHADOWSHIELD 22417 //Not right ID. But 12040 is wrong either.
-#define SPELL_CURSE 18702
-
-#define ADD_1X 170.205f
-#define ADD_1Y 99.413f
-#define ADD_1Z 104.733f
-#define ADD_1O 3.16f
-
-#define ADD_2X 170.813f
-#define ADD_2Y 97.857f
-#define ADD_2Z 104.713f
-#define ADD_2O 3.16f
+enum Says
+{
+ YELL_SUMMONED = 0
+};
-#define ADD_3X 170.720f
-#define ADD_3Y 100.900f
-#define ADD_3Z 104.739f
-#define ADD_3O 3.16f
+enum Spells
+{
+ SPELL_ARCANEMISSILES = 15790,
+ SPELL_SHADOWSHIELD = 12040,
+ SPELL_CURSE = 18702,
+ SPELL_SHADOW_PORTAL = 17950
+};
-#define ADD_4X 171.866f
-#define ADD_4Y 99.373f
-#define ADD_4Z 104.732f
-#define ADD_4O 3.16f
+enum Events
+{
+ EVENT_ARCANEMISSILES = 1,
+ EVENT_SHADOWSHIELD = 2,
+ EVENT_CURSE = 3,
+ EVENT_SHADOW_PORTAL = 4
+};
class boss_darkmaster_gandling : public CreatureScript
{
-public:
- boss_darkmaster_gandling() : CreatureScript("boss_darkmaster_gandling") { }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new boss_darkmaster_gandlingAI (creature);
- }
+ public: boss_darkmaster_gandling() : CreatureScript("boss_darkmaster_gandling") { }
- struct boss_darkmaster_gandlingAI : public ScriptedAI
- {
- boss_darkmaster_gandlingAI(Creature* creature) : ScriptedAI(creature)
+ struct boss_darkmaster_gandlingAI : public BossAI
{
- instance = me->GetInstanceScript();
- }
+ boss_darkmaster_gandlingAI(Creature* creature) : BossAI(creature, DATA_DARKMASTERGANDLING) {}
- InstanceScript* instance;
+ void Reset()
+ {
+ if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_GANDLING)))
+ gate->SetGoState(GO_STATE_ACTIVE);
+ }
+
+ void JustDied(Unit* /*killer*/)
+ {
+ if (instance)
+ instance->SetData(DATA_DARKMASTERGANDLING, DONE);
+ if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_GANDLING)))
+ gate->SetGoState(GO_STATE_ACTIVE);
+ }
+
+ void EnterCombat(Unit* /*who*/)
+ {
+ events.ScheduleEvent(EVENT_ARCANEMISSILES, 4500);
+ events.ScheduleEvent(EVENT_SHADOWSHIELD, 12000);
+ events.ScheduleEvent(EVENT_CURSE, 2000);
+ events.ScheduleEvent(EVENT_SHADOW_PORTAL, 16000);
+
+ if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_GANDLING)))
+ gate->SetGoState(GO_STATE_READY);
+ }
- uint32 ArcaneMissiles_Timer;
- uint32 ShadowShield_Timer;
- uint32 Curse_Timer;
- uint32 Teleport_Timer;
+ void IsSummonedBy(Unit* /*summoner*/)
+ {
+ Talk(YELL_SUMMONED);
+ me->GetMotionMaster()->MoveRandom(5);
+ }
- void Reset()
+ void UpdateAI(uint32 const diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_ARCANEMISSILES:
+ DoCastVictim(SPELL_ARCANEMISSILES, true);
+ events.ScheduleEvent(EVENT_ARCANEMISSILES, 8000);
+ break;
+ case EVENT_SHADOWSHIELD:
+ DoCast(me, SPELL_SHADOWSHIELD);
+ events.ScheduleEvent(EVENT_SHADOWSHIELD, urand(14000, 28000));
+ break;
+ case EVENT_CURSE:
+ DoCastVictim(SPELL_CURSE, true);
+ events.ScheduleEvent(EVENT_CURSE, urand(15000, 27000));
+ break;
+ case EVENT_SHADOW_PORTAL:
+ if (HealthAbovePct(3))
+ {
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM,0, 100, true),SPELL_SHADOW_PORTAL,true);
+ events.ScheduleEvent(EVENT_SHADOW_PORTAL, urand(17000, 27000));
+ }
+ }
+ }
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
{
- ArcaneMissiles_Timer = 4500;
- ShadowShield_Timer = 12000;
- Curse_Timer = 2000;
- Teleport_Timer = 16000;
+ return new boss_darkmaster_gandlingAI (creature);
}
+};
- void EnterCombat(Unit* /*who*/)
+// Script for Shadow Portal spell 17950
+enum Rooms
+{
+ ROOM_HALL_OF_SECRETS = 0,
+ ROOM_HALL_OF_THE_DAMNED = 1,
+ ROOM_THE_COVEN = 2,
+ ROOM_THE_SHADOW_VAULT = 3,
+ ROOM_BAROV_FAMILY_VAULT = 4,
+ ROOM_VAULT_OF_THE_RAVENIAN = 5
+};
+
+enum SPSpells
+{
+ SPELL_SHADOW_PORTAL_HALLOFSECRETS = 17863,
+ SPELL_SHADOW_PORTAL_HALLOFTHEDAMNED = 17939,
+ SPELL_SHADOW_PORTAL_THECOVEN = 17943,
+ SPELL_SHADOW_PORTAL_THESHADOWVAULT = 17944,
+ SPELL_SHADOW_PORTAL_BAROVFAMILYVAULT = 17946,
+ SPELL_SHADOW_PORTAL_VAULTOFTHERAVENIAN = 17948
+};
+
+class spell_shadow_portal : public SpellScriptLoader
+{
+ public:
+ spell_shadow_portal() : SpellScriptLoader("spell_shadow_portal") { }
+
+ class spell_shadow_portal_SpellScript : public SpellScript
{
- }
+ PrepareSpellScript(spell_shadow_portal_SpellScript);
+
+ void HandleCast(SpellEffIndex /*effIndex*/)
+ {
+ Creature* caster = GetCaster()->ToCreature();
+ int8 attempts = 0;
+ int32 spell_to_cast =0;
+
+ while (!spell_to_cast)
+ {
+ if (attempts++ >= 6) break;
+
+ switch (urand(0,5))
+ {
+ case ROOM_HALL_OF_SECRETS:
+ if (InstanceScript* instance = GetCaster()->GetInstanceScript())
+ if (GameObject::GetGameObject(*caster, instance->GetData64(GO_GATE_RAVENIAN))->GetGoState() == GO_STATE_ACTIVE)
+ spell_to_cast = SPELL_SHADOW_PORTAL_HALLOFSECRETS;
+ break;
+ case ROOM_HALL_OF_THE_DAMNED:
+ if (InstanceScript* instance = GetCaster()->GetInstanceScript())
+ if (GameObject::GetGameObject(*caster, instance->GetData64(GO_GATE_THEOLEN))->GetGoState() == GO_STATE_ACTIVE)
+ spell_to_cast = SPELL_SHADOW_PORTAL_HALLOFTHEDAMNED;
+ break;
+ case ROOM_THE_COVEN:
+ if (InstanceScript* instance = GetCaster()->GetInstanceScript())
+ if (GameObject::GetGameObject(*caster, instance->GetData64(GO_GATE_MALICIA))->GetGoState() == GO_STATE_ACTIVE)
+ spell_to_cast = SPELL_SHADOW_PORTAL_THECOVEN;
+ break;
+ case ROOM_THE_SHADOW_VAULT:
+ if (InstanceScript* instance = GetCaster()->GetInstanceScript())
+ if (GameObject::GetGameObject(*caster, instance->GetData64(GO_GATE_ILLUCIA))->GetGoState() == GO_STATE_ACTIVE)
+ spell_to_cast = SPELL_SHADOW_PORTAL_THESHADOWVAULT;
+ break;
+ case ROOM_BAROV_FAMILY_VAULT:
+ if (InstanceScript* instance = GetCaster()->GetInstanceScript())
+ if (GameObject::GetGameObject(*caster, instance->GetData64(GO_GATE_BAROV))->GetGoState() == GO_STATE_ACTIVE)
+ spell_to_cast = SPELL_SHADOW_PORTAL_BAROVFAMILYVAULT;
+ break;
+ case ROOM_VAULT_OF_THE_RAVENIAN:
+ if (InstanceScript* instance = GetCaster()->GetInstanceScript())
+ if (GameObject::GetGameObject(*caster, instance->GetData64(GO_GATE_POLKELT))->GetGoState() == GO_STATE_ACTIVE)
+ spell_to_cast = SPELL_SHADOW_PORTAL_VAULTOFTHERAVENIAN;
+ break;
+ }
+
+ if (spell_to_cast)
+ GetHitUnit()->CastSpell(GetHitUnit(), spell_to_cast);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_shadow_portal_SpellScript::HandleCast, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
- void JustDied(Unit* /*killer*/)
+ SpellScript* GetSpellScript() const
{
- if (instance)
- instance->SetData(TYPE_GANDLING, DONE);
+ return new spell_shadow_portal_SpellScript();
}
+};
+
+// Script for Shadow Portal spells 17863,17939,17943,17944,17946,17948
+Position const SummonPos[18] =
+{
+ // Hall of Secrects
+
+
+
+ // The Hall of the damned
+ { 177.9624f, -68.23893f, 84.95197f, 3.228859f },
+ { 183.7705f, -61.43489f, 84.92424f, 5.148721f },
+ { 184.7035f, -77.74805f, 84.92424f, 4.660029f },
+ // The Coven
+ { 111.7203f, -1.105035f, 85.45985f, 3.961897f },
+ { 118.0079f, 6.430664f, 85.31169f, 2.408554f },
+ { 120.0276f, -7.496636f, 85.31169f, 2.984513f },
+ // The Shadow Vault
+ { 245.3716f, 0.628038f, 72.73877f, 0.01745329f },
+ { 240.9920f, 3.405653f, 72.73877f, 6.143559f },
+ { 240.9543f, -3.182943f, 72.73877f, 0.2268928f },
+ // Barov Family Vault
+ { 181.8245f, -42.58117f, 75.4812f, 4.660029f },
+ { 177.7456f, -42.74745f, 75.4812f, 4.886922f },
+ { 185.6157f, -42.91200f, 75.4812f, 4.45059f },
+ // Vault of the Ravenian
+
+
+
+};
- void UpdateAI(const uint32 diff)
+enum Creatures
+{
+ NPC_RISEN_GUARDIAN = 11598
+};
+
+enum ScriptEventId
+{
+ SPELL_EVENT_HALLOFSECRETS = 5618,
+ SPELL_EVENT_HALLOFTHEDAMNED = 5619,
+ SPELL_EVENT_THECOVEN = 5620,
+ SPELL_EVENT_THESHADOWVAULT = 5621,
+ SPELL_EVENT_BAROVFAMILYVAULT = 5622,
+ SPELL_EVENT_VAULTOFTHERAVENIAN = 5623
+};
+
+class spell_shadow_portal_rooms : public SpellScriptLoader
+{
+ public:
+ spell_shadow_portal_rooms() : SpellScriptLoader("spell_shadow_portal_rooms") { }
+
+ class spell_shadow_portal_rooms_SpellScript : public SpellScript
{
- if (!UpdateVictim())
- return;
+ PrepareSpellScript(spell_shadow_portal_rooms_SpellScript);
- //ArcaneMissiles_Timer
- if (ArcaneMissiles_Timer <= diff)
+ void HandleSendEvent(SpellEffIndex effIndex)
{
- DoCast(me->getVictim(), SPELL_ARCANEMISSILES);
- ArcaneMissiles_Timer = 8000;
- } else ArcaneMissiles_Timer -= diff;
+ // If only one player in threat list fail spell
- //ShadowShield_Timer
- if (ShadowShield_Timer <= diff)
- {
- DoCast(me, SPELL_SHADOWSHIELD);
- ShadowShield_Timer = urand(14000, 28000);
- } else ShadowShield_Timer -= diff;
+ Creature* Summoned = NULL;
+ Creature* caster = GetCaster()->ToCreature();
- //Curse_Timer
- if (Curse_Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_CURSE);
- Curse_Timer = urand(15000, 27000);
- } else Curse_Timer -= diff;
+ int8 pos_to_summon = 0;
+ int8 phase_to_set = 0;
+ int32 gate_to_close = 0;
- //Teleporting Random Target to one of the six pre boss rooms and spawn 3-4 skeletons near the gamer.
- //We will only telport if gandling has more than 3% of hp so teleported gamers can always loot.
- if (HealthAbovePct(3))
- {
- if (Teleport_Timer <= diff)
+ switch (GetSpellInfo()->Effects[effIndex].MiscValue)
{
- Unit* target = NULL;
- target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target && target->GetTypeId() == TYPEID_PLAYER)
- {
- if (DoGetThreat(target))
- DoModifyThreatPercent(target, -100);
+ case SPELL_EVENT_HALLOFSECRETS:
+ pos_to_summon = 0; // Not yet spawned
+ phase_to_set = 1;
+ gate_to_close = GO_GATE_RAVENIAN;
+ break;
+ case SPELL_EVENT_HALLOFTHEDAMNED:
+ pos_to_summon = 0;
+ phase_to_set = 2;
+ gate_to_close = GO_GATE_THEOLEN;
+ break;
+ case SPELL_EVENT_THECOVEN:
+ pos_to_summon = 3;
+ phase_to_set = 3;
+ gate_to_close = GO_GATE_MALICIA;
+ break;
+ case SPELL_EVENT_THESHADOWVAULT:
+ pos_to_summon = 6;
+ phase_to_set = 4;
+ gate_to_close = GO_GATE_ILLUCIA;
+ break;
+ case SPELL_EVENT_BAROVFAMILYVAULT:
+ pos_to_summon = 9;
+ phase_to_set = 5;
+ gate_to_close = GO_GATE_BAROV;
+ break;
+ case SPELL_EVENT_VAULTOFTHERAVENIAN:
+ pos_to_summon = 0; // Not yet spawned
+ phase_to_set = 6;
+ gate_to_close = GO_GATE_POLKELT;
+ break;
+ default:
+ break;
+ }
- Creature* Summoned = NULL;
- switch (rand()%6)
+ if (gate_to_close && (GetCaster()->GetMap()->GetId() == 289))
+ {
+ for (uint8 i = 0; i < 3; ++i)
+ {
+ Summoned = GetCaster()->SummonCreature(NPC_RISEN_GUARDIAN, SummonPos[pos_to_summon++], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 120000);
+ if (Summoned)
{
- case 0:
- DoTeleportPlayer(target, 250.0696f, 0.3921f, 84.8408f, 3.149f);
- Summoned = me->SummonCreature(16119, 254.2325f, 0.3417f, 84.8407f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- Summoned = me->SummonCreature(16119, 257.7133f, 4.0226f, 84.8407f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- Summoned = me->SummonCreature(16119, 258.6702f, -2.60656f, 84.8407f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- break;
- case 1:
- DoTeleportPlayer(target, 181.4220f, -91.9481f, 84.8410f, 1.608f);
- Summoned = me->SummonCreature(16119, 184.0519f, -73.5649f, 84.8407f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- Summoned = me->SummonCreature(16119, 179.5951f, -73.7045f, 84.8407f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- Summoned = me->SummonCreature(16119, 180.6452f, -78.2143f, 84.8407f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- Summoned = me->SummonCreature(16119, 283.2274f, -78.1518f, 84.8407f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- break;
- case 2:
- DoTeleportPlayer(target, 95.1547f, -1.8173f, 85.2289f, 0.043f);
- Summoned = me->SummonCreature(16119, 100.9404f, -1.8016f, 85.2289f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- Summoned = me->SummonCreature(16119, 101.3729f, 0.4882f, 85.2289f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- Summoned = me->SummonCreature(16119, 101.4596f, -4.4740f, 85.2289f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- break;
- case 3:
- DoTeleportPlayer(target, 250.0696f, 0.3921f, 72.6722f, 3.149f);
- Summoned = me->SummonCreature(16119, 240.34481f, 0.7368f, 72.6722f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- Summoned = me->SummonCreature(16119, 240.3633f, -2.9520f, 72.6722f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- Summoned = me->SummonCreature(16119, 240.6702f, 3.34949f, 72.6722f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- break;
- case 4:
- DoTeleportPlayer(target, 181.4220f, -91.9481f, 70.7734f, 1.608f);
- Summoned = me->SummonCreature(16119, 184.0519f, -73.5649f, 70.7734f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- Summoned = me->SummonCreature(16119, 179.5951f, -73.7045f, 70.7734f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- Summoned = me->SummonCreature(16119, 180.6452f, -78.2143f, 70.7734f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- Summoned = me->SummonCreature(16119, 283.2274f, -78.1518f, 70.7734f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- break;
- case 5:
- DoTeleportPlayer(target, 106.1541f, -1.8994f, 75.3663f, 0.043f);
- Summoned = me->SummonCreature(16119, 115.3945f, -1.5555f, 75.3663f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- Summoned = me->SummonCreature(16119, 257.7133f, 1.8066f, 75.3663f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- Summoned = me->SummonCreature(16119, 258.6702f, -5.1001f, 75.3663f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (Summoned)
- Summoned->AI()->AttackStart(target);
- break;
+ Summoned->GetMotionMaster()->MoveRandom(5);
+ Summoned->AI()->SetData(0,phase_to_set);
}
}
- Teleport_Timer = urand(20000, 35000);
- } else Teleport_Timer -= diff;
+
+ if (InstanceScript* instance = GetCaster()->GetInstanceScript())
+ if (GameObject* gate = GameObject::GetGameObject(*caster, instance->GetData64(gate_to_close)))
+ gate->SetGoState(GO_STATE_READY);
+ }
}
- DoMeleeAttackIfReady();
- }
- };
+ void Register()
+ {
+ OnEffectHit += SpellEffectFn(spell_shadow_portal_rooms_SpellScript::HandleSendEvent, EFFECT_1, SPELL_EFFECT_SEND_EVENT);
+ }
+ };
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_shadow_portal_rooms_SpellScript();
+ }
};
void AddSC_boss_darkmaster_gandling()
{
new boss_darkmaster_gandling();
+ new spell_shadow_portal();
+ new spell_shadow_portal_rooms();
}
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp
index ea60b0ce333..fbc0ec4fd3e 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp
@@ -58,17 +58,8 @@ class boss_doctor_theolen_krastinov : public CreatureScript
void JustDied(Unit* /*killer*/)
{
- InstanceScript* instance = me->GetInstanceScript();
if (instance)
- {
instance->SetData(DATA_DOCTORTHEOLENKRASTINOV, DONE);
-
- if (instance->GetData(TYPE_GANDLING) == IN_PROGRESS)
- {
- instance->SetData(TYPE_GANDLING, IN_PROGRESS);
- me->SummonCreature(1853, 180.73f, -9.43856f, 75.507f, 1.61399f, TEMPSUMMON_DEAD_DESPAWN, 0);
- }
- }
}
void EnterCombat(Unit* /*who*/)
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_illucia_barov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_illucia_barov.cpp
index 54fc9e4a17e..59a1eaf87a4 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_illucia_barov.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_illucia_barov.cpp
@@ -55,17 +55,8 @@ class boss_illucia_barov : public CreatureScript
void JustDied(Unit* /*killer*/)
{
- InstanceScript* instance = me->GetInstanceScript();
if (instance)
- {
instance->SetData(DATA_LADYILLUCIABAROV, DONE);
-
- if (instance->GetData(TYPE_GANDLING) == IN_PROGRESS)
- {
- instance->SetData(TYPE_GANDLING, IN_PROGRESS);
- me->SummonCreature(1853, 180.73f, -9.43856f, 75.507f, 1.61399f, TEMPSUMMON_DEAD_DESPAWN, 0);
- }
- }
}
void EnterCombat(Unit* /*who*/)
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp
index daf03f41db5..d7234da00ce 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp
@@ -64,17 +64,8 @@ class boss_instructor_malicia : public CreatureScript
void JustDied(Unit* /*killer*/)
{
- InstanceScript* instance = me->GetInstanceScript();
if (instance)
- {
instance->SetData(DATA_INSTRUCTORMALICIA, DONE);
-
- if (instance->GetData(TYPE_GANDLING) == IN_PROGRESS)
- {
- instance->SetData(TYPE_GANDLING, IN_PROGRESS);
- me->SummonCreature(1853, 180.73f, -9.43856f, 75.507f, 1.61399f, TEMPSUMMON_DEAD_DESPAWN, 0);
- }
- }
}
void EnterCombat(Unit* /*who*/)
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp
index 68d7dcdebe8..9d8f448964c 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp
@@ -57,7 +57,7 @@ enum Events
EVENT_KIRTONOS_TRANSFORM = 14
};
-enum Misc
+enum eMisc
{
WEAPON_KIRTONOS_STAFF = 11365,
POINT_KIRTONOS_LAND = 13,
@@ -70,7 +70,7 @@ class boss_kirtonos_the_herald : public CreatureScript
struct boss_kirtonos_the_heraldAI : public BossAI
{
- boss_kirtonos_the_heraldAI(Creature* creature) : BossAI(creature, TYPE_KIRTONOS) { }
+ boss_kirtonos_the_heraldAI(Creature* creature) : BossAI(creature, DATA_KIRTONOS) { }
void Reset()
{
@@ -104,7 +104,7 @@ class boss_kirtonos_the_herald : public CreatureScript
brazier->SetGoState(GO_STATE_READY);
}
if (instance)
- instance->SetData(TYPE_KIRTONOS, DONE);
+ instance->SetData(DATA_KIRTONOS, DONE);
}
void EnterEvadeMode()
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp
index 55ef0605c31..01a36cc678a 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp
@@ -54,17 +54,8 @@ class boss_lord_alexei_barov : public CreatureScript
void JustDied(Unit* /*killer*/)
{
- InstanceScript* instance = me->GetInstanceScript();
if (instance)
- {
instance->SetData(DATA_LORDALEXEIBAROV, DONE);
-
- if (instance->GetData(TYPE_GANDLING) == IN_PROGRESS)
- {
- instance->SetData(TYPE_GANDLING, IN_PROGRESS);
- me->SummonCreature(1853, 180.73f, -9.43856f, 75.507f, 1.61399f, TEMPSUMMON_DEAD_DESPAWN, 0);
- }
- }
}
void EnterCombat(Unit* /*who*/)
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp
index cc9180ded76..effd321dfe9 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp
@@ -55,17 +55,8 @@ class boss_lorekeeper_polkelt : public CreatureScript
void JustDied(Unit* /*killer*/)
{
- InstanceScript* instance = me->GetInstanceScript();
if (instance)
- {
instance->SetData(DATA_LOREKEEPERPOLKELT, DONE);
-
- if (instance->GetData(TYPE_GANDLING) == IN_PROGRESS)
- {
- instance->SetData(TYPE_GANDLING, IN_PROGRESS);
- me->SummonCreature(1853, 180.73f, -9.43856f, 75.507f, 1.61399f, TEMPSUMMON_DEAD_DESPAWN, 0);
- }
- }
}
void EnterCombat(Unit* /*who*/)
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_the_ravenian.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_the_ravenian.cpp
index 5a6f5d436c4..9ebee93a6bc 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_the_ravenian.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_the_ravenian.cpp
@@ -56,17 +56,8 @@ class boss_the_ravenian : public CreatureScript
void JustDied(Unit* /*killer*/)
{
- InstanceScript* instance = me->GetInstanceScript();
if (instance)
- {
instance->SetData(DATA_THERAVENIAN, DONE);
-
- if (instance->GetData(TYPE_GANDLING) == IN_PROGRESS)
- {
- instance->SetData(TYPE_GANDLING, IN_PROGRESS);
- me->SummonCreature(1853, 180.73f, -9.43856f, 75.507f, 1.61399f, TEMPSUMMON_DEAD_DESPAWN, 0);
- }
- }
}
void EnterCombat(Unit* /*who*/)
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp b/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp
index 04a12ae2bd2..b91b7ee605d 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp
@@ -27,6 +27,13 @@ EndScriptData */
#include "InstanceScript.h"
#include "scholomance.h"
+enum CreatureId
+{
+ NPC_DARKMASTER_GANDLING = 1853
+};
+
+Position const GandlingLoc = {180.7712f, -5.428603f, 75.57024f, 1.291544f};
+
class instance_scholomance : public InstanceMapScript
{
public:
@@ -42,9 +49,7 @@ public:
instance_scholomance_InstanceMapScript(Map* map) : InstanceScript(map) {}
//Lord Alexei Barov, Doctor Theolen Krastinov, The Ravenian, Lorekeeper Polkelt, Instructor Malicia and the Lady Illucia Barov.
- bool IsBossDied[6];
uint32 m_auiEncounter[MAX_ENCOUNTER];
-
uint64 GateKirtonosGUID;
uint64 GateGandlingGUID;
uint64 GateMiliciaGUID;
@@ -57,8 +62,6 @@ public:
void Initialize()
{
- memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
-
GateKirtonosGUID = 0;
GateGandlingGUID = 0;
GateMiliciaGUID = 0;
@@ -69,8 +72,8 @@ public:
GateIlluciaGUID = 0;
BrazierOfTheHeraldGUID = 0;
- for (uint8 i = 0; i < 6; ++i)
- IsBossDied[i] = false;
+ for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
+ m_auiEncounter[i] = NOT_STARTED;
}
void OnGameObjectCreate(GameObject* go)
@@ -94,37 +97,43 @@ public:
switch (type)
{
case DATA_LORDALEXEIBAROV:
- IsBossDied[0] = true;
+ m_auiEncounter[DATA_LORDALEXEIBAROV] = data;
+ CheckToSpawnGandling();
break;
case DATA_DOCTORTHEOLENKRASTINOV:
- IsBossDied[1] = true;
+ m_auiEncounter[DATA_DOCTORTHEOLENKRASTINOV] = data;
+ CheckToSpawnGandling();
break;
case DATA_THERAVENIAN:
- IsBossDied[2] = true;
+ m_auiEncounter[DATA_THERAVENIAN] = data;
+ CheckToSpawnGandling();
break;
case DATA_LOREKEEPERPOLKELT:
- IsBossDied[3] = true;
+ m_auiEncounter[DATA_LOREKEEPERPOLKELT] = data;
+ CheckToSpawnGandling();
break;
case DATA_INSTRUCTORMALICIA:
- IsBossDied[4] = true;
+ m_auiEncounter[DATA_INSTRUCTORMALICIA] = data;
+ CheckToSpawnGandling();
break;
case DATA_LADYILLUCIABAROV:
- IsBossDied[5] = true;
+ m_auiEncounter[DATA_LADYILLUCIABAROV] = data;
+ CheckToSpawnGandling();
break;
- case TYPE_GANDLING:
- m_auiEncounter[0] = data;
+ case DATA_DARKMASTERGANDLING:
+ m_auiEncounter[DATA_DARKMASTERGANDLING] = data;
break;
- case TYPE_KIRTONOS:
- m_auiEncounter[1] = data;
+ case DATA_KIRTONOS:
+ m_auiEncounter[DATA_KIRTONOS] = data;
break;
}
}
uint32 GetData(uint32 type) const
{
- return (type == TYPE_GANDLING &&
- IsBossDied[0] && IsBossDied[1] && IsBossDied[2] &&
- IsBossDied[3] && IsBossDied[4] && IsBossDied[5])
+ return type == (m_auiEncounter[DATA_LORDALEXEIBAROV] == DONE) && (m_auiEncounter[DATA_DOCTORTHEOLENKRASTINOV] == DONE) &&
+ (m_auiEncounter[DATA_THERAVENIAN] == DONE) && (m_auiEncounter[DATA_LOREKEEPERPOLKELT] == DONE) &&
+ (m_auiEncounter[DATA_INSTRUCTORMALICIA] == DONE) && (m_auiEncounter[DATA_LADYILLUCIABAROV] == DONE)
? IN_PROGRESS : 0;
}
@@ -132,14 +141,33 @@ public:
{
switch (type)
{
- case GO_GATE_KIRTONOS:
- return GateKirtonosGUID;
- case GO_BRAZIER_OF_THE_HERALD:
- return BrazierOfTheHeraldGUID;
+ case GO_GATE_KIRTONOS: return GateKirtonosGUID; break;
+ case GO_GATE_GANDLING: return GateGandlingGUID; break;
+ case GO_GATE_MALICIA: return GateMiliciaGUID; break;
+ case GO_GATE_THEOLEN: return GateTheolenGUID; break;
+ case GO_GATE_POLKELT: return GatePolkeltGUID; break;
+ case GO_GATE_RAVENIAN: return GateRavenianGUID; break;
+ case GO_GATE_BAROV: return GateBarovGUID; break;
+ case GO_GATE_ILLUCIA: return GateIlluciaGUID; break;
+ case GO_BRAZIER_OF_THE_HERALD: return BrazierOfTheHeraldGUID; break;
}
return 0;
}
+
+ void CheckToSpawnGandling()
+ {
+ if (GetData(DATA_DARKMASTERGANDLING) == IN_PROGRESS)
+ {
+ Map::PlayerList const &PlayerList = instance->GetPlayers();
+ if (PlayerList.isEmpty())
+ return;
+
+ Map::PlayerList::const_iterator i = PlayerList.begin();
+ if (Player* i_pl = i->getSource())
+ i_pl->SummonCreature(NPC_DARKMASTER_GANDLING, GandlingLoc);
+ }
+ }
};
};
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h b/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h
index f89f36d91e5..53916b2e37c 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h
+++ b/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h
@@ -19,31 +19,34 @@
#ifndef DEF_SCHOLOMANCE_H
#define DEF_SCHOLOMANCE_H
-uint32 const MAX_ENCOUNTER = 2;
-
enum DataTypes
{
- TYPE_GANDLING = 1,
- DATA_DOCTORTHEOLENKRASTINOV = 2,
- DATA_INSTRUCTORMALICIA = 3,
- DATA_LADYILLUCIABAROV = 4,
- DATA_LORDALEXEIBAROV = 5,
- DATA_LOREKEEPERPOLKELT = 6,
- DATA_THERAVENIAN = 7,
- TYPE_KIRTONOS = 8
+ DATA_DOCTORTHEOLENKRASTINOV = 0,
+ DATA_INSTRUCTORMALICIA = 1,
+ DATA_LADYILLUCIABAROV = 2,
+ DATA_LORDALEXEIBAROV = 3,
+ DATA_LOREKEEPERPOLKELT = 4,
+ DATA_THERAVENIAN = 5,
+ DATA_DARKMASTERGANDLING = 6,
+ DATA_KIRTONOS = 7
};
enum GameobjectIds
{
GO_GATE_KIRTONOS = 175570,
GO_GATE_GANDLING = 177374,
- GO_GATE_MALICIA = 177375,
- GO_GATE_THEOLEN = 177377,
- GO_GATE_POLKELT = 177376,
GO_GATE_RAVENIAN = 177372,
- GO_GATE_BAROV = 177373,
+ GO_GATE_THEOLEN = 177377,
GO_GATE_ILLUCIA = 177371,
+ GO_GATE_MALICIA = 177375,
+ GO_GATE_BAROV = 177373,
+ GO_GATE_POLKELT = 177376,
GO_BRAZIER_OF_THE_HERALD = 175564
};
+enum Misc
+{
+ MAX_ENCOUNTER = 8
+};
+
#endif