diff options
author | Kittnz <frederik156@hotmail.com> | 2016-02-06 21:55:54 +0100 |
---|---|---|
committer | Kittnz <frederik156@hotmail.com> | 2016-02-06 21:55:54 +0100 |
commit | 64d1addbbff1c7531295556164f4bba09182b9dc (patch) | |
tree | 812079b2321858a24498b57bc54c639f68e2538e /src | |
parent | e283dc991d081d40640767d3038ca44943ece702 (diff) |
Pet/Misc: Implement Pandaran Monk's pet abilitys
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/World/npcs_special.cpp | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index aa030be8d05..6262706c79f 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -2634,6 +2634,100 @@ public: } }; +enum PandarenMonkMisc +{ + SPELL_PANDAREN_MONK = 69800, + EVENT_FOCUS = 1, + EVENT_EMOTE = 2, + EVENT_FOLLOW = 3, + EVENT_DRINK = 4 +}; + +class npc_pandaren_monk : public CreatureScript +{ +public: + npc_pandaren_monk() : CreatureScript("npc_pandaren_monk") {} + + struct npc_pandaren_monkAI : public NullCreatureAI + { + npc_pandaren_monkAI(Creature* creature) : NullCreatureAI(creature) { } + + void Reset() override + { + _events.Reset(); + _events.ScheduleEvent(EVENT_FOCUS, 1000); + } + + void EnterEvadeMode(EvadeReason why) override + { + if (!_EnterEvadeMode(why)) + return; + + Reset(); + } + + void ReceiveEmote(Player* player, uint32 emote) override + { + if (Unit* owner = me->GetCharmerOrOwner()) + { + me->InterruptSpell(CURRENT_CHANNELED_SPELL); + me->StopMoving(); + + switch (emote) + { + case TEXT_EMOTE_BOW: + _events.ScheduleEvent(EVENT_FOCUS, 1000); + break; + case TEXT_EMOTE_DRINK: + _events.ScheduleEvent(EVENT_DRINK, 1000); + break; + } + } + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + + if (Unit* owner = me->GetCharmerOrOwner()) + if (!me->IsWithinDist(owner, 30.f)) + me->InterruptSpell(CURRENT_CHANNELED_SPELL); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_FOCUS: + if (Unit* owner = me->GetCharmerOrOwner()) + me->SetFacingToObject(owner); + _events.ScheduleEvent(EVENT_EMOTE, 1000); + break; + case EVENT_EMOTE: + me->HandleEmoteCommand(EMOTE_ONESHOT_BOW); + _events.ScheduleEvent(EVENT_FOLLOW, 1000); + break; + case EVENT_FOLLOW: + if (Unit* owner = me->GetCharmerOrOwner()) + me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); + break; + case EVENT_DRINK: + me->CastSpell(me, SPELL_PANDAREN_MONK, false); + break; + default: + break; + } + } + } + private: + EventMap _events; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_pandaren_monkAI(creature); + } +}; + void AddSC_npcs_special() { new npc_air_force_bots(); @@ -2660,4 +2754,5 @@ void AddSC_npcs_special() new npc_stable_master(); new npc_train_wrecker(); new npc_egbert(); + new npc_pandaren_monk(); } |