diff --git a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp index 20450a647a447a..8314d75861237d 100644 --- a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp +++ b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp @@ -439,9 +439,6 @@ enum EnshlavedNetherwingDrake NPC_DRAGONMAW_WRANGLER = 21717, NPC_ESCAPE_DUMMY = 22317, - EVENT_TAKE_OFF = 1, - EVENT_CREDIT_PLAYER = 2, - // Point POINT_DESPAWN = 1 }; @@ -451,18 +448,14 @@ struct npc_enslaved_netherwing_drake : public ScriptedAI public: npc_enslaved_netherwing_drake(Creature* creature) : ScriptedAI(creature) { - Tapped = false; + _tapped = false; Reset(); } - ObjectGuid PlayerGUID; - bool Tapped; - - Player* GetPlayer() { return ObjectAccessor::GetPlayer(*me, PlayerGUID); } - void Reset() override { - if (!Tapped) + scheduler.CancelAll(); + if (!_tapped) { me->RestoreFaction(); me->SetReactState(REACT_AGGRESSIVE); @@ -474,9 +467,8 @@ struct npc_enslaved_netherwing_drake : public ScriptedAI void JustDied(Unit* /*killer*/) override { - Tapped = false; + _tapped = false; me->RestoreFaction(); - events.CancelEvent(EVENT_TAKE_OFF); } void SpellHit(Unit* caster, SpellInfo const* spell) override @@ -485,20 +477,45 @@ struct npc_enslaved_netherwing_drake : public ScriptedAI if (!playerCaster) return; - if (spell->Id == SPELL_HIT_FORCE_OF_NELTHARAKU && !Tapped && + if (spell->Id == SPELL_HIT_FORCE_OF_NELTHARAKU && !_tapped && playerCaster->GetQuestStatus(QUEST_THE_FORCE_OF_NELTHARAKU) == QUEST_STATUS_INCOMPLETE) { - Tapped = true; - PlayerGUID = caster->GetGUID(); + _tapped = true; + _playerGUID = caster->GetGUID(); - me->SetFaction(FACTION_FLAYER_HUNTER); // Not sure if this is correct, it was taken off of Mordenai. + scheduler.Schedule(2s, [this](TaskContext) + { + me->SetFaction(FACTION_FLAYER_HUNTER); // Not sure if this is correct, it was taken off of Mordenai. - if (Unit* Dragonmaw = me->FindNearestCreature(NPC_DRAGONMAW_SUBJUGATOR, 25.0f)) - AttackStart(Dragonmaw); - else if (Unit* Dragonmaw = me->FindNearestCreature(NPC_DRAGONMAW_WRANGLER, 25.0f)) - AttackStart(Dragonmaw); + if (Unit* dragonmaw = me->FindNearestCreature(NPC_DRAGONMAW_SUBJUGATOR, 25.0f)) + AttackStart(dragonmaw); + else if (Unit* dragonmaw = me->FindNearestCreature(NPC_DRAGONMAW_WRANGLER, 25.0f)) + AttackStart(dragonmaw); + scheduler.Schedule(2s, [this](TaskContext) + { + _tapped = false; + Position pos; + if (Unit* escapeDummy = me->FindNearestCreature(NPC_ESCAPE_DUMMY, 30.0f)) + pos = escapeDummy->GetPosition(); + else + { + pos = me->GetRandomNearPosition(20.0f); + pos.m_positionZ += 25.0f; + } - events.ScheduleEvent(EVENT_TAKE_OFF, 2s); + me->SetDisableGravity(true); + me->GetMotionMaster()->MovePoint(POINT_DESPAWN, pos); + me->SetReactState(REACT_PASSIVE); + scheduler.Schedule(100ms, [this](TaskContext) + { + if (Player* player = _GetPlayer()) + { + DoCast(player, SPELL_FORCE_OF_NELTHARAKU, true); + } + me->DespawnOrUnsummon(3s, 0s); + }); + }); + }); } } @@ -514,40 +531,21 @@ struct npc_enslaved_netherwing_drake : public ScriptedAI void UpdateAI(uint32 diff) override { - events.Update(diff); + scheduler.Update(diff); if (!UpdateVictim()) - { - switch (events.ExecuteEvent()) - { - case EVENT_TAKE_OFF: - { - Tapped = false; - Position pos; - if (Unit* EscapeDummy = me->FindNearestCreature(NPC_ESCAPE_DUMMY, 30)) - pos = EscapeDummy->GetPosition(); - else - { - pos = me->GetRandomNearPosition(20); - pos.m_positionZ += 25; - } + return; - me->SetDisableGravity(true); - me->GetMotionMaster()->MovePoint(POINT_DESPAWN, pos); - me->SetReactState(REACT_PASSIVE); - events.ScheduleEvent(EVENT_CREDIT_PLAYER, 100ms); - break; - } - case EVENT_CREDIT_PLAYER: - DoCast(GetPlayer(), SPELL_FORCE_OF_NELTHARAKU, true); - me->DespawnOrUnsummon(3s, 0s); - break; - } + if (me->HasUnitState(UNIT_STATE_CASTING)) return; - } DoMeleeAttackIfReady(); } +private: + bool _tapped; + ObjectGuid _playerGUID; + + Player* _GetPlayer() { return ObjectAccessor::GetPlayer(*me, _playerGUID); } }; /*#####