diff options
Diffstat (limited to 'src')
9 files changed, 734 insertions, 799 deletions
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp index 0f1bcd84025..203d1266e6a 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp @@ -86,7 +86,7 @@ class boss_akilzon : public CreatureScript struct boss_akilzonAI : public BossAI { - boss_akilzonAI(Creature* creature) : BossAI(creature, DATA_AKILZONEVENT) + boss_akilzonAI(Creature* creature) : BossAI(creature, BOSS_AKILZON) { Initialize(); } @@ -114,6 +114,8 @@ class boss_akilzon : public CreatureScript void EnterCombat(Unit* /*who*/) override { + _EnterCombat(); + events.ScheduleEvent(EVENT_STATIC_DISRUPTION, urand(10000, 20000)); // 10 to 20 seconds (bosskillers) events.ScheduleEvent(EVENT_GUST_OF_WIND, urand(20000, 30000)); // 20 to 30 seconds(bosskillers) events.ScheduleEvent(EVENT_CALL_LIGHTNING, urand(10000, 20000)); // totaly random timer. can't find any info on this @@ -122,8 +124,6 @@ class boss_akilzon : public CreatureScript events.ScheduleEvent(EVENT_ENRAGE, 10*MINUTE*IN_MILLISECONDS); // 10 minutes till enrage(bosskillers) Talk(SAY_AGGRO); - //DoZoneInCombat(); - instance->SetData(DATA_AKILZONEVENT, IN_PROGRESS); } void JustDied(Unit* /*killer*/) override @@ -376,7 +376,7 @@ class boss_akilzon : public CreatureScript CreatureAI* GetAI(Creature* creature) const override { - return GetInstanceAI<boss_akilzonAI>(creature); + return GetZulAmanAI<boss_akilzonAI>(creature); } }; @@ -466,7 +466,7 @@ class npc_akilzon_eagle : public CreatureScript CreatureAI* GetAI(Creature* creature) const override { - return new npc_akilzon_eagleAI(creature); + return GetZulAmanAI<npc_akilzon_eagleAI>(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp index 8c519f51df1..618190f750c 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp @@ -70,12 +70,11 @@ class boss_halazzi : public CreatureScript public: boss_halazzi() : CreatureScript("boss_halazzi") { } - struct boss_halazziAI : public ScriptedAI + struct boss_halazziAI : public BossAI { - boss_halazziAI(Creature* creature) : ScriptedAI(creature), summons(me) + boss_halazziAI(Creature* creature) : BossAI(creature, BOSS_HALAZZI) { Initialize(); - instance = creature->GetInstanceScript(); Phase = PHASE_NONE; FrenzyTimer = 0; SaberlashTimer = 0; @@ -91,8 +90,6 @@ class boss_halazzi : public CreatureScript CheckTimer = 1000; } - InstanceScript* instance; - SummonList summons; PhaseHalazzi Phase; uint32 FrenzyTimer; @@ -107,9 +104,7 @@ class boss_halazzi : public CreatureScript void Reset() override { - instance->SetData(DATA_HALAZZIEVENT, NOT_STARTED); - summons.DespawnAll(); - + _Reset(); Initialize(); DoCast(me, SPELL_DUAL_WIELD, true); @@ -120,7 +115,7 @@ class boss_halazzi : public CreatureScript void EnterCombat(Unit* /*who*/) override { - instance->SetData(DATA_HALAZZIEVENT, IN_PROGRESS); + _EnterCombat(); Talk(SAY_AGGRO); EnterPhase(PHASE_LYNX); } @@ -155,49 +150,49 @@ class boss_halazzi : public CreatureScript { switch (NextPhase) { - case PHASE_LYNX: - case PHASE_ENRAGE: - if (Phase == PHASE_MERGE) - { - DoCast(me, SPELL_TRANSFORM_MERGE, true); - me->Attack(me->GetVictim(), true); - me->GetMotionMaster()->MoveChase(me->GetVictim()); - } - if (Creature* Lynx = ObjectAccessor::GetCreature(*me, LynxGUID)) - Lynx->DisappearAndDie(); - me->SetMaxHealth(600000); - me->SetHealth(600000 - 150000 * TransformCount); - FrenzyTimer = 16000; - SaberlashTimer = 20000; - ShockTimer = 10000; - TotemTimer = 12000; - break; - case PHASE_SPLIT: - Talk(SAY_SPLIT); - DoCast(me, SPELL_TRANSFORM_SPLIT, true); - break; - case PHASE_HUMAN: - //DoCast(me, SPELL_SUMMON_LYNX, true); - DoSpawnCreature(NPC_SPIRIT_LYNX, 5, 5, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 0); - me->SetMaxHealth(400000); - me->SetHealth(400000); - ShockTimer = 10000; - TotemTimer = 12000; - break; - case PHASE_MERGE: - if (Unit* pLynx = ObjectAccessor::GetUnit(*me, LynxGUID)) - { - Talk(SAY_MERGE); - pLynx->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - pLynx->GetMotionMaster()->Clear(); - pLynx->GetMotionMaster()->MoveFollow(me, 0, 0); - me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MoveFollow(pLynx, 0, 0); - ++TransformCount; - } - break; - default: - break; + case PHASE_LYNX: + case PHASE_ENRAGE: + if (Phase == PHASE_MERGE) + { + DoCast(me, SPELL_TRANSFORM_MERGE, true); + me->Attack(me->GetVictim(), true); + me->GetMotionMaster()->MoveChase(me->GetVictim()); + } + if (Creature* Lynx = ObjectAccessor::GetCreature(*me, LynxGUID)) + Lynx->DisappearAndDie(); + me->SetMaxHealth(600000); + me->SetHealth(600000 - 150000 * TransformCount); + FrenzyTimer = 16000; + SaberlashTimer = 20000; + ShockTimer = 10000; + TotemTimer = 12000; + break; + case PHASE_SPLIT: + Talk(SAY_SPLIT); + DoCast(me, SPELL_TRANSFORM_SPLIT, true); + break; + case PHASE_HUMAN: + //DoCast(me, SPELL_SUMMON_LYNX, true); + DoSpawnCreature(NPC_SPIRIT_LYNX, 5, 5, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 0); + me->SetMaxHealth(400000); + me->SetHealth(400000); + ShockTimer = 10000; + TotemTimer = 12000; + break; + case PHASE_MERGE: + if (Unit* pLynx = ObjectAccessor::GetUnit(*me, LynxGUID)) + { + Talk(SAY_MERGE); + pLynx->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + pLynx->GetMotionMaster()->Clear(); + pLynx->GetMotionMaster()->MoveFollow(me, 0, 0); + me->GetMotionMaster()->Clear(); + me->GetMotionMaster()->MoveFollow(pLynx, 0, 0); + ++TransformCount; + } + break; + default: + break; } Phase = NextPhase; } @@ -212,7 +207,9 @@ class boss_halazzi : public CreatureScript Talk(SAY_BERSERK); DoCast(me, SPELL_BERSERK, true); BerserkTimer = 60000; - } else BerserkTimer -= diff; + } + else + BerserkTimer -= diff; if (Phase == PHASE_LYNX || Phase == PHASE_ENRAGE) { @@ -223,13 +220,17 @@ class boss_halazzi : public CreatureScript DoCastVictim(SPELL_SABER_LASH, true); //me->RemoveAurasDueToSpell(41296); SaberlashTimer = 30000; - } else SaberlashTimer -= diff; + } + else + SaberlashTimer -= diff; if (FrenzyTimer <= diff) { DoCast(me, SPELL_FRENZY); FrenzyTimer = urand(10000, 15000); - } else FrenzyTimer -= diff; + } + else + FrenzyTimer -= diff; if (Phase == PHASE_LYNX) { @@ -238,7 +239,9 @@ class boss_halazzi : public CreatureScript if (HealthBelowPct(25 * (3 - TransformCount))) EnterPhase(PHASE_SPLIT); CheckTimer = 1000; - } else CheckTimer -= diff; + } + else + CheckTimer -= diff; } } @@ -248,7 +251,9 @@ class boss_halazzi : public CreatureScript { DoCast(me, SPELL_SUMMON_TOTEM); TotemTimer = 20000; - } else TotemTimer -= diff; + } + else + TotemTimer -= diff; if (ShockTimer <= diff) { @@ -260,7 +265,9 @@ class boss_halazzi : public CreatureScript DoCast(target, SPELL_FLAMESHOCK); ShockTimer = urand(10000, 15000); } - } else ShockTimer -= diff; + } + else + ShockTimer -= diff; if (Phase == PHASE_HUMAN) { @@ -275,7 +282,9 @@ class boss_halazzi : public CreatureScript EnterPhase(PHASE_MERGE); } CheckTimer = 1000; - } else CheckTimer -= diff; + } + else + CheckTimer -= diff; } } @@ -297,7 +306,9 @@ class boss_halazzi : public CreatureScript } } CheckTimer = 1000; - } else CheckTimer -= diff; + } + else + CheckTimer -= diff; } DoMeleeAttackIfReady(); @@ -313,14 +324,14 @@ class boss_halazzi : public CreatureScript void JustDied(Unit* /*killer*/) override { - instance->SetData(DATA_HALAZZIEVENT, DONE); + _JustDied(); Talk(SAY_DEATH); } }; CreatureAI* GetAI(Creature* creature) const override { - return GetInstanceAI<boss_halazziAI>(creature); + return GetZulAmanAI<boss_halazziAI>(creature); } }; @@ -389,7 +400,7 @@ class npc_halazzi_lynx : public CreatureScript CreatureAI* GetAI(Creature* creature) const override { - return new npc_halazzi_lynxAI(creature); + return GetZulAmanAI<npc_halazzi_lynxAI>(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp index 47ca15dd33d..bb1fcf55522 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp @@ -135,7 +135,8 @@ enum Spells static float Pos_X[4] = {112.8827f, 107.8827f, 122.8827f, 127.8827f}; -static uint32 AddEntryList[8]= +static uint8 const AddCount = 8; +static uint32 const AddEntryList[AddCount]= { 24240, //Alyson Antille 24241, //Thurg @@ -226,7 +227,7 @@ struct boss_hexlord_addAI : public ScriptedAI void UpdateAI(uint32 /*diff*/) override { - if (instance->GetData(DATA_HEXLORDEVENT) != IN_PROGRESS) + if (instance->GetBossState(BOSS_HEXLORD) != IN_PROGRESS) { EnterEvadeMode(); return; @@ -240,21 +241,15 @@ class boss_hexlord_malacrass : public CreatureScript { public: - boss_hexlord_malacrass() - : CreatureScript("boss_hexlord_malacrass") - { - } + boss_hexlord_malacrass() : CreatureScript("boss_hexlord_malacrass") { } - struct boss_hex_lord_malacrassAI : public ScriptedAI + struct boss_hex_lord_malacrassAI : public BossAI { - boss_hex_lord_malacrassAI(Creature* creature) : ScriptedAI(creature) + boss_hex_lord_malacrassAI(Creature* creature) : BossAI(creature, BOSS_HEXLORD) { Initialize(); - instance = creature->GetInstanceScript(); SelectAddEntry(); - for (uint8 i = 0; i < 4; ++i) - AddGUID[i].Clear(); - PlayerGUID.Clear(); + PlayerClass = CLASS_NONE; } @@ -268,8 +263,6 @@ class boss_hexlord_malacrass : public CreatureScript ResetTimer = 5000; } - InstanceScript* instance; - ObjectGuid AddGUID[4]; uint32 AddEntry[4]; @@ -286,8 +279,7 @@ class boss_hexlord_malacrass : public CreatureScript void Reset() override { - instance->SetData(DATA_HEXLORDEVENT, NOT_STARTED); - + _Reset(); Initialize(); SpawnAdds(); @@ -298,9 +290,7 @@ class boss_hexlord_malacrass : public CreatureScript void EnterCombat(Unit* /*who*/) override { - instance->SetData(DATA_HEXLORDEVENT, IN_PROGRESS); - - DoZoneInCombat(); + _EnterCombat(); Talk(YELL_AGGRO); for (uint8 i = 0; i < 4; ++i) @@ -331,8 +321,7 @@ class boss_hexlord_malacrass : public CreatureScript void JustDied(Unit* /*killer*/) override { - instance->SetData(DATA_HEXLORDEVENT, DONE); - + _JustDied(); Talk(YELL_DEATH); for (uint8 i = 0; i < 4; ++i) @@ -345,16 +334,11 @@ class boss_hexlord_malacrass : public CreatureScript void SelectAddEntry() { - std::vector<uint32> AddList; - - for (uint8 i = 0; i < 8; ++i) - AddList.push_back(AddEntryList[i]); - - while (AddList.size() > 4) - AddList.erase(AddList.begin() + rand32() % AddList.size()); + std::list<uint32> addList(&AddEntryList[0], &AddEntryList[AddCount]); + Trinity::Containers::RandomResizeList(addList, 4); uint8 i = 0; - for (std::vector<uint32>::const_iterator itr = AddList.begin(); itr != AddList.end(); ++itr, ++i) + for (auto itr = addList.begin(); itr != addList.end(); ++itr, ++i) AddEntry[i] = *itr; } @@ -362,12 +346,14 @@ class boss_hexlord_malacrass : public CreatureScript { for (uint8 i = 0; i < 4; ++i) { - Creature* creature = (ObjectAccessor::GetCreature((*me), AddGUID[i])); + Creature* creature = (ObjectAccessor::GetCreature(*me, AddGUID[i])); if (!creature || !creature->IsAlive()) { - if (creature) creature->setDeathState(DEAD); + if (creature) + creature->setDeathState(DEAD); creature = me->SummonCreature(AddEntry[i], Pos_X[i], POS_Y, POS_Z, ORIENT, TEMPSUMMON_DEAD_DESPAWN, 0); - if (creature) AddGUID[i] = creature->GetGUID(); + if (creature) + AddGUID[i] = creature->GetGUID(); } else { @@ -391,7 +377,9 @@ class boss_hexlord_malacrass : public CreatureScript return; } ResetTimer = 5000; - } else ResetTimer -= diff; + } + else + ResetTimer -= diff; if (CheckAddState_Timer <= diff) { @@ -401,14 +389,18 @@ class boss_hexlord_malacrass : public CreatureScript temp->AI()->AttackStart(me->GetVictim()); CheckAddState_Timer = 5000; - } else CheckAddState_Timer -= diff; + } + else + CheckAddState_Timer -= diff; if (DrainPower_Timer <= diff) { DoCast(me, SPELL_DRAIN_POWER, true); Talk(YELL_DRAIN_POWER); DrainPower_Timer = urand(40000, 55000); // must cast in 60 sec, or buff/debuff will disappear - } else DrainPower_Timer -= diff; + } + else + DrainPower_Timer -= diff; if (SpiritBolts_Timer <= diff) { @@ -422,7 +414,9 @@ class boss_hexlord_malacrass : public CreatureScript SiphonSoul_Timer = 10000; // ready to drain PlayerAbility_Timer = 99999; } - } else SpiritBolts_Timer -= diff; + } + else + SpiritBolts_Timer -= diff; if (SiphonSoul_Timer <= diff) { @@ -448,14 +442,16 @@ class boss_hexlord_malacrass : public CreatureScript PlayerAbility_Timer = urand(8000, 10000); PlayerClass = target->getClass() - 1; - if (PlayerClass == CLASS_DRUID-1) + if (PlayerClass == CLASS_DRUID - 1) PlayerClass = CLASS_DRUID; - else if (PlayerClass == CLASS_PRIEST-1 && target->HasSpell(15473)) + else if (PlayerClass == CLASS_PRIEST - 1 && target->HasSpell(15473)) PlayerClass = CLASS_PRIEST; // shadow priest SiphonSoul_Timer = 99999; // buff lasts 30 sec } - } else SiphonSoul_Timer -= diff; + } + else + SiphonSoul_Timer -= diff; if (PlayerAbility_Timer <= diff) { @@ -465,7 +461,9 @@ class boss_hexlord_malacrass : public CreatureScript UseAbility(); PlayerAbility_Timer = urand(8000, 10000); //} - } else PlayerAbility_Timer -= diff; + } + else + PlayerAbility_Timer -= diff; DoMeleeAttackIfReady(); } @@ -487,11 +485,11 @@ class boss_hexlord_malacrass : public CreatureScript target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); break; case ABILITY_TARGET_HEAL: - target = DoSelectLowestHpFriendly(50, 0); + target = DoSelectLowestHpFriendly(50.f, 0); break; case ABILITY_TARGET_BUFF: { - std::list<Creature*> templist = DoFindFriendlyMissingBuff(50, PlayerAbility[PlayerClass][random].spell); + std::list<Creature*> templist = DoFindFriendlyMissingBuff(50.f, PlayerAbility[PlayerClass][random].spell); if (!templist.empty()) target = *(templist.begin()); } @@ -504,22 +502,17 @@ class boss_hexlord_malacrass : public CreatureScript CreatureAI* GetAI(Creature* creature) const override { - return GetInstanceAI<boss_hex_lord_malacrassAI>(creature); + return GetZulAmanAI<boss_hex_lord_malacrassAI>(creature); } }; class boss_thurg : public CreatureScript { public: - - boss_thurg() - : CreatureScript("boss_thurg") - { - } + boss_thurg() : CreatureScript("boss_thurg") { } struct boss_thurgAI : public boss_hexlord_addAI { - boss_thurgAI(Creature* creature) : boss_hexlord_addAI(creature) { Initialize(); @@ -555,13 +548,17 @@ class boss_thurg : public CreatureScript DoCast(target, SPELL_BLOODLUST, false); } bloodlust_timer = 12000; - } else bloodlust_timer -= diff; + } + else + bloodlust_timer -= diff; if (cleave_timer <= diff) { DoCastVictim(SPELL_CLEAVE, false); cleave_timer = 12000; //3 sec cast - } else cleave_timer -= diff; + } + else + cleave_timer -= diff; boss_hexlord_addAI::UpdateAI(diff); } @@ -569,18 +566,14 @@ class boss_thurg : public CreatureScript CreatureAI* GetAI(Creature* creature) const override { - return GetInstanceAI<boss_thurgAI>(creature); + return GetZulAmanAI<boss_thurgAI>(creature); } }; class boss_alyson_antille : public CreatureScript { public: - - boss_alyson_antille() - : CreatureScript("boss_alyson_antille") - { - } + boss_alyson_antille() : CreatureScript("boss_alyson_antille") { } struct boss_alyson_antilleAI : public boss_hexlord_addAI { @@ -652,7 +645,9 @@ class boss_alyson_antille : public CreatureScript DoCast(target, SPELL_DISPEL_MAGIC, false); } flashheal_timer = 2500; - } else flashheal_timer -= diff; + } + else + flashheal_timer -= diff; /*if (dispelmagic_timer <= diff) { @@ -666,7 +661,9 @@ class boss_alyson_antille : public CreatureScript me->CastSpell(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_DISPEL_MAGIC, false); dispelmagic_timer = 12000; - } else dispelmagic_timer -= diff;*/ + } + else + dispelmagic_timer -= diff;*/ boss_hexlord_addAI::UpdateAI(diff); } @@ -674,14 +671,13 @@ class boss_alyson_antille : public CreatureScript CreatureAI* GetAI(Creature* creature) const override { - return GetInstanceAI<boss_alyson_antilleAI>(creature); + return GetZulAmanAI<boss_alyson_antilleAI>(creature); } }; class boss_gazakroth : public CreatureScript { public: - boss_gazakroth() : CreatureScript("boss_gazakroth") { } struct boss_gazakrothAI : public boss_hexlord_addAI @@ -716,7 +712,9 @@ class boss_gazakroth : public CreatureScript { DoCastVictim(SPELL_FIREBOLT, false); firebolt_timer = 0.7 * IN_MILLISECONDS; - } else firebolt_timer -= diff; + } + else + firebolt_timer -= diff; boss_hexlord_addAI::UpdateAI(diff); } @@ -727,18 +725,14 @@ class boss_gazakroth : public CreatureScript CreatureAI* GetAI(Creature* creature) const override { - return GetInstanceAI<boss_gazakrothAI>(creature); + return GetZulAmanAI<boss_gazakrothAI>(creature); } }; class boss_lord_raadan : public CreatureScript { public: - - boss_lord_raadan() - : CreatureScript("boss_lord_raadan") - { - } + boss_lord_raadan() : CreatureScript("boss_lord_raadan") { } struct boss_lord_raadanAI : public boss_hexlord_addAI { @@ -772,13 +766,17 @@ class boss_lord_raadan : public CreatureScript { DoCastVictim(SPELL_THUNDERCLAP, false); thunderclap_timer = 12000; - } else thunderclap_timer -= diff; + } + else + thunderclap_timer -= diff; if (flamebreath_timer <= diff) { DoCastVictim(SPELL_FLAME_BREATH, false); flamebreath_timer = 12000; - } else flamebreath_timer -= diff; + } + else + flamebreath_timer -= diff; boss_hexlord_addAI::UpdateAI(diff); } @@ -786,18 +784,14 @@ class boss_lord_raadan : public CreatureScript CreatureAI* GetAI(Creature* creature) const override { - return GetInstanceAI<boss_lord_raadanAI>(creature); + return GetZulAmanAI<boss_lord_raadanAI>(creature); } }; class boss_darkheart : public CreatureScript { public: - - boss_darkheart() - : CreatureScript("boss_darkheart") - { - } + boss_darkheart() : CreatureScript("boss_darkheart") { } struct boss_darkheartAI : public boss_hexlord_addAI { @@ -827,7 +821,9 @@ class boss_darkheart : public CreatureScript { DoCastVictim(SPELL_PSYCHIC_WAIL, false); psychicwail_timer = 12000; - } else psychicwail_timer -= diff; + } + else + psychicwail_timer -= diff; boss_hexlord_addAI::UpdateAI(diff); } @@ -835,7 +831,7 @@ class boss_darkheart : public CreatureScript CreatureAI* GetAI(Creature* creature) const override { - return GetInstanceAI<boss_darkheartAI>(creature); + return GetZulAmanAI<boss_darkheartAI>(creature); } }; @@ -843,11 +839,7 @@ class boss_darkheart : public CreatureScript class boss_slither : public CreatureScript { public: - - boss_slither() - : CreatureScript("boss_slither") - { - } + boss_slither() : CreatureScript("boss_slither") { } struct boss_slitherAI : public boss_hexlord_addAI { @@ -894,7 +886,9 @@ class boss_slither : public CreatureScript if (Unit* victim = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(victim, SPELL_VENOM_SPIT, false); venomspit_timer = 2500; - } else venomspit_timer -= diff; + } + else + venomspit_timer -= diff; boss_hexlord_addAI::UpdateAI(diff); } @@ -902,18 +896,14 @@ class boss_slither : public CreatureScript CreatureAI* GetAI(Creature* creature) const override { - return GetInstanceAI<boss_slitherAI>(creature); + return GetZulAmanAI<boss_slitherAI>(creature); } }; class boss_fenstalker : public CreatureScript { public: - - boss_fenstalker() - : CreatureScript("boss_fenstalker") - { - } + boss_fenstalker() : CreatureScript("boss_fenstalker") { } struct boss_fenstalkerAI : public boss_hexlord_addAI { @@ -946,7 +936,9 @@ class boss_fenstalker : public CreatureScript if (me->GetVictim()) me->EnsureVictim()->CastSpell(me->GetVictim(), SPELL_VOLATILE_INFECTION, false); volatileinf_timer = 12000; - } else volatileinf_timer -= diff; + } + else + volatileinf_timer -= diff; boss_hexlord_addAI::UpdateAI(diff); } @@ -954,18 +946,14 @@ class boss_fenstalker : public CreatureScript CreatureAI* GetAI(Creature* creature) const override { - return GetInstanceAI<boss_fenstalkerAI>(creature); + return GetZulAmanAI<boss_fenstalkerAI>(creature); } }; class boss_koragg : public CreatureScript { public: - - boss_koragg() - : CreatureScript("boss_koragg") - { - } + boss_koragg() : CreatureScript("boss_koragg") { } struct boss_koraggAI : public boss_hexlord_addAI { @@ -1012,7 +1000,7 @@ class boss_koragg : public CreatureScript CreatureAI* GetAI(Creature* creature) const override { - return GetInstanceAI<boss_koraggAI>(creature); + return GetZulAmanAI<boss_koraggAI>(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp index 05c2c37cc94..56ce4193c5f 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp @@ -111,18 +111,13 @@ float hatcherway[2][5][3] = class boss_janalai : public CreatureScript { public: + boss_janalai() : CreatureScript("boss_janalai") { } - boss_janalai() - : CreatureScript("boss_janalai") + struct boss_janalaiAI : public BossAI { - } - - struct boss_janalaiAI : public ScriptedAI - { - boss_janalaiAI(Creature* creature) : ScriptedAI(creature) + boss_janalaiAI(Creature* creature) : BossAI(creature, BOSS_JANALAI) { Initialize(); - instance = creature->GetInstanceScript(); } void Initialize() @@ -144,8 +139,6 @@ class boss_janalai : public CreatureScript FireBombGUIDs[i].Clear(); } - InstanceScript* instance; - uint32 FireBreathTimer; uint32 BombTimer; uint32 BombSequenceTimer; @@ -163,7 +156,7 @@ class boss_janalai : public CreatureScript void Reset() override { - instance->SetData(DATA_JANALAIEVENT, NOT_STARTED); + _Reset(); Initialize(); @@ -174,7 +167,7 @@ class boss_janalai : public CreatureScript { Talk(SAY_DEATH); - instance->SetData(DATA_JANALAIEVENT, DONE); + _JustDied(); } void KilledUnit(Unit* /*victim*/) override @@ -184,10 +177,9 @@ class boss_janalai : public CreatureScript void EnterCombat(Unit* /*who*/) override { - instance->SetData(DATA_JANALAIEVENT, IN_PROGRESS); + _EnterCombat(); Talk(SAY_AGGRO); - // DoZoneInCombat(); } void DamageDealt(Unit* target, uint32 &damage, DamageEffectType /*damagetype*/) override @@ -308,7 +300,9 @@ class boss_janalai : public CreatureScript if (BombCount == 40) { BombSequenceTimer = 5000; - } else BombSequenceTimer = 100; + } + else + BombSequenceTimer = 100; } else { @@ -363,7 +357,9 @@ class boss_janalai : public CreatureScript DoCast(me, SPELL_BERSERK, true); EnrageTimer = 300000; } - } else EnrageTimer -= diff; + } + else + EnrageTimer -= diff; if (BombTimer <= diff) { @@ -394,7 +390,9 @@ class boss_janalai : public CreatureScript DoTeleportPlayer(i_pl, JanalainPos[0][0] - 5 + rand32() % 10, JanalainPos[0][1] - 5 + rand32() % 10, JanalainPos[0][2], 0); //DoCast(Temp, SPELL_SUMMON_PLAYERS, true) // core bug, spell does not work if too far return; - } else BombTimer -= diff; + } + else + BombTimer -= diff; if (!noeggs) { @@ -437,28 +435,26 @@ class boss_janalai : public CreatureScript isFlameBreathing = true; } FireBreathTimer = 8000; - } else FireBreathTimer -= diff; + } + else + FireBreathTimer -= diff; } }; CreatureAI* GetAI(Creature* creature) const override { - return GetInstanceAI<boss_janalaiAI>(creature); + return GetZulAmanAI<boss_janalaiAI>(creature); } }; class npc_janalai_firebomb : public CreatureScript { public: - - npc_janalai_firebomb() - : CreatureScript("npc_janalai_firebomb") - { - } + npc_janalai_firebomb() : CreatureScript("npc_janalai_firebomb") { } struct npc_janalai_firebombAI : public ScriptedAI { - npc_janalai_firebombAI(Creature* creature) : ScriptedAI(creature){ } + npc_janalai_firebombAI(Creature* creature) : ScriptedAI(creature) { } void Reset() override { } @@ -474,24 +470,19 @@ class npc_janalai_firebomb : public CreatureScript void MoveInLineOfSight(Unit* /*who*/) override { } - void UpdateAI(uint32 /*diff*/) override { } }; CreatureAI* GetAI(Creature* creature) const override { - return new npc_janalai_firebombAI(creature); + return GetZulAmanAI<npc_janalai_firebombAI>(creature); } }; class npc_janalai_hatcher : public CreatureScript { public: - - npc_janalai_hatcher() - : CreatureScript("npc_janalai_hatcher") - { - } + npc_janalai_hatcher() : CreatureScript("npc_janalai_hatcher") { } struct npc_janalai_hatcherAI : public ScriptedAI { @@ -577,7 +568,7 @@ class npc_janalai_hatcher : public CreatureScript void UpdateAI(uint32 diff) override { - if (!instance || !(instance->GetData(DATA_JANALAIEVENT) == IN_PROGRESS)) + if (!instance || !(instance->GetBossState(BOSS_JANALAI) == IN_PROGRESS)) { me->DisappearAndDie(); return; @@ -613,25 +604,23 @@ class npc_janalai_hatcher : public CreatureScript else me->DisappearAndDie(); - } else WaitTimer -= diff; + } + else + WaitTimer -= diff; } } }; CreatureAI* GetAI(Creature* creature) const override { - return GetInstanceAI<npc_janalai_hatcherAI>(creature); + return GetZulAmanAI<npc_janalai_hatcherAI>(creature); } }; class npc_janalai_hatchling : public CreatureScript { public: - - npc_janalai_hatchling() - : CreatureScript("npc_janalai_hatchling") - { - } + npc_janalai_hatchling() : CreatureScript("npc_janalai_hatchling") { } struct npc_janalai_hatchlingAI : public ScriptedAI { @@ -664,7 +653,7 @@ class npc_janalai_hatchling : public CreatureScript void UpdateAI(uint32 diff) override { - if (!instance || !(instance->GetData(DATA_JANALAIEVENT) == IN_PROGRESS)) + if (!instance || !(instance->GetBossState(BOSS_JANALAI) == IN_PROGRESS)) { me->DisappearAndDie(); return; @@ -677,7 +666,9 @@ class npc_janalai_hatchling : public CreatureScript { DoCastVictim(SPELL_FLAMEBUFFET, false); BuffetTimer = 10000; - } else BuffetTimer -= diff; + } + else + BuffetTimer -= diff; DoMeleeAttackIfReady(); } @@ -685,37 +676,34 @@ class npc_janalai_hatchling : public CreatureScript CreatureAI* GetAI(Creature* creature) const override { - return GetInstanceAI<npc_janalai_hatchlingAI>(creature); + return GetZulAmanAI<npc_janalai_hatchlingAI>(creature); } }; class npc_janalai_egg : public CreatureScript { -public: - npc_janalai_egg(): CreatureScript("npc_janalai_egg") { } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_janalai_eggAI(creature); - } + public: + npc_janalai_egg(): CreatureScript("npc_janalai_egg") { } - struct npc_janalai_eggAI : public ScriptedAI - { - npc_janalai_eggAI(Creature* creature) : ScriptedAI(creature){ } + struct npc_janalai_eggAI : public ScriptedAI + { + npc_janalai_eggAI(Creature* creature) : ScriptedAI(creature) { } - void Reset() override { } + void Reset() override { } - void UpdateAI(uint32 /*diff*/) override { } + void UpdateAI(uint32 /*diff*/) override { } - void SpellHit(Unit* /*caster*/, const SpellInfo* spell) override - { - if (spell->Id == SPELL_HATCH_EGG) + void SpellHit(Unit* /*caster*/, const SpellInfo* spell) override { - DoCast(SPELL_SUMMON_HATCHLING); + if (spell->Id == SPELL_HATCH_EGG) + DoCast(SPELL_SUMMON_HATCHLING); } - } - }; + }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetZulAmanAI<npc_janalai_eggAI>(creature); + } }; void AddSC_boss_janalai() diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp index 5d3f3a8affe..9711126dfcd 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp @@ -83,15 +83,11 @@ float NalorakkWay[8][3] = class boss_nalorakk : public CreatureScript { public: + boss_nalorakk() : CreatureScript("boss_nalorakk") { } - boss_nalorakk() - : CreatureScript("boss_nalorakk") + struct boss_nalorakkAI : public BossAI { - } - - struct boss_nalorakkAI : public ScriptedAI - { - boss_nalorakkAI(Creature* creature) : ScriptedAI(creature) + boss_nalorakkAI(Creature* creature) : BossAI(creature, BOSS_NALORAKK) { Initialize(); inMove = false; @@ -101,7 +97,6 @@ class boss_nalorakk : public CreatureScript LaceratingSlash_Timer = 0; RendFlesh_Timer = 0; DeafeningRoar_Timer = 0; - instance = creature->GetInstanceScript(); } void Initialize() @@ -115,8 +110,6 @@ class boss_nalorakk : public CreatureScript inBearForm = false; } - InstanceScript* instance; - uint32 BrutalSwipe_Timer; uint32 Mangle_Timer; uint32 Surge_Timer; @@ -136,6 +129,8 @@ class boss_nalorakk : public CreatureScript void Reset() override { + _Reset(); + if (MoveEvent) { me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); @@ -144,62 +139,42 @@ class boss_nalorakk : public CreatureScript waitTimer = 0; me->SetSpeedRate(MOVE_RUN, 2); me->SetWalk(false); - }else - { - (*me).GetMotionMaster()->MovePoint(0, NalorakkWay[7][0], NalorakkWay[7][1], NalorakkWay[7][2]); } - - instance->SetData(DATA_NALORAKKEVENT, NOT_STARTED); + else + me->GetMotionMaster()->MovePoint(0, NalorakkWay[7][0], NalorakkWay[7][1], NalorakkWay[7][2]); Initialize(); // me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 5122); /// @todo find the correct equipment id } - void SendAttacker(Unit* target) + void SendAttacker(Unit* target) const { - std::list<Creature*> templist; - float x, y, z; - me->GetPosition(x, y, z); - - { - CellCoord pair(Trinity::ComputeCellCoord(x, y)); - Cell cell(pair); - cell.SetNoCreate(); + std::vector<Creature*> tempList; - Trinity::AllFriendlyCreaturesInGrid check(me); - Trinity::CreatureListSearcher<Trinity::AllFriendlyCreaturesInGrid> searcher(me, templist, check); + Trinity::AllFriendlyCreaturesInGrid check(me); + Trinity::CreatureListSearcher<Trinity::AllFriendlyCreaturesInGrid> searcher(me, tempList, check); + me->VisitNearbyGridObject(25.0f, searcher); - TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AllFriendlyCreaturesInGrid>, GridTypeMapContainer> cSearcher(searcher); - - cell.Visit(pair, cSearcher, *(me->GetMap()), *me, me->GetGridActivationRange()); - } - - if (templist.empty()) + if (tempList.empty()) return; - for (std::list<Creature*>::const_iterator i = templist.begin(); i != templist.end(); ++i) + for (Creature* creature : tempList) { - if ((*i) && me->IsWithinDistInMap((*i), 25)) - { - (*i)->SetNoCallAssistance(true); - (*i)->AI()->AttackStart(target); - } + creature->SetNoCallAssistance(true); + creature->AI()->AttackStart(target); } } void AttackStart(Unit* who) override { if (!MoveEvent) - ScriptedAI::AttackStart(who); + BossAI::AttackStart(who); } void MoveInLineOfSight(Unit* who) override - { if (!MoveEvent) - { - ScriptedAI::MoveInLineOfSight(who); - } + BossAI::MoveInLineOfSight(who); else { if (me->IsHostileTo(who)) @@ -213,8 +188,8 @@ class boss_nalorakk : public CreatureScript { Talk(YELL_NALORAKK_WAVE1); - (*me).GetMotionMaster()->MovePoint(1, NalorakkWay[1][0], NalorakkWay[1][1], NalorakkWay[1][2]); - MovePhase ++; + me->GetMotionMaster()->MovePoint(1, NalorakkWay[1][0], NalorakkWay[1][1], NalorakkWay[1][2]); + ++MovePhase; inMove = true; SendAttacker(who); @@ -225,8 +200,8 @@ class boss_nalorakk : public CreatureScript { Talk(YELL_NALORAKK_WAVE2); - (*me).GetMotionMaster()->MovePoint(3, NalorakkWay[3][0], NalorakkWay[3][1], NalorakkWay[3][2]); - MovePhase ++; + me->GetMotionMaster()->MovePoint(3, NalorakkWay[3][0], NalorakkWay[3][1], NalorakkWay[3][2]); + ++MovePhase; inMove = true; SendAttacker(who); @@ -237,8 +212,8 @@ class boss_nalorakk : public CreatureScript { Talk(YELL_NALORAKK_WAVE3); - (*me).GetMotionMaster()->MovePoint(6, NalorakkWay[6][0], NalorakkWay[6][1], NalorakkWay[6][2]); - MovePhase ++; + me->GetMotionMaster()->MovePoint(6, NalorakkWay[6][0], NalorakkWay[6][1], NalorakkWay[6][2]); + ++MovePhase; inMove = true; SendAttacker(who); @@ -265,15 +240,14 @@ class boss_nalorakk : public CreatureScript void EnterCombat(Unit* /*who*/) override { - instance->SetData(DATA_NALORAKKEVENT, IN_PROGRESS); + _EnterCombat(); Talk(YELL_AGGRO); - DoZoneInCombat(); } void JustDied(Unit* /*killer*/) override { - instance->SetData(DATA_NALORAKKEVENT, DONE); + _JustDied(); Talk(YELL_DEATH); } @@ -314,7 +288,7 @@ class boss_nalorakk : public CreatureScript case 3: case 4: case 6: - MovePhase ++; + ++MovePhase; waitTimer = 1; inMove = true; return; @@ -337,10 +311,12 @@ class boss_nalorakk : public CreatureScript { if (waitTimer <= diff) { - (*me).GetMotionMaster()->MovementExpired(); - (*me).GetMotionMaster()->MovePoint(MovePhase, NalorakkWay[MovePhase][0], NalorakkWay[MovePhase][1], NalorakkWay[MovePhase][2]); + me->GetMotionMaster()->MovementExpired(); + me->GetMotionMaster()->MovePoint(MovePhase, NalorakkWay[MovePhase][0], NalorakkWay[MovePhase][1], NalorakkWay[MovePhase][2]); waitTimer = 0; - } else waitTimer -= diff; + } + else + waitTimer -= diff; } if (!UpdateVictim()) @@ -351,7 +327,9 @@ class boss_nalorakk : public CreatureScript DoCast(me, SPELL_BERSERK, true); Talk(YELL_BERSERK); Berserk_Timer = 600000; - } else Berserk_Timer -= diff; + } + else + Berserk_Timer -= diff; if (ShapeShift_Timer <= diff) { @@ -377,7 +355,9 @@ class boss_nalorakk : public CreatureScript ShapeShift_Timer = urand(20000, 25000); // dur 30s inBearForm = true; } - } else ShapeShift_Timer -= diff; + } + else + ShapeShift_Timer -= diff; if (!inBearForm) { @@ -385,7 +365,9 @@ class boss_nalorakk : public CreatureScript { DoCastVictim(SPELL_BRUTALSWIPE); BrutalSwipe_Timer = urand(7000, 12000); - } else BrutalSwipe_Timer -= diff; + } + else + BrutalSwipe_Timer -= diff; if (Mangle_Timer <= diff) { @@ -395,7 +377,9 @@ class boss_nalorakk : public CreatureScript Mangle_Timer = 1000; } else Mangle_Timer = urand(10000, 15000); - } else Mangle_Timer -= diff; + } + else + Mangle_Timer -= diff; if (Surge_Timer <= diff) { @@ -404,7 +388,9 @@ class boss_nalorakk : public CreatureScript if (target) DoCast(target, SPELL_SURGE); Surge_Timer = urand(15000, 20000); - } else Surge_Timer -= diff; + } + else + Surge_Timer -= diff; } else { @@ -412,19 +398,25 @@ class boss_nalorakk : public CreatureScript { DoCastVictim(SPELL_LACERATINGSLASH); LaceratingSlash_Timer = urand(18000, 23000); - } else LaceratingSlash_Timer -= diff; + } + else + LaceratingSlash_Timer -= diff; if (RendFlesh_Timer <= diff) { DoCastVictim(SPELL_RENDFLESH); RendFlesh_Timer = urand(5000, 10000); - } else RendFlesh_Timer -= diff; + } + else + RendFlesh_Timer -= diff; if (DeafeningRoar_Timer <= diff) { DoCastVictim(SPELL_DEAFENINGROAR); DeafeningRoar_Timer = urand(15000, 20000); - } else DeafeningRoar_Timer -= diff; + } + else + DeafeningRoar_Timer -= diff; } DoMeleeAttackIfReady(); @@ -433,7 +425,7 @@ class boss_nalorakk : public CreatureScript CreatureAI* GetAI(Creature* creature) const override { - return GetInstanceAI<boss_nalorakkAI>(creature); + return GetZulAmanAI<boss_nalorakkAI>(creature); } }; @@ -441,4 +433,3 @@ void AddSC_boss_nalorakk() { new boss_nalorakk(); } - diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp index e3d1d7f9373..d766f3445ec 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_zuljin.cpp @@ -98,15 +98,15 @@ enum Phase struct SpiritInfoStruct { uint32 entry; - float x, y, z, orient; + Position pos; }; -static SpiritInfoStruct SpiritInfo[4] = +static SpiritInfoStruct const SpiritInfo[4] = { - {23878, 147.87f, 706.51f, 45.11f, 3.04f}, - {23880, 88.95f, 705.49f, 45.11f, 6.11f}, - {23877, 137.23f, 725.98f, 45.11f, 3.71f}, - {23879, 104.29f, 726.43f, 45.11f, 5.43f} + { 23878, { 147.87f, 706.51f, 45.11f, 3.04f } }, + { 23880, { 88.950f, 705.49f, 45.11f, 6.11f } }, + { 23877, { 137.23f, 725.98f, 45.11f, 3.71f } }, + { 23879, { 104.29f, 726.43f, 45.11f, 5.43f } } }; struct TransformStruct @@ -115,29 +115,24 @@ struct TransformStruct uint32 spell, unaura; }; -static TransformStruct Transform[4] = +static TransformStruct const Transform[4] = { - {YELL_TRANSFORM_TO_BEAR, SPELL_SHAPE_OF_THE_BEAR, SPELL_WHIRLWIND}, - {YELL_TRANSFORM_TO_EAGLE, SPELL_SHAPE_OF_THE_EAGLE, SPELL_SHAPE_OF_THE_BEAR}, - {YELL_TRANSFORM_TO_LYNX, SPELL_SHAPE_OF_THE_LYNX, SPELL_SHAPE_OF_THE_EAGLE}, - {YELL_TRANSFORM_TO_DRAGONHAWK, SPELL_SHAPE_OF_THE_DRAGONHAWK, SPELL_SHAPE_OF_THE_LYNX} + { YELL_TRANSFORM_TO_BEAR, SPELL_SHAPE_OF_THE_BEAR, SPELL_WHIRLWIND }, + { YELL_TRANSFORM_TO_EAGLE, SPELL_SHAPE_OF_THE_EAGLE, SPELL_SHAPE_OF_THE_BEAR }, + { YELL_TRANSFORM_TO_LYNX, SPELL_SHAPE_OF_THE_LYNX, SPELL_SHAPE_OF_THE_EAGLE }, + { YELL_TRANSFORM_TO_DRAGONHAWK, SPELL_SHAPE_OF_THE_DRAGONHAWK, SPELL_SHAPE_OF_THE_LYNX } }; class boss_zuljin : public CreatureScript { public: + boss_zuljin() : CreatureScript("boss_zuljin") { } - boss_zuljin() - : CreatureScript("boss_zuljin") + struct boss_zuljinAI : public BossAI { - } - - struct boss_zuljinAI : public ScriptedAI - { - boss_zuljinAI(Creature* creature) : ScriptedAI(creature), Summons(me) + boss_zuljinAI(Creature* creature) : BossAI(creature, BOSS_ZULJIN) { Initialize(); - instance = creature->GetInstanceScript(); health_20 = 0; } @@ -167,8 +162,6 @@ class boss_zuljin : public CreatureScript TankGUID.Clear(); } - InstanceScript* instance; - ObjectGuid SpiritGUID[4]; ObjectGuid ClawTargetGUID; ObjectGuid TankGUID; @@ -194,18 +187,14 @@ class boss_zuljin : public CreatureScript uint32 Flame_Breath_Timer; uint32 Pillar_Of_Fire_Timer; - SummonList Summons; - void Reset() override { - instance->SetData(DATA_ZULJINEVENT, NOT_STARTED); + _Reset(); health_20 = me->CountPctFromMaxHealth(20); Initialize(); - Summons.DespawnAll(); - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 33975); //me->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, 218172674); //me->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE); @@ -213,9 +202,7 @@ class boss_zuljin : public CreatureScript void EnterCombat(Unit* /*who*/) override { - instance->SetData(DATA_ZULJINEVENT, IN_PROGRESS); - - DoZoneInCombat(); + _EnterCombat(); Talk(YELL_INTRO); SpawnAdds(); @@ -232,10 +219,9 @@ class boss_zuljin : public CreatureScript void JustDied(Unit* /*killer*/) override { - instance->SetData(DATA_ZULJINEVENT, DONE); + _JustDied(); Talk(YELL_DEATH); - Summons.DespawnEntry(CREATURE_COLUMN_OF_FIRE); if (Unit* Temp = ObjectAccessor::GetUnit(*me, SpiritGUID[3])) Temp->SetUInt32Value(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD); @@ -264,7 +250,9 @@ class boss_zuljin : public CreatureScript DoCastVictim(SPELL_OVERPOWER, false); Overpower_Timer = 5000; } - } else me->AttackerStateUpdate(me->GetVictim()); + } + else + me->AttackerStateUpdate(me->GetVictim()); me->resetAttackTimer(); } } @@ -272,11 +260,9 @@ class boss_zuljin : public CreatureScript void SpawnAdds() { - Creature* creature = NULL; for (uint8 i = 0; i < 4; ++i) { - creature = me->SummonCreature(SpiritInfo[i].entry, SpiritInfo[i].x, SpiritInfo[i].y, SpiritInfo[i].z, SpiritInfo[i].orient, TEMPSUMMON_DEAD_DESPAWN, 0); - if (creature) + if (Creature* creature = me->SummonCreature(SpiritInfo[i].entry, SpiritInfo[i].pos, TEMPSUMMON_DEAD_DESPAWN, 0)) { creature->CastSpell(creature, SPELL_SPIRIT_AURA, true); creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -302,68 +288,60 @@ class boss_zuljin : public CreatureScript } } - void JustSummoned(Creature* summon) override - { - Summons.Summon(summon); - } - - void SummonedCreatureDespawn(Creature* summon) override - { - Summons.Despawn(summon); - } - void EnterPhase(uint32 NextPhase) { switch (NextPhase) { - case 0: - break; - case 1: - case 2: - case 3: - case 4: - DoTeleportTo(CENTER_X, CENTER_Y, CENTER_Z, 100); - DoResetThreat(); - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 0); - me->RemoveAurasDueToSpell(Transform[Phase].unaura); - DoCast(me, Transform[Phase].spell); - Talk(Transform[Phase].text); - if (Phase > 0) - { - if (Unit* Temp = ObjectAccessor::GetUnit(*me, SpiritGUID[Phase - 1])) - Temp->SetUInt32Value(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD); - } - if (Unit* Temp = ObjectAccessor::GetUnit(*me, SpiritGUID[NextPhase - 1])) - Temp->CastSpell(me, SPELL_SIPHON_SOUL, false); // should m cast on temp - if (NextPhase == 2) - { - me->GetMotionMaster()->Clear(); - DoCast(me, SPELL_ENERGY_STORM, true); // enemy aura - for (uint8 i = 0; i < 4; ++i) + case 0: + break; + case 1: + case 2: + case 3: + case 4: + DoTeleportTo(CENTER_X, CENTER_Y, CENTER_Z, 100); + DoResetThreat(); + me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 0); + me->RemoveAurasDueToSpell(Transform[Phase].unaura); + DoCast(me, Transform[Phase].spell); + Talk(Transform[Phase].text); + if (Phase > 0) + { + if (Unit* Temp = ObjectAccessor::GetUnit(*me, SpiritGUID[Phase - 1])) + Temp->SetUInt32Value(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD); + } + if (Unit* Temp = ObjectAccessor::GetUnit(*me, SpiritGUID[NextPhase - 1])) + Temp->CastSpell(me, SPELL_SIPHON_SOUL, false); // should m cast on temp + + if (NextPhase == 2) { - Creature* Vortex = DoSpawnCreature(CREATURE_FEATHER_VORTEX, 0, 0, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 0); - if (Vortex) + me->GetMotionMaster()->Clear(); + DoCast(me, SPELL_ENERGY_STORM, true); // enemy aura + for (uint8 i = 0; i < 4; ++i) { - Vortex->CastSpell(Vortex, SPELL_CYCLONE_PASSIVE, true); - Vortex->CastSpell(Vortex, SPELL_CYCLONE_VISUAL, true); - Vortex->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - Vortex->SetSpeedRate(MOVE_RUN, 1.0f); - Vortex->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0)); - DoZoneInCombat(Vortex); + Creature* Vortex = DoSpawnCreature(CREATURE_FEATHER_VORTEX, 0, 0, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 0); + if (Vortex) + { + Vortex->CastSpell(Vortex, SPELL_CYCLONE_PASSIVE, true); + Vortex->CastSpell(Vortex, SPELL_CYCLONE_VISUAL, true); + Vortex->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + Vortex->SetSpeedRate(MOVE_RUN, 1.0f); + Vortex->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0)); + DoZoneInCombat(Vortex); + } } } - } - else - AttackStart(me->GetVictim()); - if (NextPhase == 3) - { - me->RemoveAurasDueToSpell(SPELL_ENERGY_STORM); - Summons.DespawnEntry(CREATURE_FEATHER_VORTEX); - me->GetMotionMaster()->MoveChase(me->GetVictim()); - } - break; - default: - break; + else + AttackStart(me->GetVictim()); + + if (NextPhase == 3) + { + me->RemoveAurasDueToSpell(SPELL_ENERGY_STORM); + summons.DespawnEntry(CREATURE_FEATHER_VORTEX); + me->GetMotionMaster()->MoveChase(me->GetVictim()); + } + break; + default: + break; } Phase = NextPhase; } @@ -384,91 +362,156 @@ class boss_zuljin : public CreatureScript DoCast(me, SPELL_BERSERK, true); Talk(YELL_BERSERK); Berserk_Timer = 60000; - } else Berserk_Timer -= diff; + } + else + Berserk_Timer -= diff; switch (Phase) { - case 0: - if (Intro_Timer) - { - if (Intro_Timer <= diff) + case 0: + if (Intro_Timer) { - Talk(YELL_AGGRO); - Intro_Timer = 0; - } else Intro_Timer -= diff; - } + if (Intro_Timer <= diff) + { + Talk(YELL_AGGRO); + Intro_Timer = 0; + } + else + Intro_Timer -= diff; + } - if (Whirlwind_Timer <= diff) - { - DoCast(me, SPELL_WHIRLWIND); - Whirlwind_Timer = urand(15000, 20000); - } else Whirlwind_Timer -= diff; + if (Whirlwind_Timer <= diff) + { + DoCast(me, SPELL_WHIRLWIND); + Whirlwind_Timer = urand(15000, 20000); + } + else + Whirlwind_Timer -= diff; - if (Grievous_Throw_Timer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - DoCast(target, SPELL_GRIEVOUS_THROW, false); - Grievous_Throw_Timer = 10000; - } else Grievous_Throw_Timer -= diff; - break; - - case 1: - if (Creeping_Paralysis_Timer <= diff) - { - DoCast(me, SPELL_CREEPING_PARALYSIS); - Creeping_Paralysis_Timer = 20000; - } else Creeping_Paralysis_Timer -= diff; + if (Grievous_Throw_Timer <= diff) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + DoCast(target, SPELL_GRIEVOUS_THROW, false); + Grievous_Throw_Timer = 10000; + } + else + Grievous_Throw_Timer -= diff; + break; - if (Overpower_Timer <= diff) - { - // implemented in DoMeleeAttackIfReady() - Overpower_Timer = 0; - } else Overpower_Timer -= diff; - break; + case 1: + if (Creeping_Paralysis_Timer <= diff) + { + DoCast(me, SPELL_CREEPING_PARALYSIS); + Creeping_Paralysis_Timer = 20000; + } + else + Creeping_Paralysis_Timer -= diff; - case 2: - return; + if (Overpower_Timer <= diff) + { + // implemented in DoMeleeAttackIfReady() + Overpower_Timer = 0; + } + else + Overpower_Timer -= diff; + break; - case 3: - if (Claw_Rage_Timer <= diff) - { - if (!TankGUID) + case 2: + return; + + case 3: + if (Claw_Rage_Timer <= diff) { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + if (!TankGUID) { - if (me->GetVictim()) - TankGUID = me->EnsureVictim()->GetGUID(); - me->SetSpeedRate(MOVE_RUN, 5.0f); - AttackStart(target); // change victim - Claw_Rage_Timer = 0; - Claw_Loop_Timer = 500; - Claw_Counter = 0; + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + { + if (me->GetVictim()) + TankGUID = me->EnsureVictim()->GetGUID(); + + me->SetSpeedRate(MOVE_RUN, 5.0f); + AttackStart(target); // change victim + Claw_Rage_Timer = 0; + Claw_Loop_Timer = 500; + Claw_Counter = 0; + } } + else if (!Claw_Rage_Timer) // do not do this when Lynx_Rush + { + if (Claw_Loop_Timer <= diff) + { + Unit* target = me->GetVictim(); + if (!target || !target->isTargetableForAttack()) + target = ObjectAccessor::GetUnit(*me, TankGUID); + if (!target || !target->isTargetableForAttack()) + target = SelectTarget(SELECT_TARGET_RANDOM, 0); + if (target) + { + AttackStart(target); + if (me->IsWithinMeleeRange(target)) + { + DoCast(target, SPELL_CLAW_RAGE_DAMAGE, true); + ++Claw_Counter; + if (Claw_Counter == 12) + { + Claw_Rage_Timer = urand(15000, 20000); + me->SetSpeedRate(MOVE_RUN, 1.2f); + AttackStart(ObjectAccessor::GetUnit(*me, TankGUID)); + TankGUID.Clear(); + return; + } + else + Claw_Loop_Timer = 500; + } + } + else + { + EnterEvadeMode(); // if (target) + return; + } + } + else Claw_Loop_Timer -= diff; + } //if (TankGUID) } - else if (!Claw_Rage_Timer) // do not do this when Lynx_Rush + else + Claw_Rage_Timer -= diff; + + if (Lynx_Rush_Timer <= diff) { - if (Claw_Loop_Timer <= diff) + if (!TankGUID) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + { + TankGUID = me->EnsureVictim()->GetGUID(); + me->SetSpeedRate(MOVE_RUN, 5.0f); + AttackStart(target); // change victim + Lynx_Rush_Timer = 0; + Claw_Counter = 0; + } + } + else if (!Lynx_Rush_Timer) { Unit* target = me->GetVictim(); - if (!target || !target->isTargetableForAttack()) target = ObjectAccessor::GetUnit(*me, TankGUID); - if (!target || !target->isTargetableForAttack()) target = SelectTarget(SELECT_TARGET_RANDOM, 0); - if (target) + if (!target || !target->isTargetableForAttack()) { + target = SelectTarget(SELECT_TARGET_RANDOM, 0); AttackStart(target); + } + if (target) + { if (me->IsWithinMeleeRange(target)) { - DoCast(target, SPELL_CLAW_RAGE_DAMAGE, true); + DoCast(target, SPELL_LYNX_RUSH_DAMAGE, true); ++Claw_Counter; - if (Claw_Counter == 12) + if (Claw_Counter == 9) { - Claw_Rage_Timer = urand(15000, 20000); + Lynx_Rush_Timer = urand(15000, 20000); me->SetSpeedRate(MOVE_RUN, 1.2f); AttackStart(ObjectAccessor::GetUnit(*me, TankGUID)); TankGUID.Clear(); - return; } else - Claw_Loop_Timer = 500; + AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0)); } } else @@ -476,82 +519,41 @@ class boss_zuljin : public CreatureScript EnterEvadeMode(); // if (target) return; } - } else Claw_Loop_Timer -= diff; - } //if (TankGUID) - } else Claw_Rage_Timer -= diff; + } //if (TankGUID) + } + else + Lynx_Rush_Timer -= diff; + break; + case 4: + if (Flame_Whirl_Timer <= diff) + { + DoCast(me, SPELL_FLAME_WHIRL); + Flame_Whirl_Timer = 12000; + } + else + Flame_Whirl_Timer -= diff; - if (Lynx_Rush_Timer <= diff) - { - if (!TankGUID) + if (Pillar_Of_Fire_Timer <= diff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - TankGUID = me->EnsureVictim()->GetGUID(); - me->SetSpeedRate(MOVE_RUN, 5.0f); - AttackStart(target); // change victim - Lynx_Rush_Timer = 0; - Claw_Counter = 0; - } + DoCast(target, SPELL_SUMMON_PILLAR); + Pillar_Of_Fire_Timer = 10000; } - else if (!Lynx_Rush_Timer) - { - Unit* target = me->GetVictim(); - if (!target || !target->isTargetableForAttack()) - { - target = SelectTarget(SELECT_TARGET_RANDOM, 0); - AttackStart(target); - } - if (target) - { - if (me->IsWithinMeleeRange(target)) - { - DoCast(target, SPELL_LYNX_RUSH_DAMAGE, true); - ++Claw_Counter; - if (Claw_Counter == 9) - { - Lynx_Rush_Timer = urand(15000, 20000); - me->SetSpeedRate(MOVE_RUN, 1.2f); - AttackStart(ObjectAccessor::GetUnit(*me, TankGUID)); - TankGUID.Clear(); - } - else - AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0)); - } - } - else - { - EnterEvadeMode(); // if (target) - return; - } - } //if (TankGUID) - } else Lynx_Rush_Timer -= diff; - - break; - case 4: - if (Flame_Whirl_Timer <= diff) - { - DoCast(me, SPELL_FLAME_WHIRL); - Flame_Whirl_Timer = 12000; - }Flame_Whirl_Timer -= diff; + else + Pillar_Of_Fire_Timer -= diff; - if (Pillar_Of_Fire_Timer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(target, SPELL_SUMMON_PILLAR); - Pillar_Of_Fire_Timer = 10000; - } else Pillar_Of_Fire_Timer -= diff; - - if (Flame_Breath_Timer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - me->SetInFront(target); - DoCast(me, SPELL_FLAME_BREATH); - Flame_Breath_Timer = 10000; - } else Flame_Breath_Timer -= diff; - break; - - default: - break; + if (Flame_Breath_Timer <= diff) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + me->SetInFront(target); + DoCast(me, SPELL_FLAME_BREATH); + Flame_Breath_Timer = 10000; + } + else + Flame_Breath_Timer -= diff; + break; + default: + break; } if (!TankGUID) @@ -561,18 +563,14 @@ class boss_zuljin : public CreatureScript CreatureAI* GetAI(Creature* creature) const override { - return GetInstanceAI<boss_zuljinAI>(creature); + return GetZulAmanAI<boss_zuljinAI>(creature); } }; class npc_zuljin_vortex : public CreatureScript { public: - - npc_zuljin_vortex() - : CreatureScript("npc_zuljin_vortex") - { - } + npc_zuljin_vortex() : CreatureScript("npc_zuljin_vortex") { } struct npc_zuljin_vortexAI : public ScriptedAI { @@ -598,7 +596,7 @@ class npc_zuljin_vortex : public CreatureScript CreatureAI* GetAI(Creature* creature) const override { - return new npc_zuljin_vortexAI(creature); + return GetZulAmanAI<npc_zuljin_vortexAI>(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp index 836db4f6ce6..f0eb8ef7911 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp @@ -31,7 +31,6 @@ EndScriptData */ enum Misc { - MAX_ENCOUNTER = 7, RAND_VENDOR = 2, WORLDSTATE_SHOW_TIMER = 3104, WORLDSTATE_TIME_TO_SACRIFICE = 3106 @@ -43,277 +42,246 @@ enum Misc struct SHostageInfo { uint32 npc, go; // FIXME go Not used - float x, y, z, o; + Position pos; }; -static SHostageInfo HostageInfo[] = +static SHostageInfo const HostageInfo[] = { - {23790, 186648, -57, 1343, 40.77f, 3.2f}, // bear - {23999, 187021, 400, 1414, 74.36f, 3.3f}, // eagle - {24001, 186672, -35, 1134, 18.71f, 1.9f}, // dragonhawk - {24024, 186667, 413, 1117, 6.32f, 3.1f} // lynx + { 23790, 186648, { -57.f, 1343.f, 40.77f, 3.2f } }, // bear + { 23999, 187021, { 400.f, 1414.f, 74.36f, 3.3f } }, // eagle + { 24001, 186672, { -35.f, 1134.f, 18.71f, 1.9f } }, // dragonhawk + { 24024, 186667, { 413.f, 1117.f, 6.32f, 3.1f } } // lynx }; -Position const HarrisonJonesLoc = {120.687f, 1674.0f, 42.0217f, 1.59044f}; +Position const HarrisonJonesLoc = { 120.687f, 1674.0f, 42.0217f, 1.59044f }; + +static DoorData const doorData[] = +{ + { GO_HEXLORD_ENTRANCE, BOSS_NALORAKK, DOOR_TYPE_PASSAGE }, + { GO_HEXLORD_ENTRANCE, BOSS_AKILZON, DOOR_TYPE_PASSAGE }, + { GO_HEXLORD_ENTRANCE, BOSS_JANALAI, DOOR_TYPE_PASSAGE }, + { GO_HEXLORD_ENTRANCE, BOSS_HALAZZI, DOOR_TYPE_PASSAGE }, + { GO_DOOR_AKILZON, BOSS_AKILZON, DOOR_TYPE_ROOM }, + { GO_LYNX_TEMPLE_ENTRANCE, BOSS_HALAZZI, DOOR_TYPE_ROOM }, + { GO_LYNX_TEMPLE_EXIT, BOSS_HALAZZI, DOOR_TYPE_ROOM }, + { GO_HEXLORD_ENTRANCE, BOSS_HEXLORD, DOOR_TYPE_ROOM }, + { GO_WOODEN_DOOR, BOSS_HEXLORD, DOOR_TYPE_PASSAGE }, + { GO_DOOR_ZULJIN, BOSS_ZULJIN, DOOR_TYPE_ROOM }, + { 0, 0, DOOR_TYPE_ROOM } // END +}; + +static ObjectData const creatureData[] = +{ + { NPC_HARRISON_JONES, NPC_HARRISON_JONES }, + { NPC_NALORAKK, BOSS_NALORAKK }, + { NPC_AKILZON, BOSS_AKILZON }, + { NPC_JANALAI, BOSS_JANALAI }, + { NPC_HALAZZI, BOSS_HALAZZI }, + { NPC_HEXLORD, BOSS_HEXLORD }, + { NPC_ZULJIN, BOSS_ZULJIN }, + { 0, 0 } // END + +}; + +static ObjectData const gameObjectData[] = +{ + { GO_MASSIVE_GATE, GO_MASSIVE_GATE }, + { GO_HARKORS_SATCHEL, GO_HARKORS_SATCHEL }, + { GO_TANZARS_TRUNK, GO_TANZARS_TRUNK }, + { GO_ASHLIS_BAG, GO_ASHLIS_BAG }, + { GO_KRAZS_PACKAGE, GO_KRAZS_PACKAGE }, + { GO_STRANGE_GONG, GO_STRANGE_GONG }, + { 0, 0 } // END +}; class instance_zulaman : public InstanceMapScript { public: - instance_zulaman() - : InstanceMapScript("instance_zulaman", 568) - { - } + instance_zulaman() : InstanceMapScript(ZulamanScriptName, 568) { } struct instance_zulaman_InstanceMapScript : public InstanceScript { instance_zulaman_InstanceMapScript(Map* map) : InstanceScript(map) { SetHeaders(DataHeader); - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); + SetBossNumber(MAX_ENCOUNTER); + LoadDoorData(doorData); + LoadObjectData(creatureData, gameObjectData); QuestTimer = 0; QuestMinute = 0; - BossKilled = 0; ChestLooted = 0; for (uint8 i = 0; i < RAND_VENDOR; ++i) RandVendor[i] = NOT_STARTED; - m_auiEncounter[DATA_GONGEVENT] = NOT_STARTED; + GongEvent = NOT_STARTED; } - ObjectGuid HarkorsSatchelGUID; - ObjectGuid TanzarsTrunkGUID; - ObjectGuid AshlisBagGUID; - ObjectGuid KrazsPackageGUID; - ObjectGuid StrangeGongGUID; - ObjectGuid HarrisonJonesGUID; - - ObjectGuid HexLordGateGUID; - ObjectGuid ZulJinGateGUID; - ObjectGuid MassiveGateGUID; - ObjectGuid AkilzonDoorGUID; - ObjectGuid ZulJinDoorGUID; - ObjectGuid HalazziDoorGUID; - uint32 QuestTimer; - uint16 BossKilled; - uint16 QuestMinute; - uint16 ChestLooted; - - uint32 m_auiEncounter[MAX_ENCOUNTER]; - uint32 RandVendor[RAND_VENDOR]; + uint32 QuestMinute; + uint32 ChestLooted; - bool IsEncounterInProgress() const override - { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) - return true; - - return false; - } + EncounterState RandVendor[RAND_VENDOR]; + EncounterState GongEvent; void OnPlayerEnter(Player* /*player*/) override { - if (!HarrisonJonesGUID) + if (!GetGuidData(NPC_HARRISON_JONES)) instance->SummonCreature(NPC_HARRISON_JONES, HarrisonJonesLoc); } - void OnCreatureCreate(Creature* creature) override + void OnGameObjectCreate(GameObject* go) override { - switch (creature->GetEntry()) + InstanceScript::OnGameObjectCreate(go); + + switch (go->GetEntry()) { - case NPC_HARRISON_JONES: - HarrisonJonesGUID = creature->GetGUID(); + case GO_MASSIVE_GATE: + if (GongEvent == DONE) + go->SetGoState(GO_STATE_ACTIVE); break; - case NPC_JANALAI: - case NPC_ZULJIN: - case NPC_HEXLORD: - case NPC_HALAZZI: - case NPC_NALORAKK: default: break; } } - void OnGameObjectCreate(GameObject* go) override - { - switch (go->GetEntry()) - { - case GO_DOOR_HALAZZI: HalazziDoorGUID = go->GetGUID(); break; - case GO_GATE_ZULJIN: ZulJinGateGUID = go->GetGUID(); break; - case GO_GATE_HEXLORD: HexLordGateGUID = go->GetGUID(); break; - case GO_MASSIVE_GATE: MassiveGateGUID = go->GetGUID(); break; - case GO_DOOR_AKILZON: AkilzonDoorGUID = go->GetGUID(); break; - case GO_DOOR_ZULJIN: ZulJinDoorGUID = go->GetGUID(); break; - - case GO_HARKORS_SATCHEL: HarkorsSatchelGUID = go->GetGUID(); break; - case GO_TANZARS_TRUNK: TanzarsTrunkGUID = go->GetGUID(); break; - case GO_ASHLIS_BAG: AshlisBagGUID = go->GetGUID(); break; - case GO_KRAZS_PACKAGE: KrazsPackageGUID = go->GetGUID(); break; - case GO_STRANGE_GONG: StrangeGongGUID = go->GetGUID(); break; - default: break; - } - CheckInstanceStatus(); - } - void SummonHostage(uint8 num) { if (!QuestMinute) return; - Map::PlayerList const &PlayerList = instance->GetPlayers(); - if (PlayerList.isEmpty()) + Map::PlayerList const& playerList = instance->GetPlayers(); + if (playerList.isEmpty()) return; - Map::PlayerList::const_iterator i = PlayerList.begin(); - if (Player* i_pl = i->GetSource()) + if (Player* player = playerList.getFirst()->GetSource()) { - if (Unit* Hostage = i_pl->SummonCreature(HostageInfo[num].npc, HostageInfo[num].x, HostageInfo[num].y, HostageInfo[num].z, HostageInfo[num].o, TEMPSUMMON_DEAD_DESPAWN, 0)) + if (Unit* hostage = player->SummonCreature(HostageInfo[num].npc, HostageInfo[num].pos, TEMPSUMMON_DEAD_DESPAWN, 0)) { - Hostage->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - Hostage->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + hostage->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + hostage->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); } } } - void CheckInstanceStatus() + void WriteSaveDataMore(std::ostringstream& oss) override { - if (BossKilled >= DATA_HALAZZIEVENT) - HandleGameObject(HexLordGateGUID, true); - - if (BossKilled >= DATA_HEXLORDEVENT) - HandleGameObject(ZulJinGateGUID, true); + oss << "S " << uint32(GongEvent) << ' ' + << uint32(ChestLooted) << ' ' + << uint32(QuestMinute) << ' '; } - std::string GetSaveData() override + void ReadSaveDataMore(std::istringstream& iss) override { - OUT_SAVE_INST_DATA; - - std::ostringstream ss; - ss << "S " << BossKilled << ' ' << ChestLooted << ' ' << QuestMinute; - - OUT_SAVE_INST_DATA_COMPLETE; - return ss.str(); - } - - void Load(const char* load) override - { - if (!load) - return; - - std::istringstream ss(load); - //TC_LOG_ERROR("scripts", "Zul'aman loaded, %s.", ss.str().c_str()); char dataHead; // S - uint16 data1, data2, data3; - ss >> dataHead >> data1 >> data2 >> data3; - //TC_LOG_ERROR("scripts", "Zul'aman loaded, %d %d %d.", data1, data2, data3); + uint32 data1, data2, data3; + iss >> dataHead >> data1 >> data2 >> data3; + if (dataHead == 'S') { - BossKilled = data1; + GongEvent = EncounterState(data1); ChestLooted = data2; QuestMinute = data3; - } else TC_LOG_ERROR("scripts", "Zul'aman: corrupted save data."); + } + else + { + TC_LOG_ERROR("scripts", "Zul'aman: corrupted save data."); + return; + } + + if (GongEvent == IN_PROGRESS) + GongEvent = NOT_STARTED; } void SetData(uint32 type, uint32 data) override { switch (type) { - case DATA_GONGEVENT: - m_auiEncounter[DATA_GONGEVENT] = data; - if (data == IN_PROGRESS) + case DATA_GONGEVENT: + GongEvent = EncounterState(data); + if (GongEvent == IN_PROGRESS) + SaveToDB(); + else if (GongEvent == DONE) + QuestMinute = 21; + break; + case DATA_CHESTLOOTED: + ++ChestLooted; SaveToDB(); - else if (data == DONE) - QuestMinute = 21; - break; - case DATA_NALORAKKEVENT: - m_auiEncounter[DATA_NALORAKKEVENT] = data; - if (data == DONE) - { - if (QuestMinute) + break; + case TYPE_RAND_VENDOR_1: + case TYPE_RAND_VENDOR_2: + RandVendor[type - TYPE_RAND_VENDOR_1] = EncounterState(data); + break; + } + } + + bool SetBossState(uint32 id, EncounterState state) override + { + if (!InstanceScript::SetBossState(id, state)) + return false; + + switch (id) + { + case BOSS_NALORAKK: + if (state == DONE) { - QuestMinute += 15; - DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute); + if (QuestMinute) + { + QuestMinute += 15; + DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute); + } + SummonHostage(0); } - SummonHostage(0); - } - break; - case DATA_AKILZONEVENT: - m_auiEncounter[DATA_AKILZONEVENT] = data; - HandleGameObject(AkilzonDoorGUID, data != IN_PROGRESS); - if (data == DONE) - { - if (QuestMinute) + break; + case BOSS_AKILZON: + if (state == DONE) { - QuestMinute += 10; - DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute); + if (QuestMinute) + { + QuestMinute += 10; + DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute); + } + SummonHostage(1); } - SummonHostage(1); - } - break; - case DATA_JANALAIEVENT: - m_auiEncounter[DATA_JANALAIEVENT] = data; - if (data == DONE) - SummonHostage(2); - break; - case DATA_HALAZZIEVENT: - m_auiEncounter[DATA_HALAZZIEVENT] = data; - HandleGameObject(HalazziDoorGUID, data != IN_PROGRESS); - if (data == DONE) SummonHostage(3); - break; - case DATA_HEXLORDEVENT: - m_auiEncounter[DATA_HEXLORDEVENT] = data; - if (data == IN_PROGRESS) - HandleGameObject(HexLordGateGUID, false); - else if (data == NOT_STARTED) - CheckInstanceStatus(); - break; - case DATA_ZULJINEVENT: - m_auiEncounter[DATA_ZULJINEVENT] = data; - HandleGameObject(ZulJinDoorGUID, data != IN_PROGRESS); - break; - case DATA_CHESTLOOTED: - ++ChestLooted; - SaveToDB(); - break; - case TYPE_RAND_VENDOR_1: - RandVendor[0] = data; - break; - case TYPE_RAND_VENDOR_2: - RandVendor[1] = data; - break; + break; + case BOSS_JANALAI: + if (state == DONE) + SummonHostage(2); + break; + case BOSS_HALAZZI: + if (state == DONE) + SummonHostage(3); + break; } - if (data == DONE) + if (state == DONE) { - ++BossKilled; - if (QuestMinute && BossKilled >= DATA_HALAZZIEVENT) + if (QuestMinute && id == BOSS_HALAZZI) { QuestMinute = 0; DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0); } - CheckInstanceStatus(); SaveToDB(); } + + return true; } uint32 GetData(uint32 type) const override { switch (type) { - case DATA_GONGEVENT: return m_auiEncounter[DATA_GONGEVENT]; - case DATA_NALORAKKEVENT: return m_auiEncounter[DATA_NALORAKKEVENT]; - case DATA_AKILZONEVENT: return m_auiEncounter[DATA_AKILZONEVENT]; - case DATA_JANALAIEVENT: return m_auiEncounter[DATA_JANALAIEVENT]; - case DATA_HALAZZIEVENT: return m_auiEncounter[DATA_HALAZZIEVENT]; - case DATA_HEXLORDEVENT: return m_auiEncounter[DATA_HEXLORDEVENT]; - case DATA_ZULJINEVENT: return m_auiEncounter[DATA_ZULJINEVENT]; - case DATA_CHESTLOOTED: return ChestLooted; - case TYPE_RAND_VENDOR_1: return RandVendor[0]; - case TYPE_RAND_VENDOR_2: return RandVendor[1]; - default: return 0; + case DATA_GONGEVENT: + return uint32(GongEvent); + case DATA_CHESTLOOTED: + return ChestLooted; + case TYPE_RAND_VENDOR_1: + case TYPE_RAND_VENDOR_2: + return RandVendor[type - TYPE_RAND_VENDOR_1]; } + + return 0; } void Update(uint32 diff) override @@ -324,30 +292,18 @@ class instance_zulaman : public InstanceMapScript { QuestMinute--; SaveToDB(); - QuestTimer += 60000; + QuestTimer += 1 * MINUTE * IN_MILLISECONDS; if (QuestMinute) { DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 1); DoUpdateWorldState(WORLDSTATE_TIME_TO_SACRIFICE, QuestMinute); - } else DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0); + } + else + DoUpdateWorldState(WORLDSTATE_SHOW_TIMER, 0); } QuestTimer -= diff; } } - - ObjectGuid GetGuidData(uint32 type) const override - { - switch (type) - { - case GO_STRANGE_GONG: - return StrangeGongGUID; - case GO_MASSIVE_GATE: - return MassiveGateGUID; - } - - return ObjectGuid::Empty; - } - }; InstanceScript* GetInstanceScript(InstanceMap* map) const override @@ -360,4 +316,3 @@ void AddSC_instance_zulaman() { new instance_zulaman(); } - diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp index b0f51537c58..f23a9fab812 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp @@ -54,10 +54,7 @@ class npc_forest_frog : public CreatureScript { public: - npc_forest_frog() - : CreatureScript("npc_forest_frog") - { - } + npc_forest_frog() : CreatureScript("npc_forest_frog") { } struct npc_forest_frogAI : public ScriptedAI { @@ -72,32 +69,38 @@ class npc_forest_frog : public CreatureScript void EnterCombat(Unit* /*who*/) override { } - void DoSpawnRandom() + void DoSpawnRandom() const { - uint32 cEntry = 0; - switch (rand32() % 10) - { - case 0: cEntry = 24397; break; //Mannuth - case 1: cEntry = 24403; break; //Deez - case 2: cEntry = 24404; break; //Galathryn - case 3: cEntry = 24405; break; //Adarrah - case 4: cEntry = 24406; break; //Fudgerick - case 5: cEntry = 24407; break; //Darwen - case 6: cEntry = 24445; break; //Mitzi - case 7: cEntry = 24448; break; //Christian - case 8: cEntry = 24453; break; //Brennan - case 9: cEntry = 24455; break; //Hollee - } + uint32 cEntry = RAND( + 24397, //Mannuth + 24403, //Deez + 24404, //Galathryn + 24405, //Adarrah + 24406, //Fudgerick + 24407, //Darwen + 24445, //Mitzi + 24448, //Christian + 24453, //Brennan + 24455); //Hollee if (!instance->GetData(TYPE_RAND_VENDOR_1)) - if (rand32() % 10 == 1) cEntry = 24408; //Gunter - if (!instance->GetData(TYPE_RAND_VENDOR_2)) - if (rand32() % 10 == 1) cEntry = 24409; //Kyren - - if (cEntry) me->UpdateEntry(cEntry); + { + if (roll_chance_i(10)) + { + cEntry = 24408; //Gunter + instance->SetData(TYPE_RAND_VENDOR_1, DONE); + } + } + else if (!instance->GetData(TYPE_RAND_VENDOR_2)) + { + if (roll_chance_i(10)) + { + cEntry = 24409; //Kyren + instance->SetData(TYPE_RAND_VENDOR_2, DONE); + } + } - if (cEntry == 24408) instance->SetData(TYPE_RAND_VENDOR_1, DONE); - if (cEntry == 24409) instance->SetData(TYPE_RAND_VENDOR_2, DONE); + me->UpdateEntry(cEntry); } void SpellHit(Unit* caster, const SpellInfo* spell) override @@ -105,15 +108,17 @@ class npc_forest_frog : public CreatureScript if (spell->Id == SPELL_REMOVE_AMANI_CURSE && caster->GetTypeId() == TYPEID_PLAYER && me->GetEntry() == NPC_FOREST_FROG) { //increase or decrease chance of mojo? - if (rand32() % 99 == 50) DoCast(caster, SPELL_PUSH_MOJO, true); - else DoSpawnRandom(); + if (roll_chance_i(1)) + DoCast(caster, SPELL_PUSH_MOJO, true); + else + DoSpawnRandom(); } } }; CreatureAI* GetAI(Creature* creature) const override { - return GetInstanceAI<npc_forest_frogAI>(creature); + return GetZulAmanAI<npc_forest_frogAI>(creature); } }; @@ -123,8 +128,8 @@ class npc_forest_frog : public CreatureScript #define GOSSIP_HOSTAGE1 "I am glad to help you." -static uint32 HostageEntry[] = {23790, 23999, 24024, 24001}; -static uint32 ChestEntry[] = {186648, 187021, 186672, 186667}; +static uint32 const HostageEntry[] = {23790, 23999, 24024, 24001}; +static uint32 const ChestEntry[] = {186648, 187021, 186672, 186667}; class npc_zulaman_hostage : public CreatureScript { @@ -150,8 +155,7 @@ class npc_zulaman_hostage : public CreatureScript creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - InstanceScript* instance = creature->GetInstanceScript(); - if (instance) + if (InstanceScript* instance = creature->GetInstanceScript()) { //uint8 progress = instance->GetData(DATA_CHESTLOOTED); instance->SetData(DATA_CHESTLOOTED, 0); @@ -236,9 +240,7 @@ class npc_harrison_jones : public CreatureScript { public: - npc_harrison_jones() : CreatureScript("npc_harrison_jones") - { - } + npc_harrison_jones() : CreatureScript("npc_harrison_jones") { } struct npc_harrison_jonesAI : public ScriptedAI { @@ -252,14 +254,12 @@ class npc_harrison_jones : public CreatureScript { _gongEvent = 0; _gongTimer = 0; - uiTargetGUID = 0; } InstanceScript* instance; uint8 _gongEvent; uint32 _gongTimer; - uint64 uiTargetGUID; void Reset() override { @@ -318,14 +318,14 @@ class npc_harrison_jones : public CreatureScript _gongTimer = 4000; break; case GONG_EVENT_3: - if (GameObject* gong = me->GetMap()->GetGameObject(instance->GetGuidData(GO_STRANGE_GONG))) + if (GameObject* gong = instance->GetGameObject(GO_STRANGE_GONG)) gong->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); _gongEvent = GONG_EVENT_4; _gongTimer = 105000; break; case GONG_EVENT_4: me->RemoveAura(SPELL_BANGING_THE_GONG); - if (GameObject* gong = me->GetMap()->GetGameObject(instance->GetGuidData(GO_STRANGE_GONG))) + if (GameObject* gong = instance->GetGameObject(GO_STRANGE_GONG)) gong->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); // trigger or gong will need to be scripted to set IN_PROGRESS after enough hits. @@ -359,39 +359,32 @@ class npc_harrison_jones : public CreatureScript _gongEvent = GONG_EVENT_7; break; case GONG_EVENT_7: - if (!uiTargetGUID) + { + std::vector<Creature*> targetList; + GetCreatureListWithEntryInGrid(targetList, me, NPC_AMANISHI_GUARDIAN, 26.0f); + for (Creature* target : targetList) { - std::list<Creature*> targetList; - GetCreatureListWithEntryInGrid(targetList, me, NPC_AMANISHI_GUARDIAN, 26.0f); - if (!targetList.empty()) + if (target->GetPositionX() > 120) + { + target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_SPEAR)); + target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + target->SetReactState(REACT_PASSIVE); + target->AI()->SetData(0, 1); + } + else { - for (std::list<Creature*>::const_iterator itr = targetList.begin(); itr != targetList.end(); ++itr) - { - if (Creature* ptarget = *itr) - { - if (ptarget->GetPositionX() > 120) - { - ptarget->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_SPEAR)); - ptarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - ptarget->SetReactState(REACT_PASSIVE); - ptarget->AI()->SetData(0, 1); - } - else - { - ptarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - ptarget->SetReactState(REACT_PASSIVE); - ptarget->AI()->SetData(0, 2); - } - } - } + target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + target->SetReactState(REACT_PASSIVE); + target->AI()->SetData(0, 2); } } - if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetGuidData(GO_MASSIVE_GATE))) + if (GameObject* gate = instance->GetGameObject(GO_MASSIVE_GATE)) gate->SetGoState(GO_STATE_ACTIVE); _gongTimer = 2000; _gongEvent = GONG_EVENT_8; break; + } case GONG_EVENT_8: DoCast(me, SPELL_STEALTH); me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(0)); @@ -420,14 +413,14 @@ class npc_harrison_jones : public CreatureScript } } else - _gongTimer -= diff; + _gongTimer -= diff; } } }; CreatureAI* GetAI(Creature* creature) const override { - return GetInstanceAI<npc_harrison_jonesAI>(creature); + return GetZulAmanAI<npc_harrison_jonesAI>(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h index 37f8370d49c..919c5653279 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h +++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.h @@ -19,37 +19,42 @@ #ifndef DEF_ZULAMAN_H #define DEF_ZULAMAN_H +#define ZulamanScriptName "instance_zulaman" #define DataHeader "ZA" enum DataTypes { - DATA_GONGEVENT = 0, - DATA_NALORAKKEVENT = 1, - DATA_AKILZONEVENT = 2, - DATA_JANALAIEVENT = 3, - DATA_HALAZZIEVENT = 4, - DATA_HEXLORDEVENT = 5, - DATA_ZULJINEVENT = 6, - DATA_CHESTLOOTED = 7, - TYPE_RAND_VENDOR_1 = 8, - TYPE_RAND_VENDOR_2 = 9 + BOSS_NALORAKK = 0, + BOSS_AKILZON = 1, + BOSS_JANALAI = 2, + BOSS_HALAZZI = 3, + BOSS_HEXLORD = 4, + BOSS_ZULJIN = 5, + MAX_ENCOUNTER, + + DATA_GONGEVENT, + DATA_CHESTLOOTED, + TYPE_RAND_VENDOR_1, + TYPE_RAND_VENDOR_2 }; enum CreatureIds { NPC_HARRISON_JONES = 24358, + NPC_NALORAKK = 23576, + NPC_AKILZON = 23574, NPC_JANALAI = 23578, - NPC_ZULJIN = 23863, - NPC_HEXLORD = 24239, NPC_HALAZZI = 23577, - NPC_NALORAKK = 23576 + NPC_HEXLORD = 24239, + NPC_ZULJIN = 23863 }; enum GameobjectIds { - GO_DOOR_HALAZZI = 186303, - GO_GATE_ZULJIN = 186304, - GO_GATE_HEXLORD = 186305, + GO_LYNX_TEMPLE_EXIT = 186303, + GO_LYNX_TEMPLE_ENTRANCE = 186304, + GO_HEXLORD_ENTRANCE = 186305, + GO_WOODEN_DOOR = 186306, GO_MASSIVE_GATE = 186728, GO_DOOR_AKILZON = 186858, GO_DOOR_ZULJIN = 186859, @@ -60,4 +65,10 @@ enum GameobjectIds GO_STRANGE_GONG = 187359 }; +template <class AI> +inline AI* GetZulAmanAI(Creature* creature) +{ + return GetInstanceAI<AI>(creature, ZulamanScriptName); +} + #endif |