aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorkarn <phillip.wow@gmx.de>2014-07-19 22:49:50 +0100
committerDDuarte <dnpd.dd@gmail.com>2014-07-19 22:50:32 +0100
commit26aaf2384ca48db1c199a263ae50d3ab1da59891 (patch)
tree9a06f50533aff60a190bbab7b7fe0a1782f0b6e1 /src
parent40b4bd2eda333e90dd0ee1a1b6a6e939c10a6985 (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.cpp2
-rw-r--r--src/server/scripts/Northrend/zone_dalaran.cpp110
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();
}