aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/scripts/Northrend/zone_dalaran.cpp90
1 files changed, 65 insertions, 25 deletions
diff --git a/src/server/scripts/Northrend/zone_dalaran.cpp b/src/server/scripts/Northrend/zone_dalaran.cpp
index a8920ff3a07..4702d10ed4b 100644
--- a/src/server/scripts/Northrend/zone_dalaran.cpp
+++ b/src/server/scripts/Northrend/zone_dalaran.cpp
@@ -135,14 +135,18 @@ enum MinigobData
{
ZONE_DALARAN = 4395,
- SPELL_MANABONKED = 61834,
+ SPELL_MANABONKED = 61839,
SPELL_TELEPORT_VISUAL = 51347,
SPELL_IMPROVED_BLINK = 61995,
EVENT_SELECT_TARGET = 1,
- EVENT_BLINK = 2,
- EVENT_DESPAWN_VISUAL = 3,
- EVENT_DESPAWN = 4,
+ EVENT_LAUGH_1 = 2,
+ EVENT_WANDER = 3,
+ EVENT_PAUSE = 4,
+ EVENT_CAST = 5,
+ EVENT_LAUGH_2 = 6,
+ EVENT_BLINK = 7,
+ EVENT_DESPAWN = 8,
MAIL_MINIGOB_ENTRY = 264,
MAIL_DELIVER_DELAY_MIN = 5*MINUTE,
@@ -163,26 +167,29 @@ class npc_minigob_manabonk : public CreatureScript
void Reset() override
{
+ playerGuid = ObjectGuid();
me->SetVisible(false);
- events.ScheduleEvent(EVENT_SELECT_TARGET, IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_SELECT_TARGET, Seconds(1));
}
- Player* SelectTargetInDalaran()
+ void GetPlayersInDalaran(std::vector<Player*>& playerList) const
{
- std::vector<Player*> PlayerInDalaranList;
-
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);
+ playerList.push_back(player);
+ }
+ static Player* SelectTargetInDalaran(std::vector<Player*>& PlayerInDalaranList)
+ {
if (PlayerInDalaranList.empty())
return nullptr;
+
return Trinity::Containers::SelectRandomContainerElement(PlayerInDalaranList);
}
- void SendMailToPlayer(Player* player)
+ void SendMailToPlayer(Player* player) const
{
SQLTransaction trans = CharacterDatabase.BeginTransaction();
int16 deliverDelay = irand(MAIL_DELIVER_DELAY_MIN, MAIL_DELIVER_DELAY_MAX);
@@ -199,30 +206,61 @@ class npc_minigob_manabonk : public CreatureScript
switch (eventId)
{
case EVENT_SELECT_TARGET:
+ {
+ std::vector<Player*> PlayerInDalaranList;
+ GetPlayersInDalaran(PlayerInDalaranList);
+
+ // Increases chance of event based on player count in Dalaran (100 players or more = 100% else player count%)
+ if (PlayerInDalaranList.empty() || urand(1, 100) > PlayerInDalaranList.size())
+ me->AddObjectToRemoveList();
+
me->SetVisible(true);
- DoCast(me, SPELL_TELEPORT_VISUAL);
- if (Player* player = SelectTargetInDalaran())
+ DoCastSelf(SPELL_TELEPORT_VISUAL);
+ if (Player* player = SelectTargetInDalaran(PlayerInDalaranList))
+ {
+ playerGuid = player->GetGUID();
+ Position pos = player->GetPosition();
+ float dist = frand(10.0f, 30.0f);
+ float angle = frand(0.0f, 1.0f) * M_PI * 2.0f;
+ player->MovePositionToFirstCollision(pos, dist, angle);
+ me->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation());
+ }
+ events.ScheduleEvent(EVENT_LAUGH_1, Seconds(2));
+ break;
+ }
+ case EVENT_LAUGH_1:
+ me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH_NO_SHEATHE);
+ events.ScheduleEvent(EVENT_WANDER, Seconds(3));
+ break;
+ case EVENT_WANDER:
+ me->GetMotionMaster()->MoveRandom(8);
+ events.ScheduleEvent(EVENT_PAUSE, Minutes(1));
+ break;
+ case EVENT_PAUSE:
+ me->GetMotionMaster()->MoveIdle();
+ events.ScheduleEvent(EVENT_CAST, Seconds(2));
+ break;
+ case EVENT_CAST:
+ if (Player* player = me->GetMap()->GetPlayer(playerGuid))
{
- me->NearTeleportTo(player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), 0.0f);
DoCast(player, SPELL_MANABONKED);
SendMailToPlayer(player);
}
- events.ScheduleEvent(EVENT_BLINK, 3*IN_MILLISECONDS);
+ else
+ me->AddObjectToRemoveList();
+
+ events.ScheduleEvent(EVENT_LAUGH_2, Seconds(8));
break;
- case EVENT_BLINK:
- {
- DoCast(me, SPELL_IMPROVED_BLINK);
- Position pos = me->GetRandomNearPosition(frand(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);
+ case EVENT_LAUGH_2:
+ me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH_NO_SHEATHE);
+ events.ScheduleEvent(EVENT_BLINK, Seconds(3));
break;
- }
- case EVENT_DESPAWN_VISUAL:
- DoCast(me, SPELL_TELEPORT_VISUAL);
+ case EVENT_BLINK:
+ DoCastSelf(SPELL_IMPROVED_BLINK);
+ events.ScheduleEvent(EVENT_DESPAWN, Seconds(4));
break;
case EVENT_DESPAWN:
- me->DespawnOrUnsummon();
+ me->AddObjectToRemoveList();
break;
default:
break;
@@ -231,6 +269,8 @@ class npc_minigob_manabonk : public CreatureScript
}
private:
+
+ ObjectGuid playerGuid;
EventMap events;
};