コード例 #1
0
            void UpdateAI(uint32 diff)
            {

                if (!sWorld->getBoolConfig(CONFIG_MINIGOB_MANABONK))
                    return;

                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;
                    }
                }
            }
コード例 #2
0
ファイル: zone_dalaran.cpp プロジェクト: lasyan3/TrinityCore
            void UpdateAI(uint32 diff) override
            {
                events.Update(diff);

                while (uint32 eventId = events.ExecuteEvent())
                {
                    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);
                            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, 3s);
                            break;
                        case EVENT_WANDER:
                            me->GetMotionMaster()->MoveRandom(8);
                            events.ScheduleEvent(EVENT_PAUSE, 1min);
                            break;
                        case EVENT_PAUSE:
                            me->GetMotionMaster()->MoveIdle();
                            events.ScheduleEvent(EVENT_CAST, 2s);
                            break;
                        case EVENT_CAST:
                            if (Player* player = me->GetMap()->GetPlayer(playerGuid))
                            {
                                DoCast(player, SPELL_MANABONKED);
                                SendMailToPlayer(player);
                            }
                            else
                                me->AddObjectToRemoveList();

                            events.ScheduleEvent(EVENT_LAUGH_2, Seconds(8));
                            break;
                        case EVENT_LAUGH_2:
                            me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH_NO_SHEATHE);
                            events.ScheduleEvent(EVENT_BLINK, 3s);
                            break;
                        case EVENT_BLINK:
                            DoCastSelf(SPELL_IMPROVED_BLINK);
                            events.ScheduleEvent(EVENT_DESPAWN, 4s);
                            break;
                        case EVENT_DESPAWN:
                            me->AddObjectToRemoveList();
                            break;
                        default:
                            break;
                    }
                }
            }