aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts/Northrend
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/scripts/Northrend')
-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
4 files changed, 63 insertions, 292 deletions
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();