aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/scripts')
-rw-r--r--src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp130
-rw-r--r--src/server/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp133
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp1
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp6
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp98
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp18
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp142
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp6
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp129
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h70
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp282
-rw-r--r--src/server/scripts/Kalimdor/zone_the_barrens.cpp8
-rw-r--r--src/server/scripts/Northrend/Gundrak/boss_eck.cpp146
-rw-r--r--src/server/scripts/Northrend/Gundrak/gundrak.h6
-rw-r--r--src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp21
-rw-r--r--src/server/scripts/Northrend/zone_borean_tundra.cpp182
-rw-r--r--src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp2
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp1
-rw-r--r--src/server/scripts/Outland/zone_shattrath_city.cpp69
-rw-r--r--src/server/scripts/World/npcs_special.cpp101
23 files changed, 615 insertions, 944 deletions
diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp
index ca46ff36079..651e487522d 100644
--- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp
+++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp
@@ -72,7 +72,7 @@ public:
void Reset() override
{
Initialize();
-
+ events.Reset();
summons.DespawnAll();
}
diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp
index 49c5a61b7d0..d9b0c1490b5 100644
--- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp
+++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_drekthar.cpp
@@ -30,12 +30,21 @@ enum Spells
SPELL_STORMPIKE = 51876 // not sure
};
-enum Yells
+enum Texts
{
- YELL_AGGRO = 0,
- YELL_EVADE = 1,
- YELL_RESPAWN = 2,
- YELL_RANDOM = 3
+ SAY_AGGRO = 0,
+ SAY_EVADE = 1,
+ SAY_RESPAWN = 2,
+ SAY_RANDOM = 3
+};
+
+enum Events
+{
+ EVENT_WHIRLWIND = 1,
+ EVENT_WHIRLWIND2,
+ EVENT_KNOCKDOWN,
+ EVENT_FRENZY,
+ EVENT_RANDOM_YELL
};
class boss_drekthar : public CreatureScript
@@ -45,92 +54,85 @@ public:
struct boss_drektharAI : public ScriptedAI
{
- boss_drektharAI(Creature* creature) : ScriptedAI(creature)
- {
- Initialize();
- }
-
- void Initialize()
- {
- WhirlwindTimer = urand(1 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
- Whirlwind2Timer = urand(1 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
- KnockdownTimer = 12 * IN_MILLISECONDS;
- FrenzyTimer = 6 * IN_MILLISECONDS;
- ResetTimer = 5 * IN_MILLISECONDS;
- YellTimer = urand(20 * IN_MILLISECONDS, 30 * IN_MILLISECONDS); //20 to 30 seconds
- }
-
- uint32 WhirlwindTimer;
- uint32 Whirlwind2Timer;
- uint32 KnockdownTimer;
- uint32 FrenzyTimer;
- uint32 YellTimer;
- uint32 ResetTimer;
+ boss_drektharAI(Creature* creature) : ScriptedAI(creature) { }
void Reset() override
{
- Initialize();
+ events.Reset();
}
void EnterCombat(Unit* /*who*/) override
{
- Talk(YELL_AGGRO);
+ Talk(SAY_AGGRO);
+ events.ScheduleEvent(EVENT_WHIRLWIND, urand(1 * IN_MILLISECONDS, 20 * IN_MILLISECONDS));
+ events.ScheduleEvent(EVENT_WHIRLWIND2, urand(1 * IN_MILLISECONDS, 20 * IN_MILLISECONDS));
+ events.ScheduleEvent(EVENT_KNOCKDOWN, 12 * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_FRENZY, 6 * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_RANDOM_YELL, urand(20 * IN_MILLISECONDS, 30 * IN_MILLISECONDS)); //20 to 30 seconds
}
void JustRespawned() override
{
Reset();
- Talk(YELL_RESPAWN);
+ Talk(SAY_RESPAWN);
}
- void UpdateAI(uint32 diff) override
+ bool CheckInRoom()
{
- if (!UpdateVictim())
- return;
-
- if (WhirlwindTimer <= diff)
+ if (me->GetDistance2d(me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY()) > 50)
{
- DoCastVictim(SPELL_WHIRLWIND);
- WhirlwindTimer = urand(8 * IN_MILLISECONDS, 18 * IN_MILLISECONDS);
- } else WhirlwindTimer -= diff;
+ EnterEvadeMode();
+ Talk(SAY_EVADE);
+ return false;
+ }
- if (Whirlwind2Timer <= diff)
- {
- DoCastVictim(SPELL_WHIRLWIND2);
- Whirlwind2Timer = urand(7 * IN_MILLISECONDS, 25 * IN_MILLISECONDS);
- } else Whirlwind2Timer -= diff;
+ return true;
+ }
- if (KnockdownTimer <= diff)
- {
- DoCastVictim(SPELL_KNOCKDOWN);
- KnockdownTimer = urand(10 * IN_MILLISECONDS, 15 * IN_MILLISECONDS);
- } else KnockdownTimer -= diff;
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim() || !CheckInRoom())
+ return;
- if (FrenzyTimer <= diff)
- {
- DoCastVictim(SPELL_FRENZY);
- FrenzyTimer = urand(20 * IN_MILLISECONDS, 30 * IN_MILLISECONDS);
- } else FrenzyTimer -= diff;
+ events.Update(diff);
- if (YellTimer <= diff)
- {
- Talk(YELL_RANDOM);
- YellTimer = urand(20 * IN_MILLISECONDS, 30 * IN_MILLISECONDS); //20 to 30 seconds
- } else YellTimer -= diff;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- // check if creature is not outside of building
- if (ResetTimer <= diff)
+ while (uint32 eventId = events.ExecuteEvent())
{
- if (me->GetDistance2d(me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY()) > 50)
+ switch (eventId)
{
- EnterEvadeMode();
- Talk(YELL_EVADE);
+ case EVENT_WHIRLWIND:
+ DoCastVictim(SPELL_WHIRLWIND);
+ events.ScheduleEvent(EVENT_WHIRLWIND, urand(8 * IN_MILLISECONDS, 18 * IN_MILLISECONDS));
+ break;
+ case EVENT_WHIRLWIND2:
+ DoCastVictim(SPELL_WHIRLWIND2);
+ events.ScheduleEvent(EVENT_WHIRLWIND2, urand(7 * IN_MILLISECONDS, 25 * IN_MILLISECONDS));
+ break;
+ case EVENT_KNOCKDOWN:
+ DoCastVictim(SPELL_KNOCKDOWN);
+ events.ScheduleEvent(EVENT_KNOCKDOWN, urand(10 * IN_MILLISECONDS, 15 * IN_MILLISECONDS));
+ break;
+ case EVENT_FRENZY:
+ DoCastVictim(SPELL_FRENZY);
+ events.ScheduleEvent(EVENT_FRENZY, urand(20 * IN_MILLISECONDS, 30 * IN_MILLISECONDS));
+ break;
+ case EVENT_RANDOM_YELL:
+ Talk(SAY_RANDOM);
+ events.ScheduleEvent(EVENT_RANDOM_YELL, urand(20 * IN_MILLISECONDS, 30 * IN_MILLISECONDS));
+ break;
+ default:
+ break;
}
- ResetTimer = 5 * IN_MILLISECONDS;
- } else ResetTimer -= diff;
+ }
DoMeleeAttackIfReady();
}
+
+ private:
+ EventMap events;
};
CreatureAI* GetAI(Creature* creature) const override
diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp
index e422975bd1a..0c029537add 100644
--- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp
+++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_galvangar.cpp
@@ -27,11 +27,20 @@ enum Spells
SPELL_MORTAL_STRIKE = 16856
};
-enum Yells
+enum Texts
{
- YELL_AGGRO = 0,
- YELL_EVADE = 1,
- YELL_BUFF = 2
+ SAY_AGGRO = 0,
+ SAY_EVADE = 1,
+ SAY_BUFF = 2
+};
+
+enum Events
+{
+ EVENT_CLEAVE = 1,
+ EVENT_FRIGHTENING_SHOUT,
+ EVENT_WHIRLWIND1,
+ EVENT_WHIRLWIND2,
+ EVENT_MORTAL_STRIKE
};
enum Action
@@ -46,97 +55,85 @@ public:
struct boss_galvangarAI : public ScriptedAI
{
- boss_galvangarAI(Creature* creature) : ScriptedAI(creature)
- {
- Initialize();
- }
-
- void Initialize()
- {
- CleaveTimer = urand(1 * IN_MILLISECONDS, 9 * IN_MILLISECONDS);
- FrighteningShoutTimer = urand(2 * IN_MILLISECONDS, 19 * IN_MILLISECONDS);
- Whirlwind1Timer = urand(1 * IN_MILLISECONDS, 13 * IN_MILLISECONDS);
- Whirlwind2Timer = urand(5 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
- MortalStrikeTimer = urand(5 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
- ResetTimer = 5 * IN_MILLISECONDS;
- }
-
- uint32 CleaveTimer;
- uint32 FrighteningShoutTimer;
- uint32 Whirlwind1Timer;
- uint32 Whirlwind2Timer;
- uint32 MortalStrikeTimer;
- uint32 ResetTimer;
+ boss_galvangarAI(Creature* creature) : ScriptedAI(creature) { }
void Reset() override
{
- Initialize();
+ events.Reset();
}
void EnterCombat(Unit* /*who*/) override
{
- Talk(YELL_AGGRO);
- }
-
- void JustRespawned() override
- {
- Reset();
+ Talk(SAY_AGGRO);
+ events.ScheduleEvent(EVENT_CLEAVE, urand(1 * IN_MILLISECONDS, 9 * IN_MILLISECONDS));
+ events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, urand(2 * IN_MILLISECONDS, 19 * IN_MILLISECONDS));
+ events.ScheduleEvent(EVENT_WHIRLWIND1, urand(1 * IN_MILLISECONDS, 13 * IN_MILLISECONDS));
+ events.ScheduleEvent(EVENT_WHIRLWIND2, urand(5 * IN_MILLISECONDS, 20 * IN_MILLISECONDS));
+ events.ScheduleEvent(EVENT_MORTAL_STRIKE, urand(5 * IN_MILLISECONDS, 20 * IN_MILLISECONDS));
}
void DoAction(int32 actionId) override
{
if (actionId == ACTION_BUFF_YELL)
- Talk(YELL_BUFF);
+ Talk(SAY_BUFF);
}
- void UpdateAI(uint32 diff) override
+ bool CheckInRoom()
{
- if (!UpdateVictim())
- return;
-
- if (CleaveTimer <= diff)
+ if (me->GetDistance2d(me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY()) > 50)
{
- DoCastVictim(SPELL_CLEAVE);
- CleaveTimer = urand(10 * IN_MILLISECONDS, 16 * IN_MILLISECONDS);
- } else CleaveTimer -= diff;
+ EnterEvadeMode();
+ Talk(SAY_EVADE);
+ return false;
+ }
- if (FrighteningShoutTimer <= diff)
- {
- DoCastVictim(SPELL_FRIGHTENING_SHOUT);
- FrighteningShoutTimer = urand(10 * IN_MILLISECONDS, 15 * IN_MILLISECONDS);
- } else FrighteningShoutTimer -= diff;
+ return true;
+ }
- if (Whirlwind1Timer <= diff)
- {
- DoCastVictim(SPELL_WHIRLWIND1);
- Whirlwind1Timer = urand(6 * IN_MILLISECONDS, 10 * IN_MILLISECONDS);
- } else Whirlwind1Timer -= diff;
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim() || !CheckInRoom())
+ return;
- if (Whirlwind2Timer <= diff)
- {
- DoCastVictim(SPELL_WHIRLWIND2);
- Whirlwind2Timer = urand(10 * IN_MILLISECONDS, 25 * IN_MILLISECONDS);
- } else Whirlwind2Timer -= diff;
+ events.Update(diff);
- if (MortalStrikeTimer <= diff)
- {
- DoCastVictim(SPELL_MORTAL_STRIKE);
- MortalStrikeTimer = urand(10 * IN_MILLISECONDS, 30 * IN_MILLISECONDS);
- } else MortalStrikeTimer -= diff;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- // check if creature is not outside of building
- if (ResetTimer <= diff)
+ while (uint32 eventId = events.ExecuteEvent())
{
- if (me->GetDistance2d(me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY()) > 50)
+ switch (eventId)
{
- EnterEvadeMode();
- Talk(YELL_EVADE);
+ case EVENT_CLEAVE:
+ DoCastVictim(SPELL_CLEAVE);
+ events.ScheduleEvent(EVENT_CLEAVE, urand(10 * IN_MILLISECONDS, 16 * IN_MILLISECONDS));
+ break;
+ case EVENT_FRIGHTENING_SHOUT:
+ DoCastVictim(SPELL_FRIGHTENING_SHOUT);
+ events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, urand(10 * IN_MILLISECONDS, 15 * IN_MILLISECONDS));
+ break;
+ case EVENT_WHIRLWIND1:
+ DoCastVictim(SPELL_WHIRLWIND1);
+ events.ScheduleEvent(EVENT_WHIRLWIND1, urand(6 * IN_MILLISECONDS, 10 * IN_MILLISECONDS));
+ break;
+ case EVENT_WHIRLWIND2:
+ DoCastVictim(SPELL_WHIRLWIND2);
+ events.ScheduleEvent(EVENT_WHIRLWIND2, urand(10 * IN_MILLISECONDS, 25 * IN_MILLISECONDS));
+ break;
+ case EVENT_MORTAL_STRIKE:
+ DoCastVictim(SPELL_MORTAL_STRIKE);
+ events.ScheduleEvent(EVENT_MORTAL_STRIKE, urand(10 * IN_MILLISECONDS, 30 * IN_MILLISECONDS));
+ break;
+ default:
+ break;
}
- ResetTimer = 5 * IN_MILLISECONDS;
- } else ResetTimer -= diff;
+ }
DoMeleeAttackIfReady();
}
+
+ private:
+ EventMap events;
};
CreatureAI* GetAI(Creature* creature) const override
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp
index b218e3f2978..c5f7a5da6d7 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp
@@ -21,7 +21,7 @@
enum Spells
{
SPELL_CURSE_OF_BLOOD = 24673,
- SPELL_ILLUSION = 17773,
+ SPELL_ILLUSION = 17773
};
enum Events
@@ -113,7 +113,7 @@ public:
CreatureAI* GetAI(Creature* creature) const override
{
- return new boss_jandicebarovAI(creature);
+ return GetInstanceAI<boss_jandicebarovAI>(creature);
}
};
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp
index 897799a708c..348e2212870 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp
@@ -81,7 +81,7 @@ public:
events.ScheduleEvent(EVENT_ICE_ARMOR, 180000);
break;
case EVENT_FROSTBOLT:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true))
DoCast(target, SPELL_FROSTBOLT);
events.ScheduleEvent(EVENT_FROSTBOLT, 8000);
break;
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp
index 792649f2998..dcb212eead8 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp
@@ -106,7 +106,6 @@ public:
EventMap events;
};
-
CreatureAI* GetAI(Creature* creature) const override
{
return new boss_vectusAI(creature);
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp
index 0a666488e84..fa87247f19f 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp
@@ -87,14 +87,14 @@ public:
{
Initialize();
- instance->SetData(DATA_EPOCH_EVENT, NOT_STARTED);
+ instance->SetBossState(DATA_EPOCH, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) override
{
Talk(SAY_AGGRO);
- instance->SetData(DATA_EPOCH_EVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_EPOCH, IN_PROGRESS);
}
void UpdateAI(uint32 diff) override
@@ -136,7 +136,7 @@ public:
{
Talk(SAY_DEATH);
- instance->SetData(DATA_EPOCH_EVENT, DONE);
+ instance->SetBossState(DATA_EPOCH, DONE);
}
void KilledUnit(Unit* victim) override
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp
index f3333c0b0b6..d693ec38e44 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp
@@ -22,7 +22,9 @@
enum Spells
{
SPELL_CORRUPTING_BLIGHT = 60588,
- SPELL_VOID_STRIKE = 60590
+ SPELL_VOID_STRIKE = 60590,
+ SPELL_CORRUPTION_OF_TIME_CHANNEL = 60422,
+ SPELL_CORRUPTION_OF_TIME_TARGET = 60451
};
enum Yells
@@ -32,52 +34,78 @@ enum Yells
SAY_FAIL = 2
};
-class boss_infinite_corruptor : public CreatureScript
+enum Events
{
-public:
- boss_infinite_corruptor() : CreatureScript("boss_infinite_corruptor") { }
+ EVENT_CORRUPTING_BLIGHT = 1,
+ EVENT_VOID_STRIKE
+};
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<boss_infinite_corruptorAI>(creature);
- }
+class boss_infinite_corruptor : public CreatureScript
+{
+ public:
+ boss_infinite_corruptor() : CreatureScript("boss_infinite_corruptor") { }
- struct boss_infinite_corruptorAI : public ScriptedAI
- {
- boss_infinite_corruptorAI(Creature* creature) : ScriptedAI(creature)
+ struct boss_infinite_corruptorAI : public BossAI
{
- instance = creature->GetInstanceScript();
- }
+ boss_infinite_corruptorAI(Creature* creature) : BossAI(creature, DATA_INFINITE) { }
- InstanceScript* instance;
+ void Reset() override
+ {
+ _Reset();
- void Reset() override
- {
- instance->SetData(DATA_INFINITE_EVENT, NOT_STARTED);
- }
+ if (Creature* guardian = me->FindNearestCreature(NPC_GUARDIAN_OF_TIME, 100.0f))
+ {
+ DoCast((Unit*)NULL, SPELL_CORRUPTION_OF_TIME_CHANNEL, false);
+ guardian->CastSpell(guardian, SPELL_CORRUPTION_OF_TIME_TARGET, false);
+ }
+ }
- void EnterCombat(Unit* /*who*/) override
- {
- Talk(SAY_AGGRO);
- instance->SetData(DATA_INFINITE_EVENT, IN_PROGRESS);
- }
+ void EnterCombat(Unit* /*who*/) override
+ {
+ Talk(SAY_AGGRO);
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_CORRUPTING_BLIGHT, 7000);
+ events.ScheduleEvent(EVENT_VOID_STRIKE, 5000);
+ }
- void UpdateAI(uint32 /*diff*/) override
- {
- //Return since we have no target
- if (!UpdateVictim())
- return;
+ void JustDied(Unit* /*killer*/) override
+ {
+ Talk(SAY_DEATH);
+ _JustDied();
- DoMeleeAttackIfReady();
- }
+ if (Creature* guardian = me->FindNearestCreature(NPC_GUARDIAN_OF_TIME, 100.0f))
+ {
+ guardian->RemoveAurasDueToSpell(SPELL_CORRUPTION_OF_TIME_TARGET);
+ guardian->DespawnOrUnsummon(5000);
+ }
- void JustDied(Unit* /*killer*/) override
+ if (Creature* rift = me->FindNearestCreature(NPC_TIME_RIFT, 100.0f))
+ rift->DespawnOrUnsummon();
+ }
+
+ void ExecuteEvent(uint32 eventId) override
+ {
+ switch (eventId)
+ {
+ case EVENT_CORRUPTING_BLIGHT:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, true))
+ DoCast(target, SPELL_CORRUPTING_BLIGHT);
+ events.ScheduleEvent(EVENT_CORRUPTING_BLIGHT, 17000);
+ break;
+ case EVENT_VOID_STRIKE:
+ DoCastVictim(SPELL_VOID_STRIKE);
+ events.ScheduleEvent(EVENT_VOID_STRIKE, 5000);
+ break;
+ default:
+ break;
+ }
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
{
- Talk(SAY_DEATH);
- instance->SetData(DATA_INFINITE_EVENT, DONE);
+ return GetInstanceAI<boss_infinite_corruptorAI>(creature);
}
- };
-
};
void AddSC_boss_infinite_corruptor()
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp
index d9356b724c0..3d1e9363cd8 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp
@@ -26,15 +26,13 @@ Script Data End */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "culling_of_stratholme.h"
+#include "Player.h"
enum Spells
{
SPELL_CARRION_SWARM = 52720, //A cresting wave of chaotic magic splashes over enemies in front of the caster, dealing 3230 to 3570 Shadow damage and 380 to 420 Shadow damage every 3 sec. for 15 sec.
- H_SPELL_CARRION_SWARM = 58852,
SPELL_MIND_BLAST = 52722, //Inflicts 4163 to 4837 Shadow damage to an enemy.
- H_SPELL_MIND_BLAST = 58850,
SPELL_SLEEP = 52721, //Puts an enemy to sleep for up to 10 sec. Any damage caused will awaken the target.
- H_SPELL_SLEEP = 58849,
SPELL_VAMPIRIC_TOUCH = 52723, //Heals the caster for half the damage dealt by a melee attack.
SPELL_MAL_GANIS_KILL_CREDIT = 58124, // Quest credit
SPELL_KILL_CREDIT = 58630 // Non-existing spell as encounter credit, created in spell_dbc
@@ -75,7 +73,6 @@ public:
{
Initialize();
instance = creature->GetInstanceScript();
- uiOutroStep = 0;
}
void Initialize()
@@ -108,14 +105,13 @@ public:
void Reset() override
{
Initialize();
-
- instance->SetData(DATA_MAL_GANIS_EVENT, NOT_STARTED);
+ instance->SetBossState(DATA_MAL_GANIS, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) override
{
Talk(SAY_AGGRO);
- instance->SetData(DATA_MAL_GANIS_EVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_MAL_GANIS, IN_PROGRESS);
}
void DamageTaken(Unit* done_by, uint32 &damage) override
@@ -159,7 +155,7 @@ public:
{
EnterEvadeMode();
me->DisappearAndDie();
- instance->SetData(DATA_MAL_GANIS_EVENT, FAIL);
+ instance->SetBossState(DATA_MAL_GANIS, FAIL);
}
if (uiCarrionSwarmTimer < diff)
@@ -197,7 +193,7 @@ public:
switch (uiOutroStep)
{
case 1:
- Talk(SAY_ESCAPE_SPEECH_1);
+ Talk(SAY_OUTRO);
me->GetMotionMaster()->MoveTargetedHome();
++uiOutroStep;
uiOutroTimer = 8000;
@@ -212,7 +208,7 @@ public:
case 3:
Talk(SAY_OUTRO);
++uiOutroStep;
- uiOutroTimer = 16000;
+ //uiOutroTimer = 16000;
break;
case 4:
me->HandleEmoteCommand(33);
@@ -232,7 +228,7 @@ public:
void JustDied(Unit* /*killer*/) override
{
- instance->SetData(DATA_MAL_GANIS_EVENT, DONE);
+ instance->SetBossState(DATA_MAL_GANIS, DONE);
DoCastAOE(SPELL_MAL_GANIS_KILL_CREDIT);
// give achievement credit and LFG rewards to players. criteria use spell 58630 which doesn't exist, but it was created in spell_dbc
DoCastAOE(SPELL_KILL_CREDIT);
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp
index c961bf9b2c6..143f901ec0b 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp
@@ -15,14 +15,6 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* Script Data Start
-SDName: Boss meathook
-SDAuthor: Tartalo
-SD%Complete: 100
-SDComment: It may need timer adjustment
-SDCategory:
-Script Data End */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "culling_of_stratholme.h"
@@ -30,9 +22,7 @@ Script Data End */
enum Spells
{
SPELL_CONSTRICTING_CHAINS = 52696, //Encases the targets in chains, dealing 1800 Physical damage every 1 sec. and stunning the target for 5 sec.
- H_SPELL_CONSTRICTING_CHAINS = 58823,
SPELL_DISEASE_EXPULSION = 52666, //Meathook belches out a cloud of disease, dealing 1710 to 1890 Nature damage and interrupting the spell casting of nearby enemy targets for 4 sec.
- H_SPELL_DISEASE_EXPULSION = 58824,
SPELL_FRENZY = 58841 //Increases the caster's Physical damage by 10% for 30 sec.
};
@@ -44,96 +34,72 @@ enum Yells
SAY_DEATH = 3
};
-class boss_meathook : public CreatureScript
+enum Events
{
-public:
- boss_meathook() : CreatureScript("boss_meathook") { }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<boss_meathookAI>(creature);
- }
-
- struct boss_meathookAI : public ScriptedAI
- {
- boss_meathookAI(Creature* creature) : ScriptedAI(creature)
- {
- Initialize();
- instance = creature->GetInstanceScript();
- Talk(SAY_SPAWN);
- }
-
- void Initialize()
- {
- uiChainTimer = urand(12000, 17000); //seen on video 13, 17, 15, 12, 16
- uiDiseaseTimer = urand(2000, 4000); //approx 3s
- uiFrenzyTimer = urand(21000, 26000); //made it up
- }
-
- uint32 uiChainTimer;
- uint32 uiDiseaseTimer;
- uint32 uiFrenzyTimer;
-
- InstanceScript* instance;
-
- void Reset() override
- {
- Initialize();
-
- instance->SetData(DATA_MEATHOOK_EVENT, NOT_STARTED);
- }
-
- void EnterCombat(Unit* /*who*/) override
- {
- Talk(SAY_AGGRO);
+ EVENT_CHAIN = 1,
+ EVENT_DISEASE,
+ EVENT_FRENZY
+};
- instance->SetData(DATA_MEATHOOK_EVENT, IN_PROGRESS);
- }
+class boss_meathook : public CreatureScript
+{
+ public:
+ boss_meathook() : CreatureScript("boss_meathook") { }
- void UpdateAI(uint32 diff) override
+ struct boss_meathookAI : public BossAI
{
- //Return since we have no target
- if (!UpdateVictim())
- return;
-
- if (uiDiseaseTimer <= diff)
+ boss_meathookAI(Creature* creature) : BossAI(creature, DATA_MEATHOOK)
{
- DoCastAOE(SPELL_DISEASE_EXPULSION);
- uiDiseaseTimer = urand(1500, 4000);
- } else uiDiseaseTimer -= diff;
+ Talk(SAY_SPAWN);
+ }
- if (uiFrenzyTimer <= diff)
+ void EnterCombat(Unit* /*who*/) override
{
- DoCast(me, SPELL_FRENZY);
- uiFrenzyTimer = urand(21000, 26000);
- } else uiFrenzyTimer -= diff;
-
- if (uiChainTimer <= diff)
+ Talk(SAY_AGGRO);
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_CHAIN, urand(12000, 17000));
+ events.ScheduleEvent(EVENT_DISEASE, urand(2000, 4000));
+ events.ScheduleEvent(EVENT_FRENZY, urand(21000, 26000));
+ }
+
+ void ExecuteEvent(uint32 eventId) override
{
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
- DoCast(target, SPELL_CONSTRICTING_CHAINS); //anyone but the tank
- uiChainTimer = urand(2000, 4000);
- } else uiChainTimer -= diff;
-
- DoMeleeAttackIfReady();
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- Talk(SAY_DEATH);
+ switch (eventId)
+ {
+ case EVENT_CHAIN:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
+ DoCast(target, SPELL_CONSTRICTING_CHAINS);
+ events.ScheduleEvent(EVENT_CHAIN, urand(2000, 4000));
+ case EVENT_DISEASE:
+ DoCastAOE(SPELL_DISEASE_EXPULSION);
+ events.ScheduleEvent(EVENT_DISEASE, urand(1500, 4000));
+ break;
+ case EVENT_FRENZY:
+ DoCast(me, SPELL_FRENZY);
+ events.ScheduleEvent(EVENT_FRENZY, urand(21000, 26000));
+ break;
+ default:
+ break;
+ }
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ Talk(SAY_DEATH);
+ _JustDied();
+ }
- instance->SetData(DATA_MEATHOOK_EVENT, DONE);
- }
+ void KilledUnit(Unit* victim) override
+ {
+ if (victim->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_SLAY);
+ }
+ };
- void KilledUnit(Unit* victim) override
+ CreatureAI* GetAI(Creature* creature) const override
{
- if (victim->GetTypeId() != TYPEID_PLAYER)
- return;
-
- Talk(SAY_SLAY);
+ return GetInstanceAI<boss_meathookAI>(creature);
}
- };
-
};
void AddSC_boss_meathook()
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp
index 1c35a38a5e3..6925badf272 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp
@@ -89,14 +89,14 @@ public:
{
Initialize();
- instance->SetData(DATA_SALRAMM_EVENT, NOT_STARTED);
+ instance->SetBossState(DATA_SALRAMM, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) override
{
Talk(SAY_AGGRO);
- instance->SetData(DATA_SALRAMM_EVENT, IN_PROGRESS);
+ instance->SetBossState(DATA_SALRAMM, IN_PROGRESS);
}
void UpdateAI(uint32 diff) override
@@ -145,7 +145,7 @@ public:
{
Talk(SAY_DEATH);
- instance->SetData(DATA_SALRAMM_EVENT, DONE);
+ instance->SetBossState(DATA_SALRAMM, DONE);
}
void KilledUnit(Unit* victim) override
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
index b8a9b295161..3c80be2734a 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
@@ -103,7 +103,7 @@ enum Says
//Drakonian
SAY_PHASE302 = 0,
- SAY_PHASE305 = 1,
+ SAY_PHASE305 = 1
};
enum NPCs
@@ -111,7 +111,6 @@ enum NPCs
NPC_INFINITE_ADVERSARY = 27742,
NPC_INFINITE_HUNTER = 27743,
NPC_INFINITE_AGENT = 27744,
- NPC_TIME_RIFT = 28409,
NPC_ZOMBIE = 27737,
NPC_GHOUL = 28249,
NPC_NECROMANCER = 28200,
@@ -128,7 +127,7 @@ enum NPCs
NPC_CITY_MAN = 28167,
NPC_CITY_MAN2 = 28169,
NPC_CITY_MAN3 = 31126,
- NPC_CITY_MAN4 = 31127,
+ NPC_CITY_MAN4 = 31127
};
enum Spells
@@ -138,7 +137,7 @@ enum Spells
SPELL_EXORCISM_N = 52445,
SPELL_EXORCISM_H = 58822,
SPELL_HOLY_LIGHT = 52444,
- SPELL_ARCANE_DISRUPTION = 49590,
+ SPELL_ARCANE_DISRUPTION = 49590
};
enum GossipMenuArthas
@@ -392,6 +391,7 @@ public:
uint32 gossipStep;
uint32 bossEvent;
uint32 wave;
+ uint32 WavesCounter;
uint64 utherGUID;
uint64 jainaGUID;
@@ -411,17 +411,19 @@ public:
{
Initialize();
- instance->SetData(DATA_ARTHAS_EVENT, NOT_STARTED);
- switch (instance->GetData(DATA_ARTHAS_EVENT))
- {
- case NOT_STARTED:
- bStepping = true;
- step = 0;
- me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
- bossEvent = DATA_MEATHOOK_EVENT;
- gossipStep = 0;
- break;
- }
+ instance->SetBossState(DATA_ARTHAS, NOT_STARTED);
+
+ bStepping = true;
+ step = 0;
+ me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+ bossEvent = DATA_MEATHOOK;
+ gossipStep = 0;
+ }
+
+ void AttackStart(Unit* who)
+ {
+ if (who && !who->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC))
+ npc_escortAI::AttackStart(who);
}
void EnterCombat(Unit* /*who*/) override
@@ -431,7 +433,7 @@ public:
void JustDied(Unit* /*killer*/) override
{
- instance->SetData(DATA_ARTHAS_EVENT, FAIL);
+ instance->SetBossState(DATA_ARTHAS, FAIL);
}
void SpawnTimeRift(uint32 timeRiftID, uint64* guidVector)
@@ -488,16 +490,15 @@ public:
case 11:
case 22:
case 23:
- case 26:
case 55:
case 56:
SetHoldState(true);
bStepping = true;
break;
case 7:
- if (Unit* cityman0 = me->SummonCreature(NPC_CITY_MAN, 2091.977f, 1275.021f, 140.757f, 0.558f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000))
+ if (Unit* cityman0 = me->FindNearestCreature(NPC_CITY_MAN, 160.0f))
citymenGUID[0] = cityman0->GetGUID();
- if (Unit* cityman1 = me->SummonCreature(NPC_CITY_MAN2, 2093.514f, 1275.842f, 140.408f, 3.801f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000))
+ if (Unit* cityman1 = me->FindNearestCreature(NPC_CITY_MAN2, 160.0f))
citymenGUID[1] = cityman1->GetGUID();
break;
case 8:
@@ -534,10 +535,12 @@ public:
case 21:
Talk(SAY_PHASE301);
break;
- case 25:
+ case 26:
SetRun(false);
SpawnTimeRift(0, &infiniteDraconianGUID[0]);
Talk(SAY_PHASE307);
+ SetHoldState(true);
+ bStepping = true;
break;
case 29:
SetRun(false);
@@ -565,8 +568,8 @@ public:
Talk(SAY_PHASE403);
break;
case 36:
- if (GameObject* pGate = instance->instance->GetGameObject(instance->GetData64(DATA_SHKAF_GATE)))
- pGate->SetGoState(GO_STATE_ACTIVE);
+ if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_SHKAF_GATE)))
+ gate->SetGoState(GO_STATE_ACTIVE);
break;
case 45:
SetRun(true);
@@ -575,18 +578,18 @@ public:
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
SetHoldState(true);
break;
- case 47:
+ case 48:
SetRun(false);
Talk(SAY_PHASE405);
break;
- case 48:
+ case 49:
SetRun(true);
Talk(SAY_PHASE406);
break;
- case 53:
+ case 50:
Talk(SAY_PHASE407);
break;
- case 54:
+ case 51:
gossipStep = 5;
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
SetHoldState(true);
@@ -598,8 +601,6 @@ public:
{
npc_escortAI::UpdateAI(diff);
- DoMeleeAttackIfReady();
-
if (bStepping)
{
if (phaseTimer <= diff)
@@ -765,6 +766,9 @@ public:
stalkerGUID = pStalker->GetGUID();
me->SetTarget(stalkerGUID);
}
+
+ instance->DoUpdateWorldState(WORLDSTATE_WAVE_COUNT, 0);
+
JumpToNextStep(1000);
break;
case 25:
@@ -892,14 +896,15 @@ public:
}
Talk(SAY_PHASE209);
- bossEvent = DATA_MEATHOOK_EVENT;
- instance->SetData(DATA_ARTHAS_EVENT, IN_PROGRESS);
+ bossEvent = DATA_MEATHOOK;
+ instance->SetBossState(DATA_ARTHAS, IN_PROGRESS);
me->SetReactState(REACT_DEFENSIVE);
SetDespawnAtFar(false);
JumpToNextStep(5000);
break;
- case 41: //Summon wave group
+ // Summon wave groups - start the Infinite Corruptor timer
+ case 41:
case 43:
case 45:
case 47:
@@ -907,10 +912,15 @@ public:
case 53:
case 55:
case 57:
- if (instance->GetData(bossEvent) != DONE)
+ if (!wave && IsHeroic() && instance->GetData(DATA_INFINITE_COUNTER) == NOT_STARTED)
+ instance->SetData(DATA_INFINITE_COUNTER, IN_PROGRESS);
+
+ if (instance->GetBossState(bossEvent) != DONE)
{
SpawnWaveGroup(wave, waveGUID);
wave++;
+ WavesCounter++;
+ instance->DoUpdateWorldState(WORLDSTATE_WAVE_COUNT, WavesCounter);
}
JumpToNextStep(500);
break;
@@ -922,7 +932,7 @@ public:
case 54:
case 56:
case 58:
- if (instance->GetData(bossEvent) != DONE)
+ if (instance->GetBossState(bossEvent) != DONE)
{
uint32 mobCounter = 0;
uint32 deadCounter = 0;
@@ -946,12 +956,14 @@ public:
break;
case 49: //Summon Boss
case 59:
- if (instance->GetData(bossEvent) != DONE)
+ if (instance->GetBossState(bossEvent) != DONE)
{
+ WavesCounter++;
+ instance->DoUpdateWorldState(WORLDSTATE_WAVE_COUNT, WavesCounter);
uint32 uiBossID = 0;
- if (bossEvent == DATA_MEATHOOK_EVENT)
+ if (bossEvent == DATA_MEATHOOK)
uiBossID = NPC_MEATHOOK;
- else if (bossEvent == DATA_SALRAMM_EVENT)
+ else if (bossEvent == DATA_SALRAMM)
uiBossID = NPC_SALRAMM;
if (Unit* pBoss = me->SummonCreature(uiBossID, 2232.19f, 1331.933f, 126.662f, 3.15f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 900000))
@@ -965,19 +977,19 @@ public:
break;
case 50: //Wait Boss death
case 60:
- if (instance->GetData(bossEvent) == DONE)
+ if (instance->GetBossState(bossEvent) == DONE)
{
JumpToNextStep(1000);
- if (bossEvent == DATA_MEATHOOK_EVENT)
- bossEvent = DATA_SALRAMM_EVENT;
- else if (bossEvent == DATA_SALRAMM_EVENT)
+ if (bossEvent == DATA_MEATHOOK)
+ bossEvent = DATA_SALRAMM;
+ else if (bossEvent == DATA_SALRAMM)
{
SetHoldState(false);
bStepping = false;
- bossEvent = DATA_EPOCH_EVENT;
+ bossEvent = DATA_EPOCH;
}
}
- else if (instance->GetData(bossEvent) == FAIL)
+ else if (instance->GetBossState(bossEvent) == FAIL)
npc_escortAI::EnterEvadeMode();
else
phaseTimer = 10000;
@@ -1074,9 +1086,12 @@ public:
phaseTimer = 1000;
else
{
- if (step == 72) Talk(SAY_PHASE308);
- if (step == 74) Talk(SAY_PHASE308);
- if (step == 76) Talk(SAY_PHASE310);
+ if (step == 72)
+ Talk(SAY_PHASE308);
+ if (step == 74)
+ Talk(SAY_PHASE308);
+ if (step == 76)
+ Talk(SAY_PHASE310);
SetHoldState(false);
bStepping = false;
SetRun(true);
@@ -1097,7 +1112,7 @@ public:
JumpToNextStep(1000);
break;
case 80:
- if (instance->GetData(DATA_EPOCH_EVENT) != DONE)
+ if (instance->GetBossState(DATA_EPOCH) != DONE)
{
SpawnTimeRift(17, &epochGUID);
if (Creature* epoch = ObjectAccessor::GetCreature(*me, epochGUID))
@@ -1107,12 +1122,12 @@ public:
JumpToNextStep(18000);
break;
case 81:
- if (instance->GetData(DATA_EPOCH_EVENT) != DONE)
+ if (instance->GetBossState(DATA_EPOCH) != DONE)
Talk(SAY_PHASE315);
JumpToNextStep(6000);
break;
case 82:
- if (instance->GetData(DATA_EPOCH_EVENT) != DONE)
+ if (instance->GetBossState(DATA_EPOCH) != DONE)
{
if (Creature* epoch = ObjectAccessor::GetCreature(*me, epochGUID))
{
@@ -1126,15 +1141,15 @@ public:
JumpToNextStep(1000);
break;
case 83:
- if (instance->GetData(DATA_EPOCH_EVENT) == DONE)
+ if (instance->GetBossState(DATA_EPOCH) == DONE)
{
gossipStep = 3;
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
bStepping = false;
- bossEvent = DATA_MAL_GANIS_EVENT;
+ bossEvent = DATA_MAL_GANIS;
JumpToNextStep(15000);
}
- else if (instance->GetData(DATA_EPOCH_EVENT) == FAIL)
+ else if (instance->GetBossState(DATA_EPOCH) == FAIL)
npc_escortAI::EnterEvadeMode();
else
phaseTimer = 10000;
@@ -1153,8 +1168,8 @@ public:
malganisGUID = malganis->GetGUID();
malganis->SetReactState(REACT_PASSIVE);
}
- if (GameObject* pGate = instance->instance->GetGameObject(instance->GetData64(DATA_MAL_GANIS_GATE_1)))
- pGate->SetGoState(GO_STATE_ACTIVE);
+ if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetData64(DATA_MAL_GANIS_GATE_1)))
+ gate->SetGoState(GO_STATE_ACTIVE);
SetHoldState(false);
bStepping = false;
JumpToNextStep(0);
@@ -1174,12 +1189,12 @@ public:
JumpToNextStep(1000);
break;
case 88:
- if (instance->GetData(DATA_MAL_GANIS_EVENT) == DONE)
+ if (instance->GetBossState(DATA_MAL_GANIS) == DONE)
{
SetHoldState(false);
JumpToNextStep(1000);
}
- else if (instance->GetData(DATA_MAL_GANIS_EVENT) == FAIL)
+ else if (instance->GetBossState(DATA_MAL_GANIS) == FAIL)
npc_escortAI::EnterEvadeMode();
else
phaseTimer = 10000;
@@ -1192,7 +1207,7 @@ public:
JumpToNextStep(7000);
break;
case 90:
- instance->SetData(DATA_ARTHAS_EVENT, DONE); //Rewards: Achiev & Chest ;D
+ instance->SetBossState(DATA_ARTHAS, DONE); //Rewards: Achiev & Chest ;D
me->SetTarget(instance->GetData64(DATA_MAL_GANIS_GATE_2)); //Look behind
Talk(SAY_PHASE504);
bStepping = false;
@@ -1214,6 +1229,8 @@ public:
if (HealthBelowPct(40))
DoCast(me, SPELL_HOLY_LIGHT);
+
+ DoMeleeAttackIfReady();
}
};
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h
index e7d1033e55f..192654c87f1 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h
@@ -19,19 +19,10 @@
#define DEF_CULLING_OF_STRATHOLME_H
#define DataHeader "CS"
+#define CoSScriptName "instance_culling_of_stratholme"
+uint32 const EncounterCount = 5;
-enum Data
-{
- DATA_MEATHOOK_EVENT,
- DATA_SALRAMM_EVENT,
- DATA_EPOCH_EVENT,
- DATA_MAL_GANIS_EVENT,
- DATA_INFINITE_EVENT,
- DATA_ARTHAS_EVENT,
- DATA_CRATE_COUNT,
-};
-
-enum Data64
+enum DataTypes
{
DATA_ARTHAS,
DATA_MEATHOOK,
@@ -39,28 +30,35 @@ enum Data64
DATA_EPOCH,
DATA_MAL_GANIS,
DATA_INFINITE,
+ DATA_CRATE_COUNT,
DATA_SHKAF_GATE,
DATA_MAL_GANIS_GATE_1,
DATA_MAL_GANIS_GATE_2,
DATA_EXIT_GATE,
- DATA_MAL_GANIS_CHEST
+ DATA_MAL_GANIS_CHEST,
+ DATA_INFINITE_COUNTER
};
-enum Creatures
+enum CreatureIds
{
- NPC_MEATHOOK = 26529,
- NPC_SALRAMM = 26530,
- NPC_EPOCH = 26532,
- NPC_MAL_GANIS = 26533,
- NPC_INFINITE = 32273,
- NPC_ARTHAS = 26499,
- NPC_JAINA = 26497,
- NPC_UTHER = 26528,
- NPC_CHROMIE_2 = 27915,
- NPC_GENERIC_BUNNY = 28960,
+ NPC_MEATHOOK = 26529,
+ NPC_SALRAMM = 26530,
+ NPC_EPOCH = 26532,
+ NPC_MAL_GANIS = 26533,
+ NPC_INFINITE = 32273,
+ NPC_ARTHAS = 26499,
+ NPC_JAINA = 26497,
+ NPC_UTHER = 26528,
+ NPC_CHROMIE = 26527,
+ NPC_CHROMIE_2 = 27915,
+ NPC_CHROMIE_3 = 30997,
+ NPC_GENERIC_BUNNY = 28960,
+
+ NPC_TIME_RIFT = 28409,
+ NPC_GUARDIAN_OF_TIME = 32281
};
-enum GameObjects
+enum GameObjectIds
{
GO_SHKAF_GATE = 188686,
GO_MALGANIS_GATE_1 = 187711,
@@ -69,7 +67,7 @@ enum GameObjects
GO_MALGANIS_CHEST_N = 190663,
GO_MALGANIS_CHEST_H = 193597,
GO_SUSPICIOUS_CRATE = 190094,
- GO_PLAGUED_CRATE = 190095,
+ GO_PLAGUED_CRATE = 190095
};
enum WorldStatesCoT
@@ -78,12 +76,28 @@ enum WorldStatesCoT
WORLDSTATE_CRATES_REVEALED = 3480,
WORLDSTATE_WAVE_COUNT = 3504,
WORLDSTATE_TIME_GUARDIAN = 3931,
- WORLDSTATE_TIME_GUARDIAN_SHOW = 3932,
+ WORLDSTATE_TIME_GUARDIAN_SHOW = 3932
};
enum CrateSpells
{
- SPELL_CRATES_CREDIT = 58109,
+ SPELL_CRATES_CREDIT = 58109
+};
+
+enum Texts
+{
+ SAY_CRATES_COMPLETED = 0,
+ // Chromie
+ SAY_INFINITE_START = 0, // On Infinite Corruptor event start
+ SAY_INFINITE = 1, // On Infinite Corruptor event at 5 minutes
+ SAY_INFINITE_FAIL = 2, // On Infinite Corruptor event fail
+ // Infinite Corruptor
+ SAY_FAIL_EVENT = 2 // On Infinite Corruptor event fail
+};
+
+enum InstanceEvents
+{
+ EVENT_INFINITE_TIMER = 1
};
#endif
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp
index 7af2b3f63aa..b3e8d88bc2a 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp
@@ -23,8 +23,6 @@
#include "TemporarySummon.h"
#include "SpellInfo.h"
-#define MAX_ENCOUNTER 5
-
/* Culling of Stratholme encounters:
0 - Meathook
1 - Salramm the Fleshcrafter
@@ -33,51 +31,51 @@
4 - Infinite Corruptor (Heroic only)
*/
-enum Texts
+Position const ChromieSummonPos[] =
{
- SAY_CRATES_COMPLETED = 0,
+ { 1813.298f, 1283.578f, 142.3258f, 3.878161f },
+ { 2273.725f, 1483.684f, 128.7205f, 6.057528f }
};
-Position const ChromieSummonPos = {1813.298f, 1283.578f, 142.3258f, 3.878161f};
+Position const InfiniteCorruptorPos = { 2335.47f, 1262.04f, 132.921f, 1.42079f };
+Position const TimeRiftPos = { 2334.626f, 1280.45f, 133.0066f, 1.727876f };
+Position const GuardianOfTimePos = { 2321.489f, 1268.383f, 132.8507f, 0.418879f };
+
+DoorData const doorData[] =
+{
+ { GO_MALGANIS_GATE_2, DATA_MAL_GANIS, DOOR_TYPE_ROOM, BOUNDARY_NONE },
+ { GO_EXIT_GATE, DATA_MAL_GANIS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+};
class instance_culling_of_stratholme : public InstanceMapScript
{
public:
- instance_culling_of_stratholme() : InstanceMapScript("instance_culling_of_stratholme", 595) { }
-
- InstanceScript* GetInstanceScript(InstanceMap* map) const override
- {
- return new instance_culling_of_stratholme_InstanceMapScript(map);
- }
+ instance_culling_of_stratholme() : InstanceMapScript(CoSScriptName, 595) { }
struct instance_culling_of_stratholme_InstanceMapScript : public InstanceScript
{
instance_culling_of_stratholme_InstanceMapScript(Map* map) : InstanceScript(map)
{
SetHeaders(DataHeader);
- _arthasGUID = 0;
- _meathookGUID = 0;
- _salrammGUID = 0;
- _epochGUID = 0;
- _malGanisGUID = 0;
- _infiniteGUID = 0;
- _shkafGateGUID = 0;
+ SetBossNumber(EncounterCount);
+ LoadDoorData(doorData);
+
+ _chromieGUID = 0;
+ _arthasGUID = 0;
+ _meathookGUID = 0;
+ _salrammGUID = 0;
+ _epochGUID = 0;
+ _malGanisGUID = 0;
+ _infiniteGUID = 0;
+ _shkafGateGUID = 0;
_malGanisGate1GUID = 0;
_malGanisGate2GUID = 0;
- _exitGateGUID = 0;
+ _exitGateGUID = 0;
_malGanisChestGUID = 0;
- _genericBunnyGUID = 0;
- memset(&_encounterState[0], 0, sizeof(uint32) * MAX_ENCOUNTER);
- _crateCount = 0;
- }
-
- bool IsEncounterInProgress() const override
- {
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (_encounterState[i] == IN_PROGRESS)
- return true;
-
- return false;
+ _genericBunnyGUID = 0;
+ _crateCount = 0;
+ _eventTimer = 0;
}
void FillInitialWorldStates(WorldPacket& data) override
@@ -93,6 +91,9 @@ class instance_culling_of_stratholme : public InstanceMapScript
{
switch (creature->GetEntry())
{
+ case NPC_CHROMIE:
+ _chromieGUID = creature->GetGUID();
+ break;
case NPC_ARTHAS:
_arthasGUID = creature->GetGUID();
break;
@@ -110,10 +111,13 @@ class instance_culling_of_stratholme : public InstanceMapScript
break;
case NPC_INFINITE:
_infiniteGUID = creature->GetGUID();
+ DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, 1);
break;
case NPC_GENERIC_BUNNY:
_genericBunnyGUID = creature->GetGUID();
break;
+ default:
+ break;
}
}
@@ -129,55 +133,38 @@ class instance_culling_of_stratholme : public InstanceMapScript
break;
case GO_MALGANIS_GATE_2:
_malGanisGate2GUID = go->GetGUID();
+ AddDoor(go, true);
break;
case GO_EXIT_GATE:
_exitGateGUID = go->GetGUID();
- if (_encounterState[3] == DONE)
- HandleGameObject(_exitGateGUID, true);
+ AddDoor(go, true);
break;
case GO_MALGANIS_CHEST_N:
case GO_MALGANIS_CHEST_H:
_malGanisChestGUID = go->GetGUID();
- if (_encounterState[3] == DONE)
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
+ break;
+ default:
break;
}
}
- void SetData(uint32 type, uint32 data) override
+ void OnGameObjectRemove(GameObject* go) override
{
- switch (type)
+ switch (go->GetEntry())
{
- case DATA_MEATHOOK_EVENT:
- _encounterState[0] = data;
- break;
- case DATA_SALRAMM_EVENT:
- _encounterState[1] = data;
+ case GO_MALGANIS_GATE_2:
+ case GO_EXIT_GATE:
+ AddDoor(go, false);
break;
- case DATA_EPOCH_EVENT:
- _encounterState[2] = data;
+ default:
break;
- case DATA_MAL_GANIS_EVENT:
- _encounterState[3] = data;
+ }
+ }
- switch (_encounterState[3])
- {
- case NOT_STARTED:
- HandleGameObject(_malGanisGate2GUID, true);
- break;
- case IN_PROGRESS:
- HandleGameObject(_malGanisGate2GUID, false);
- break;
- case DONE:
- HandleGameObject(_exitGateGUID, true);
- if (GameObject* go = instance->GetGameObject(_malGanisChestGUID))
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
- break;
- }
- break;
- case DATA_INFINITE_EVENT:
- _encounterState[4] = data;
- break;
+ void SetData(uint32 type, uint32 data) override
+ {
+ switch (type)
+ {
case DATA_CRATE_COUNT:
_crateCount = data;
if (_crateCount == 5)
@@ -186,34 +173,70 @@ class instance_culling_of_stratholme : public InstanceMapScript
bunny->CastSpell(bunny, SPELL_CRATES_CREDIT, true);
// Summon Chromie and global whisper
- if (Creature* chromie = instance->SummonCreature(NPC_CHROMIE_2, ChromieSummonPos))
+ if (Creature* chromie = instance->SummonCreature(NPC_CHROMIE_2, ChromieSummonPos[0]))
if (!instance->GetPlayers().isEmpty())
chromie->AI()->TalkToMap(SAY_CRATES_COMPLETED);
}
DoUpdateWorldState(WORLDSTATE_CRATES_REVEALED, _crateCount);
break;
+ case DATA_INFINITE_COUNTER:
+ _infiniteCouterState = data;
+ if (data == IN_PROGRESS)
+ {
+ if (!_infiniteGUID)
+ {
+ _eventTimer = 25;
+ instance->SummonCreature(NPC_INFINITE, InfiniteCorruptorPos);
+ instance->SummonCreature(NPC_TIME_RIFT, TimeRiftPos);
+ instance->SummonCreature(NPC_GUARDIAN_OF_TIME, GuardianOfTimePos);
+ events.ScheduleEvent(EVENT_INFINITE_TIMER, 1);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ bool SetBossState(uint32 type, EncounterState state) override
+ {
+ if (!InstanceScript::SetBossState(type, state))
+ return false;
+
+ switch (type)
+ {
+ case DATA_INFINITE:
+ if (state == DONE)
+ {
+ DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, 0);
+ DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN, 0);
+ }
+ break;
+ case DATA_MAL_GANIS:
+ if (state == DONE)
+ {
+ if (GameObject* go = instance->GetGameObject(_malGanisChestGUID))
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
+ instance->SummonCreature(NPC_CHROMIE_3, ChromieSummonPos[1]);
+ }
+ break;
+ default:
+ break;
}
- if (data == DONE)
- SaveToDB();
+ return true;
}
uint32 GetData(uint32 type) const override
{
switch (type)
{
- case DATA_MEATHOOK_EVENT:
- return _encounterState[0];
- case DATA_SALRAMM_EVENT:
- return _encounterState[1];
- case DATA_EPOCH_EVENT:
- return _encounterState[2];
- case DATA_MAL_GANIS_EVENT:
- return _encounterState[3];
- case DATA_INFINITE_EVENT:
- return _encounterState[4];
case DATA_CRATE_COUNT:
return _crateCount;
+ case DATA_INFINITE_COUNTER:
+ return _infiniteCouterState;
+ default:
+ break;
}
return 0;
}
@@ -244,58 +267,70 @@ class instance_culling_of_stratholme : public InstanceMapScript
return _exitGateGUID;
case DATA_MAL_GANIS_CHEST:
return _malGanisChestGUID;
+ default:
+ break;
}
return 0;
}
- std::string GetSaveData() override
+ void Update(uint32 diff) override
{
- OUT_SAVE_INST_DATA;
+ events.Update(diff);
- std::ostringstream saveStream;
- saveStream << "C S " << _encounterState[0] << ' ' << _encounterState[1] << ' '
- << _encounterState[2] << ' ' << _encounterState[3] << ' ' << _encounterState[4];
-
- OUT_SAVE_INST_DATA_COMPLETE;
- return saveStream.str();
- }
-
- void Load(const char* in) override
- {
- if (!in)
+ while (uint32 eventId = events.ExecuteEvent())
{
- OUT_LOAD_INST_DATA_FAIL;
- return;
- }
-
- OUT_LOAD_INST_DATA(in);
-
- char dataHead1, dataHead2;
- uint16 data0, data1, data2, data3, data4;
-
- std::istringstream loadStream(in);
- loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3 >> data4;
-
- if (dataHead1 == 'C' && dataHead2 == 'S')
- {
- _encounterState[0] = data0;
- _encounterState[1] = data1;
- _encounterState[2] = data2;
- _encounterState[3] = data3;
- _encounterState[4] = data4;
-
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (_encounterState[i] == IN_PROGRESS)
- _encounterState[i] = NOT_STARTED;
-
+ switch (eventId)
+ {
+ case EVENT_INFINITE_TIMER:
+ DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN, _eventTimer);
+
+ switch (_eventTimer)
+ {
+ case 25:
+ if (instance->HavePlayers())
+ if (Creature* chromie = instance->GetCreature(_chromieGUID))
+ chromie->AI()->TalkToMap(SAY_INFINITE_START);
+ break;
+ case 5:
+ if (instance->HavePlayers())
+ if (Creature* chromie = instance->GetCreature(_chromieGUID))
+ chromie->AI()->TalkToMap(SAY_INFINITE);
+ break;
+ case 0:
+ if (instance->HavePlayers())
+ if (Creature* chromie = instance->GetCreature(_chromieGUID))
+ chromie->AI()->TalkToMap(SAY_INFINITE_FAIL);
+
+ if (Creature* infinite = instance->GetCreature(_infiniteGUID))
+ {
+ if (Creature* guardian = infinite->FindNearestCreature(NPC_GUARDIAN_OF_TIME, 100.0f))
+ infinite->Kill(guardian);
+
+ if (Creature* rift = infinite->FindNearestCreature(NPC_TIME_RIFT, 100.0f))
+ {
+ infinite->GetMotionMaster()->MovePoint(0, rift->GetPositionX(), rift->GetPositionY(), rift->GetPositionZ());
+ rift->DespawnOrUnsummon(3000);
+ }
+
+ infinite->DespawnOrUnsummon(3000);
+ infinite->AI()->Talk(SAY_FAIL_EVENT);
+ }
+ DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, 0);
+ return;
+ default:
+ break;
+ }
+ events.ScheduleEvent(EVENT_INFINITE_TIMER, 60000);
+ --_eventTimer;
+ break;
+ default:
+ break;
+ }
}
- else
- OUT_LOAD_INST_DATA_FAIL;
-
- OUT_LOAD_INST_DATA_COMPLETE;
}
private:
+ uint64 _chromieGUID;
uint64 _arthasGUID;
uint64 _meathookGUID;
uint64 _salrammGUID;
@@ -308,9 +343,18 @@ class instance_culling_of_stratholme : public InstanceMapScript
uint64 _exitGateGUID;
uint64 _malGanisChestGUID;
uint64 _genericBunnyGUID;
- uint32 _encounterState[MAX_ENCOUNTER];
+
uint32 _crateCount;
+ uint32 _eventTimer;
+ uint32 _infiniteCouterState;
+
+ EventMap events;
};
+
+ InstanceScript* GetInstanceScript(InstanceMap* map) const override
+ {
+ return new instance_culling_of_stratholme_InstanceMapScript(map);
+ }
};
void AddSC_instance_culling_of_stratholme()
diff --git a/src/server/scripts/Kalimdor/zone_the_barrens.cpp b/src/server/scripts/Kalimdor/zone_the_barrens.cpp
index ff507f32bae..3670e225fd7 100644
--- a/src/server/scripts/Kalimdor/zone_the_barrens.cpp
+++ b/src/server/scripts/Kalimdor/zone_the_barrens.cpp
@@ -487,6 +487,14 @@ public:
Talk(SAY_TWIGGY_FLATHEAD_OVER);
Reset();
}
+ else if (creature) // Makes BIG WILL attackable.
+ {
+ creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ creature->HandleEmoteCommand(EMOTE_ONESHOT_ROAR);
+ creature->setFaction(14);
+ creature->AI()->AttackStart(warrior);
+ }
}
} else WaveTimer -= diff;
}
diff --git a/src/server/scripts/Northrend/Gundrak/boss_eck.cpp b/src/server/scripts/Northrend/Gundrak/boss_eck.cpp
index 0783a79b381..9f8cc818958 100644
--- a/src/server/scripts/Northrend/Gundrak/boss_eck.cpp
+++ b/src/server/scripts/Northrend/Gundrak/boss_eck.cpp
@@ -28,146 +28,92 @@ enum Spells
SPELL_ECK_SPRING_2 = 55837 //Eck leaps at a distant target.
};
-static Position EckSpawnPoint = { 1643.877930f, 936.278015f, 107.204948f, 0.668432f };
+enum Events
+{
+ EVENT_BITE = 1,
+ EVENT_SPIT,
+ EVENT_SPRING,
+ EVENT_BERSERK
+};
class boss_eck : public CreatureScript
{
public:
boss_eck() : CreatureScript("boss_eck") { }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetInstanceAI<boss_eckAI>(creature);
- }
-
- struct boss_eckAI : public ScriptedAI
+ struct boss_eckAI : public BossAI
{
- boss_eckAI(Creature* creature) : ScriptedAI(creature)
+ boss_eckAI(Creature* creature) : BossAI(creature, DATA_ECK_THE_FEROCIOUS_EVENT)
{
Initialize();
- instance = creature->GetInstanceScript();
}
void Initialize()
{
- uiBerserkTimer = urand(60 * IN_MILLISECONDS, 90 * IN_MILLISECONDS); //60-90 secs according to wowwiki
- uiBiteTimer = 5 * IN_MILLISECONDS;
- uiSpitTimer = 10 * IN_MILLISECONDS;
- uiSpringTimer = 8 * IN_MILLISECONDS;
-
- bBerserk = false;
+ Berserk = false;
}
- uint32 uiBerserkTimer;
- uint32 uiBiteTimer;
- uint32 uiSpitTimer;
- uint32 uiSpringTimer;
-
- bool bBerserk;
-
- InstanceScript* instance;
-
void Reset() override
{
+ _Reset();
Initialize();
-
- instance->SetData(DATA_ECK_THE_FEROCIOUS_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/) override
{
- instance->SetData(DATA_ECK_THE_FEROCIOUS_EVENT, IN_PROGRESS);
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_BITE, 5 * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_SPIT, 10 * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_SPRING, 8 * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_BERSERK, urand(60 * IN_MILLISECONDS, 90 * IN_MILLISECONDS)); //60-90 secs according to wowwiki
}
- void UpdateAI(uint32 diff) override
+ void DamageTaken(Unit* /*attacker*/, uint32& damage) override
{
- //Return since we have no target
- if (!UpdateVictim())
- return;
-
- if (uiBiteTimer <= diff)
- {
- DoCastVictim(SPELL_ECK_BITE);
- uiBiteTimer = urand(8*IN_MILLISECONDS, 12*IN_MILLISECONDS);
- } else uiBiteTimer -= diff;
-
- if (uiSpitTimer <= diff)
+ if (me->HealthBelowPctDamaged(20, damage) && !Berserk)
{
- DoCastVictim(SPELL_ECK_SPIT);
- uiSpitTimer = urand(6*IN_MILLISECONDS, 14*IN_MILLISECONDS);
- } else uiSpitTimer -= diff;
-
- if (uiSpringTimer <= diff)
- {
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1);
- if (target && target->GetTypeId() == TYPEID_PLAYER)
- {
- DoCast(target, RAND(SPELL_ECK_SPRING_1, SPELL_ECK_SPRING_2));
- uiSpringTimer = urand(5*IN_MILLISECONDS, 10*IN_MILLISECONDS);
- }
- } else uiSpringTimer -= diff;
+ events.RescheduleEvent(EVENT_BERSERK, 1000);
+ Berserk = true;
+ }
+ }
- //Berserk on timer or 20% of health
- if (!bBerserk)
+ void ExecuteEvent(uint32 eventId) override
+ {
+ switch (eventId)
{
- if (uiBerserkTimer <= diff)
- {
+ case EVENT_BITE:
+ DoCastVictim(SPELL_ECK_BITE);
+ events.ScheduleEvent(EVENT_BITE, urand(8 * IN_MILLISECONDS, 12 * IN_MILLISECONDS));
+ break;
+ case EVENT_SPIT:
+ DoCastVictim(SPELL_ECK_SPIT);
+ events.ScheduleEvent(EVENT_SPIT, urand(6 * IN_MILLISECONDS, 14 * IN_MILLISECONDS));
+ break;
+ case EVENT_SPRING:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 35.0f, true))
+ DoCast(target, RAND(SPELL_ECK_SPRING_1, SPELL_ECK_SPRING_2));
+ events.ScheduleEvent(EVENT_SPRING, urand(5 * IN_MILLISECONDS, 10 * IN_MILLISECONDS));
+ break;
+ case EVENT_BERSERK:
DoCast(me, SPELL_ECK_BERSERK);
- bBerserk = true;
- }
- else
- {
- uiBerserkTimer -= diff;
- if (HealthBelowPct(20))
- {
- DoCast(me, SPELL_ECK_BERSERK);
- bBerserk = true;
- }
- }
+ Berserk = true;
+ break;
+ default:
+ break;
}
-
- DoMeleeAttackIfReady();
}
- void JustDied(Unit* /*killer*/) override
- {
- instance->SetData(DATA_ECK_THE_FEROCIOUS_EVENT, DONE);
- }
+ private:
+ bool Berserk;
};
-};
-
-class npc_ruins_dweller : public CreatureScript
-{
-public:
- npc_ruins_dweller() : CreatureScript("npc_ruins_dweller") { }
-
CreatureAI* GetAI(Creature* creature) const override
{
- return GetInstanceAI<npc_ruins_dwellerAI>(creature);
+ return GetInstanceAI<boss_eckAI>(creature);
}
-
- struct npc_ruins_dwellerAI : public ScriptedAI
- {
- npc_ruins_dwellerAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- }
-
- InstanceScript* instance;
-
- void JustDied(Unit* /*killer*/) override
- {
- instance->SetData64(DATA_RUIN_DWELLER_DIED, me->GetGUID());
- if (instance->GetData(DATA_ALIVE_RUIN_DWELLERS) == 0)
- me->SummonCreature(CREATURE_ECK, EckSpawnPoint, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300*IN_MILLISECONDS);
- }
- };
-
};
void AddSC_boss_eck()
{
new boss_eck();
- new npc_ruins_dweller();
}
diff --git a/src/server/scripts/Northrend/Gundrak/gundrak.h b/src/server/scripts/Northrend/Gundrak/gundrak.h
index 8f269705a45..fffeca82f39 100644
--- a/src/server/scripts/Northrend/Gundrak/gundrak.h
+++ b/src/server/scripts/Northrend/Gundrak/gundrak.h
@@ -26,8 +26,7 @@ enum Data
DATA_MOORABI_EVENT,
DATA_DRAKKARI_COLOSSUS_EVENT,
DATA_GAL_DARAH_EVENT,
- DATA_ECK_THE_FEROCIOUS_EVENT,
- DATA_ALIVE_RUIN_DWELLERS
+ DATA_ECK_THE_FEROCIOUS_EVENT
};
enum Data64
@@ -39,8 +38,7 @@ enum Data64
DATA_MOORABI_STATUE,
DATA_DRAKKARI_COLOSSUS_STATUE,
DATA_DRAKKARI_COLOSSUS,
- DATA_RUIN_DWELLER_DIED,
- DATA_STATUE_ACTIVATE,
+ DATA_STATUE_ACTIVATE
};
enum mainCreatures
diff --git a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp
index e5efdad27f3..388d43e8dca 100644
--- a/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp
+++ b/src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp
@@ -31,6 +31,8 @@
4 - Eck the Ferocious
*/
+Position const EckSpawnPoint = { 1643.877930f, 936.278015f, 107.204948f, 0.668432f };
+
class instance_gundrak : public InstanceMapScript
{
public:
@@ -134,7 +136,7 @@ public:
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
}
- bool IsEncounterInProgress() const override
+ bool IsEncounterInProgress() const override
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS)
@@ -274,6 +276,17 @@ public:
}
}
+ void OnUnitDeath(Unit* unit) override
+ {
+ if (unit->GetEntry() == CREATURE_RUIN_DWELLER)
+ {
+ DwellerGUIDs.erase(unit->GetGUID());
+
+ if (DwellerGUIDs.empty())
+ unit->SummonCreature(CREATURE_ECK, EckSpawnPoint, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300 * IN_MILLISECONDS);
+ }
+ }
+
void SetData(uint32 type, uint32 data) override
{
switch (type)
@@ -329,9 +342,7 @@ public:
void SetData64(uint32 type, uint64 data) override
{
- if (type == DATA_RUIN_DWELLER_DIED)
- DwellerGUIDs.erase(data);
- else if (type == DATA_STATUE_ACTIVATE)
+ if (type == DATA_STATUE_ACTIVATE)
{
toActivate = data;
timer = 3500;
@@ -353,8 +364,6 @@ public:
return m_auiEncounter[3];
case DATA_ECK_THE_FEROCIOUS_EVENT:
return m_auiEncounter[4];
- case DATA_ALIVE_RUIN_DWELLERS:
- return DwellerGUIDs.size();
}
return 0;
diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp
index 7f34e470c7e..a83f4feb70a 100644
--- a/src/server/scripts/Northrend/zone_borean_tundra.cpp
+++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp
@@ -26,7 +26,6 @@ EndScriptData */
/* ContentData
npc_iruk
npc_corastrasza
-npc_jenny
npc_sinkhole_kill_credit
npc_khunok_the_behemoth
npc_nerubar_victim
@@ -407,125 +406,6 @@ public:
};
/*######
-## npc_jenny
-######*/
-
-enum Jenny
-{
- QUEST_LOADER_UP = 11881,
-
- NPC_FEZZIX_GEARTWIST = 25849,
- NPC_JENNY = 25969,
-
- SPELL_GIVE_JENNY_CREDIT = 46358,
- SPELL_CRATES_CARRIED = 46340,
- SPELL_DROP_CRATE = 46342
-};
-
-class npc_jenny : public CreatureScript
-{
-public:
- npc_jenny() : CreatureScript("npc_jenny") { }
-
- struct npc_jennyAI : public ScriptedAI
- {
- npc_jennyAI(Creature* creature) : ScriptedAI(creature)
- {
- setCrateNumber = false;
- }
-
- bool setCrateNumber;
-
- void Reset() override
- {
- if (!setCrateNumber)
- setCrateNumber = true;
-
- me->SetReactState(REACT_PASSIVE);
-
- if (!me->GetOwner())
- return;
-
- switch (me->GetOwner()->ToPlayer()->GetTeamId())
- {
- case TEAM_ALLIANCE:
- me->setFaction(FACTION_ESCORT_A_NEUTRAL_ACTIVE);
- break;
- default:
- case TEAM_HORDE:
- me->setFaction(FACTION_ESCORT_H_NEUTRAL_ACTIVE);
- break;
- }
- }
-
- void DamageTaken(Unit* /*pDone_by*/, uint32& /*uiDamage*/) override
- {
- DoCast(me, SPELL_DROP_CRATE, true);
- }
-
- void UpdateAI(uint32 /*diff*/) override
- {
- if (setCrateNumber)
- {
- me->AddAura(SPELL_CRATES_CARRIED, me);
- setCrateNumber = false;
- }
-
- if (!setCrateNumber && !me->HasAura(SPELL_CRATES_CARRIED))
- me->DisappearAndDie();
-
- if (!UpdateVictim())
- return;
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_jennyAI(creature);
- }
-};
-
-/*######
-## npc_fezzix_geartwist
-######*/
-
-class npc_fezzix_geartwist : public CreatureScript
-{
-public:
- npc_fezzix_geartwist() : CreatureScript("npc_fezzix_geartwist") { }
-
- struct npc_fezzix_geartwistAI : public ScriptedAI
- {
- npc_fezzix_geartwistAI(Creature* creature) : ScriptedAI(creature) { }
-
- void MoveInLineOfSight(Unit* who) override
-
- {
- ScriptedAI::MoveInLineOfSight(who);
-
- if (who->GetEntry() != NPC_JENNY || !who->HasAura(SPELL_CRATES_CARRIED))
- return;
-
- Unit* owner = who->GetOwner();
- if (!owner || !me->IsWithinDistInMap(who, 10.0f))
- return;
-
- if (Player* player = owner->ToPlayer())
- {
- owner->CastSpell(owner, SPELL_GIVE_JENNY_CREDIT, true); // Maybe is not working.
- player->CompleteQuest(QUEST_LOADER_UP);
- who->ToCreature()->DisappearAndDie();
- }
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_fezzix_geartwistAI(creature);
- }
-};
-
-/*######
## npc_nesingwary_trapper
######*/
@@ -2112,65 +1992,6 @@ public:
};
/*######
-## Quest 11608: Bury Those Cockroaches!
-######*/
-
-enum BuryThoseCockroaches
-{
- // Quest
- QUEST_BURY_THOSE_COCKROACHES = 11608,
-
- // Spells
- SPELL_SEAFORIUM_DEPTH_CHARGE_EXPLOSION = 45502
-
-};
-
-class npc_seaforium_depth_charge : public CreatureScript
-{
-public:
- npc_seaforium_depth_charge() : CreatureScript("npc_seaforium_depth_charge") { }
-
- struct npc_seaforium_depth_chargeAI : public ScriptedAI
- {
- npc_seaforium_depth_chargeAI(Creature* creature) : ScriptedAI(creature) { }
-
- uint32 uiExplosionTimer;
-
- void Reset() override
- {
- uiExplosionTimer = urand(5000, 10000);
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (uiExplosionTimer < diff)
- {
- DoCast(SPELL_SEAFORIUM_DEPTH_CHARGE_EXPLOSION);
- for (uint8 i = 0; i < 4; ++i)
- {
- if (Creature* cCredit = me->FindNearestCreature(25402 + i, 10.0f))//25402-25405 credit markers
- {
- if (Unit* uOwner = me->GetOwner())
- {
- Player* owner = uOwner->ToPlayer();
- if (owner && owner->GetQuestStatus(QUEST_BURY_THOSE_COCKROACHES) == QUEST_STATUS_INCOMPLETE)
- owner->KilledMonsterCredit(cCredit->GetEntry(), cCredit->GetGUID());
- }
- }
- }
- me->Kill(me);
- return;
- } else uiExplosionTimer -= diff;
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_seaforium_depth_chargeAI(creature);
- }
-};
-
-/*######
## Help Those That Cannot Help Themselves, Quest 11876
######*/
@@ -2577,8 +2398,6 @@ void AddSC_borean_tundra()
new npc_corastrasza();
new npc_iruk();
new npc_nerubar_victim();
- new npc_jenny();
- new npc_fezzix_geartwist();
new npc_nesingwary_trapper();
new npc_lurgglbr();
new npc_nexus_drake_hatchling();
@@ -2593,7 +2412,6 @@ void AddSC_borean_tundra()
new npc_bonker_togglevolt();
new npc_trapped_mammoth_calf();
new npc_magmoth_crusher();
- new npc_seaforium_depth_charge();
new npc_valiance_keep_cannoneer();
new npc_warmage_coldarra();
new npc_hidden_cultist();
diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp
index 8cb7630e60e..8bc0ba1722a 100644
--- a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp
@@ -80,7 +80,7 @@ public:
switch (eventId)
{
case EVENT_VOID_BLAST:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
{
DoCast(target, SPELL_VOID_BLAST);
++VoidBlastCounter;
diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
index bd16fe9edd2..15c660b4ad7 100644
--- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
@@ -114,7 +114,6 @@ class boss_broggok : public CreatureScript
break;
}
}
-
};
CreatureAI* GetAI(Creature* creature) const override
diff --git a/src/server/scripts/Outland/zone_shattrath_city.cpp b/src/server/scripts/Outland/zone_shattrath_city.cpp
index 9a62cde005c..c2e7df19ca1 100644
--- a/src/server/scripts/Outland/zone_shattrath_city.cpp
+++ b/src/server/scripts/Outland/zone_shattrath_city.cpp
@@ -30,7 +30,6 @@ npc_shattrathflaskvendors
npc_zephyr
npc_kservant
npc_ishanah
-npc_khadgar
EndContentData */
#include "ScriptMgr.h"
@@ -469,73 +468,6 @@ public:
}
};
-/*######
-# npc_khadgar
-######*/
-
-#define KHADGAR_GOSSIP_1 "I've heard your name spoken only in whispers, mage. Who are you?"
-#define KHADGAR_GOSSIP_2 "Go on, please."
-#define KHADGAR_GOSSIP_3 "I see." //6th too this
-#define KHADGAR_GOSSIP_4 "What did you do then?"
-#define KHADGAR_GOSSIP_5 "What happened next?"
-#define KHADGAR_GOSSIP_7 "There was something else I wanted to ask you."
-
-class npc_khadgar : public CreatureScript
-{
-public:
- npc_khadgar() : CreatureScript("npc_khadgar") { }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- player->PlayerTalkClass->ClearMenus();
- switch (action)
- {
- case GOSSIP_ACTION_INFO_DEF+1:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, KHADGAR_GOSSIP_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
- player->SEND_GOSSIP_MENU(9876, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+2:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, KHADGAR_GOSSIP_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3);
- player->SEND_GOSSIP_MENU(9877, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+3:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, KHADGAR_GOSSIP_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4);
- player->SEND_GOSSIP_MENU(9878, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+4:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, KHADGAR_GOSSIP_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5);
- player->SEND_GOSSIP_MENU(9879, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+5:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, KHADGAR_GOSSIP_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+6);
- player->SEND_GOSSIP_MENU(9880, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+6:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, KHADGAR_GOSSIP_7, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+7);
- player->SEND_GOSSIP_MENU(9881, creature->GetGUID());
- break;
- case GOSSIP_ACTION_INFO_DEF+7:
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, KHADGAR_GOSSIP_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
- player->SEND_GOSSIP_MENU(9243, creature->GetGUID());
- break;
- }
- return true;
- }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- if (player->GetQuestStatus(10211) != QUEST_STATUS_INCOMPLETE)
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, KHADGAR_GOSSIP_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
-
- player->SEND_GOSSIP_MENU(9243, creature->GetGUID());
-
- return true;
- }
-};
-
void AddSC_shattrath_city()
{
new npc_raliq_the_drunk();
@@ -544,5 +476,4 @@ void AddSC_shattrath_city()
new npc_zephyr();
new npc_kservant();
new npc_ishanah();
- new npc_khadgar();
}
diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp
index ea90c13f747..d04b25147c7 100644
--- a/src/server/scripts/World/npcs_special.cpp
+++ b/src/server/scripts/World/npcs_special.cpp
@@ -33,7 +33,6 @@ npc_guardian 100% guardianAI used to prevent players from accessin
npc_garments_of_quests 80% NPC's related to all Garments of-quests 5621, 5624, 5625, 5648, 565
npc_injured_patient 100% patients for triage-quests (6622 and 6624)
npc_doctor 100% Gustaf Vanhowzen and Gregory Victor, quest 6622 and 6624 (Triage)
-npc_mount_vendor 100% Regular mount vendors all over the world. Display gossip if player doesn't meet the requirements to buy
npc_sayge 100% Darkmoon event fortune teller, buff player based on answers given
npc_snake_trap_serpents 80% AI for snakes that summoned by Snake Trap
npc_shadowfiend 100% restore 5% of owner's mana when shadowfiend die from damage
@@ -1170,105 +1169,6 @@ public:
};
/*######
-## npc_mount_vendor
-######*/
-
-class npc_mount_vendor : public CreatureScript
-{
-public:
- npc_mount_vendor() : CreatureScript("npc_mount_vendor") { }
-
- bool OnGossipHello(Player* player, Creature* creature) override
- {
- if (creature->IsQuestGiver())
- player->PrepareQuestMenu(creature->GetGUID());
-
- bool canBuy = false;
- uint32 vendor = creature->GetEntry();
- uint8 race = player->getRace();
-
- switch (vendor)
- {
- case 384: //Katie Hunter
- case 1460: //Unger Statforth
- case 2357: //Merideth Carlson
- case 4885: //Gregor MacVince
- if (player->GetReputationRank(72) != REP_EXALTED && race != RACE_HUMAN)
- player->SEND_GOSSIP_MENU(5855, creature->GetGUID());
- else canBuy = true;
- break;
- case 1261: //Veron Amberstill
- if (player->GetReputationRank(47) != REP_EXALTED && race != RACE_DWARF)
- player->SEND_GOSSIP_MENU(5856, creature->GetGUID());
- else canBuy = true;
- break;
- case 3362: //Ogunaro Wolfrunner
- if (player->GetReputationRank(76) != REP_EXALTED && race != RACE_ORC)
- player->SEND_GOSSIP_MENU(5841, creature->GetGUID());
- else canBuy = true;
- break;
- case 3685: //Harb Clawhoof
- if (player->GetReputationRank(81) != REP_EXALTED && race != RACE_TAUREN)
- player->SEND_GOSSIP_MENU(5843, creature->GetGUID());
- else canBuy = true;
- break;
- case 4730: //Lelanai
- if (player->GetReputationRank(69) != REP_EXALTED && race != RACE_NIGHTELF)
- player->SEND_GOSSIP_MENU(5844, creature->GetGUID());
- else canBuy = true;
- break;
- case 4731: //Zachariah Post
- if (player->GetReputationRank(68) != REP_EXALTED && race != RACE_UNDEAD_PLAYER)
- player->SEND_GOSSIP_MENU(5840, creature->GetGUID());
- else canBuy = true;
- break;
- case 7952: //Zjolnir
- if (player->GetReputationRank(530) != REP_EXALTED && race != RACE_TROLL)
- player->SEND_GOSSIP_MENU(5842, creature->GetGUID());
- else canBuy = true;
- break;
- case 7955: //Milli Featherwhistle
- if (player->GetReputationRank(54) != REP_EXALTED && race != RACE_GNOME)
- player->SEND_GOSSIP_MENU(5857, creature->GetGUID());
- else canBuy = true;
- break;
- case 16264: //Winaestra
- if (player->GetReputationRank(911) != REP_EXALTED && race != RACE_BLOODELF)
- player->SEND_GOSSIP_MENU(10305, creature->GetGUID());
- else canBuy = true;
- break;
- case 17584: //Torallius the Pack Handler
- if (player->GetReputationRank(930) != REP_EXALTED && race != RACE_DRAENEI)
- player->SEND_GOSSIP_MENU(10239, creature->GetGUID());
- else canBuy = true;
- break;
- case 48510: //Kall Worthaton
- if (player->GetReputationRank(1133) != REP_EXALTED && race != RACE_GOBLIN)
- player->SEND_GOSSIP_MENU(17494, creature->GetGUID());
- else canBuy = true;
- break;
- }
-
- if (canBuy)
- {
- if (creature->IsVendor())
- player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
- player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
- }
- return true;
- }
-
- bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
- {
- player->PlayerTalkClass->ClearMenus();
- if (action == GOSSIP_ACTION_TRADE)
- player->GetSession()->SendListInventory(creature->GetGUID());
-
- return true;
- }
-};
-
-/*######
## npc_sayge
######*/
@@ -2488,7 +2388,6 @@ void AddSC_npcs_special()
new npc_injured_patient();
new npc_garments_of_quests();
new npc_guardian();
- new npc_mount_vendor();
new npc_sayge();
new npc_steam_tonk();
new npc_tonk_mine();