diff options
Diffstat (limited to 'src/server/scripts/Northrend')
| -rw-r--r-- | src/server/scripts/Northrend/Gundrak/boss_eck.cpp | 146 | ||||
| -rw-r--r-- | src/server/scripts/Northrend/Gundrak/gundrak.h | 6 | ||||
| -rw-r--r-- | src/server/scripts/Northrend/Gundrak/instance_gundrak.cpp | 21 | ||||
| -rw-r--r-- | src/server/scripts/Northrend/zone_borean_tundra.cpp | 182 |
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(); |
