diff options
author | Malcrom <malcromdev@gmail.com> | 2023-12-31 22:38:43 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-01 03:38:43 +0100 |
commit | 42c5338a6339ebdd593959fe64a938351d832c31 (patch) | |
tree | 813ab892e52d52ac3c6e5f320693a303d28da0b8 /src | |
parent | e2e2357b0088a3955e941e8807fab002f51eca61 (diff) |
Scripts/DunMorogh: Implemented Rockjaw Invader spawning for Joren Ironstock (#29519)
Co-authored-by: ModoX <moardox@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/EasternKingdoms/zone_dun_morogh_area_coldridge_valley.cpp | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/src/server/scripts/EasternKingdoms/zone_dun_morogh_area_coldridge_valley.cpp b/src/server/scripts/EasternKingdoms/zone_dun_morogh_area_coldridge_valley.cpp index 0020eb30559..25d347119b2 100644 --- a/src/server/scripts/EasternKingdoms/zone_dun_morogh_area_coldridge_valley.cpp +++ b/src/server/scripts/EasternKingdoms/zone_dun_morogh_area_coldridge_valley.cpp @@ -15,6 +15,7 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include "Containers.h" #include "ScriptMgr.h" #include "CombatAI.h" #include "MotionMaster.h" @@ -456,6 +457,97 @@ public: } }; +Position const RockjawInvaderSpawnPoints[7] = +{ + { -6237.6807f, 375.5191f, 385.44696f, 5.168368339538574218f }, + { -6299.6113f, 347.11978f, 377.25546f, 6.068230628967285156f }, + { -6208.724f, 354.3229f, 387.3534f, 4.338659286499023437f }, + { -6261.8228f, 371.06598f, 383.35944f, 5.383506298065185546f }, + { -6253.722f, 340.1389f, 382.50888f, 5.957066535949707031f }, + { -6286.6113f, 316.9566f, 376.9441f, 6.195390701293945312f }, + { -6204.599f, 304.64932f, 388.9596f, 2.362043619155883789f } +}; + +enum JorenIronstockData +{ + NPC_ROCKJAW_INVADER = 37070, + + SAY_SHOOT_ROCKJAW = 0, + + SPELL_SHOOT = 70014 +}; + +// 37081 - Joren Ironstock +struct npc_joren_ironstock : public ScriptedAI +{ + npc_joren_ironstock(Creature* creature) : ScriptedAI(creature) { } + + void EnqueueInvader(Unit* invader, Seconds minTime = 1s, Seconds maxTime = 9s) + { + _scheduler.Schedule(minTime, maxTime, [this, guid = invader->GetGUID()](TaskContext /*task*/) + { + _invadersToShoot.push_back(guid); + }); + } + + void JustAppeared() override + { + me->SetTemplateRooted(true); + + _scheduler.Schedule(1s, [this](TaskContext task) + { + if (Creature* invader = me->SummonCreature(NPC_ROCKJAW_INVADER, Trinity::Containers::SelectRandomContainerElement(RockjawInvaderSpawnPoints), TEMPSUMMON_CORPSE_TIMED_DESPAWN, 18s)) + { + invader->SetScriptStringId("joren_invader"); + invader->AI()->SetGUID(me->GetGUID()); + if (me->HasInArc(float(M_PI), invader) && !me->IsInCombat()) + EnqueueInvader(invader, 1s, 3s); + else + EnqueueInvader(invader, 5s, 8s); + invader->AI()->AttackStart(me); + } + task.Repeat(3s, 20s); + }); + + _scheduler.Schedule(1s, [this](TaskContext task) + { + if (!_invadersToShoot.empty()) + { + ObjectGuid guid = _invadersToShoot.front(); + _invadersToShoot.pop_front(); + + Creature* invader = ObjectAccessor::GetCreature(*me, guid); + if (invader && invader->IsAlive()) + { + SpellCastResult result = DoCast(invader, SPELL_SHOOT); + if (result == SpellCastResult::SPELL_CAST_OK) + { + if (roll_chance_i(50)) + Talk(SAY_SHOOT_ROCKJAW, invader); + } + else + _invadersToShoot.push_back(guid); + } + } + task.Repeat(1s); + }); + } + + void UpdateAI(uint32 diff) override + { + _scheduler.Update(diff); + + if (!UpdateVictim()) + return; + + DoMeleeAttackIfReady(); + } + +private: + TaskScheduler _scheduler; + std::deque<ObjectGuid> _invadersToShoot; +}; + void AddSC_dun_morogh_area_coldridge_valley() { new npc_wounded_coldridge_mountaineer(); @@ -464,4 +556,5 @@ void AddSC_dun_morogh_area_coldridge_valley() new spell_a_trip_to_ironforge_quest_complete(); new spell_follow_that_gyrocopter_quest_start(); new spell_low_health(); + RegisterCreatureAI(npc_joren_ironstock); } |