diff options
author | karn <phillip.wow@gmx.de> | 2014-07-19 22:49:50 +0100 |
---|---|---|
committer | DDuarte <dnpd.dd@gmail.com> | 2014-07-19 22:50:32 +0100 |
commit | 26aaf2384ca48db1c199a263ae50d3ab1da59891 (patch) | |
tree | 9a06f50533aff60a190bbab7b7fe0a1782f0b6e1 /src | |
parent | 40b4bd2eda333e90dd0ee1a1b6a6e939c10a6985 (diff) |
Core/Creature: Minigob Manabonk
Closes #11097
Signed-off-by: DDuarte <dnpd.dd@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 2 | ||||
-rw-r--r-- | src/server/scripts/Northrend/zone_dalaran.cpp | 110 |
2 files changed, 112 insertions, 0 deletions
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 8d3b37cc1d5..99c3d234ef8 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -2373,6 +2373,8 @@ bool SpellInfo::_IsPositiveEffect(uint8 effIndex, bool deep) const case 61716: // Rabbit Costume case 61734: // Noblegarden Bunny case 62344: // Fists of Stone + case 61819: // Manabonked! (item) + case 61834: // Manabonked! (minigob) return true; default: break; diff --git a/src/server/scripts/Northrend/zone_dalaran.cpp b/src/server/scripts/Northrend/zone_dalaran.cpp index 1e8da70bbbf..0acb89d7d6f 100644 --- a/src/server/scripts/Northrend/zone_dalaran.cpp +++ b/src/server/scripts/Northrend/zone_dalaran.cpp @@ -172,8 +172,118 @@ public: } }; +enum MinigobData +{ + ZONE_DALARAN = 4395, + + SPELL_MANABONKED = 61834, + SPELL_TELEPORT_VISUAL = 51347, + SPELL_IMPROVED_BLINK = 61995, + + EVENT_SELECT_TARGET = 1, + EVENT_BLINK = 2, + EVENT_DESPAWN_VISUAL = 3, + EVENT_DESPAWN = 4, + + MAIL_MINIGOB_ENTRY = 264, + MAIL_DELIVER_DELAY_MIN = 5*MINUTE, + MAIL_DELIVER_DELAY_MAX = 15*MINUTE +}; + +class npc_minigob_manabonk : public CreatureScript +{ + public: + npc_minigob_manabonk() : CreatureScript("npc_minigob_manabonk") {} + + struct npc_minigob_manabonkAI : public ScriptedAI + { + npc_minigob_manabonkAI(Creature* creature) : ScriptedAI(creature) + { + me->setActive(true); + } + + void Reset() + { + me->SetVisible(false); + events.ScheduleEvent(EVENT_SELECT_TARGET, IN_MILLISECONDS); + } + + Player* SelectTargetInDalaran() + { + std::list<Player*> PlayerInDalaranList; + PlayerInDalaranList.clear(); + + Map::PlayerList const &players = me->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + if (Player* player = itr->GetSource()->ToPlayer()) + if (player->GetZoneId() == ZONE_DALARAN && !player->IsFlying() && !player->IsMounted() && !player->IsGameMaster()) + PlayerInDalaranList.push_back(player); + + if (PlayerInDalaranList.empty()) + return NULL; + return Trinity::Containers::SelectRandomContainerElement(PlayerInDalaranList); + } + + void SendMailToPlayer(Player* player) + { + SQLTransaction trans = CharacterDatabase.BeginTransaction(); + int16 deliverDelay = irand(MAIL_DELIVER_DELAY_MIN, MAIL_DELIVER_DELAY_MAX); + MailDraft(MAIL_MINIGOB_ENTRY, true).SendMailTo(trans, MailReceiver(player), MailSender(MAIL_CREATURE, me->GetEntry()), MAIL_CHECK_MASK_NONE, deliverDelay); + CharacterDatabase.CommitTransaction(trans); + } + + void UpdateAI(uint32 diff) + { + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_SELECT_TARGET: + me->SetVisible(true); + DoCast(me, SPELL_TELEPORT_VISUAL); + if (Player* player = SelectTargetInDalaran()) + { + me->NearTeleportTo(player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), 0.0f); + DoCast(player, SPELL_MANABONKED); + SendMailToPlayer(player); + } + events.ScheduleEvent(EVENT_BLINK, 3*IN_MILLISECONDS); + break; + case EVENT_BLINK: + DoCast(me, SPELL_IMPROVED_BLINK); + Position pos; + me->GetRandomNearPosition(pos, (urand(15, 40))); + me->GetMotionMaster()->MovePoint(0, pos.m_positionX, pos.m_positionY, pos.m_positionZ); + events.ScheduleEvent(EVENT_DESPAWN, 3*IN_MILLISECONDS); + events.ScheduleEvent(EVENT_DESPAWN_VISUAL, 2.5*IN_MILLISECONDS); + break; + case EVENT_DESPAWN_VISUAL: + DoCast(me, SPELL_TELEPORT_VISUAL); + break; + case EVENT_DESPAWN: + me->DespawnOrUnsummon(); + break; + default: + break; + } + } + } + + private: + EventMap events; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_minigob_manabonkAI(creature); + } +}; + void AddSC_dalaran() { new npc_mageguard_dalaran; new npc_hira_snowdawn; + new npc_minigob_manabonk(); } |