void Update(uint32 diff)
        {
            if (GetData(EVENT_LEEEROY) != FAIL && GetData(EVENT_LEEEROY) == IN_PROGRESS)
            {
                if (LeeroyTimer <= diff)
                {
                    SetData(EVENT_LEEEROY, FAIL);
                    Leeeeeeeeroy = false;
                    DoSendNotifyToInstance("Leeeeeeeeeeeeeroy! achievement failed");
                } 
                else 
                    LeeroyTimer -= diff;

                if (WhelpCount >= 50 && Leeeeeeeeroy)
                {
                    SetData(EVENT_LEEEROY, DONE);
                    DoSendNotifyToInstance("Leeeeeeeeeeeeeroy! achievement completed");
                }
            }
        } 
Ejemplo n.º 2
0
        void SetData(uint32 type, uint32 data)
        {
            switch (type)
            {
            case DATA_MEATHOOK_EVENT:
                _encounterState[0] = data;
                break;
            case DATA_SALRAMM_EVENT:
                if(data == DONE)
                {
                    DoUpdateWorldState(WORLDSTATE_WAVE_COUNT, 0);
                    if(ArthasNeedsTeleport())
                        if(Creature* arthas = instance->GetCreature(_arthasGUID))
                            arthas->AI()->SetData(1, 0);
                }
                _encounterState[1] = data;
                break;
            case DATA_EPOCH_EVENT:
                _encounterState[2] = data;
                break;
            case DATA_MAL_GANIS_EVENT:
                _encounterState[3] = data;

                switch (_encounterState[3])
                {
                case NOT_STARTED:
                    HandleGameObject(_malGanisGate2GUID, true);
                    break;
                case IN_PROGRESS:
                    HandleGameObject(_malGanisGate2GUID, false);
                    break;
                case DONE:
                    HandleGameObject(_exitGateGUID, true);
                    if (GameObject* go = instance->GetGameObject(_malGanisChestGUID))
                        go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
                    instance->SummonCreature(NPC_CHROMIE_3, ChromieExitSummonPos);
                    Map::PlayerList const &players = instance->GetPlayers();
                    for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
                        itr->getSource()->KilledMonsterCredit(31006, 0);
                    break;
                }
                break;
            case DATA_INFINITE_EVENT:
                _encounterState[4] = data;
                switch (data)
                {
                case DONE:
                    DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, 0);
                    DoCompleteAchievement(ACHIEVEMENT_CULLING_TIME);
                    break;
                case FAIL:
                    DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, 0);
                    if(Creature* infinite = instance->GetCreature(_infiniteGUID))
                        infinite->AI()->DoAction(0);
                    break;
                case IN_PROGRESS:
                    DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, 1);
                    DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN, 25);
                    instance->SummonCreature(NPC_INFINITE, InfiniteSummonPos);
                    break;
                }
                break;
            case DATA_ARTHAS_EVENT:
                if (data == FAIL)
                {
                    if (Creature* deadArthas = instance->GetCreature(_arthasGUID))
                    {
                        deadArthas->DespawnOrUnsummon(10000);

                        int index;

                        if(_artasStepUi >= 83) // Before last run
                            index = 2;
                        else if (_artasStepUi >= 60) // Before the council
                            index = 1;
                        else // entrance of city
                            index = 0;

                        if(Creature* newArthas = instance->SummonCreature(NPC_ARTHAS, ArthasSpawnPositions[index]))
                            newArthas->AI()->SetData(0, pow(2.0, index));
                    }
                }
                break;
            case DATA_CRATE_COUNT:
                _crateCount = data;
                DoUpdateWorldState(WORLDSTATE_CRATES_REVEALED, _crateCount);
                if (_crateCount == 5)
                {
                    Map::PlayerList const &players = instance->GetPlayers();
                    for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
                        itr->getSource()->KilledMonsterCredit(30996, 0);

                    // Summon Chromie and global whisper
                    if (Creature* chromie = instance->SummonCreature(NPC_CHROMIE_2, ChromieEntranceSummonPos))
                        if (!instance->GetPlayers().isEmpty())
                            if (Player* player = instance->GetPlayers().getFirst()->getSource())
                                sCreatureTextMgr->SendChat(chromie, SAY_CRATES_COMPLETED, player->GetGUID(), CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_MAP);
                    DoUpdateWorldState(WORLDSTATE_SHOW_CRATES, 0);
                }
                break;
            case DATA_TRANSFORM_CITIZENS:
                switch(data)
                {
                case SPECIAL: // Respawn Zombies
                    while (!_zombiesList.empty())
                    {
                        Creature *summon = instance->GetCreature(*_zombiesList.begin());
                        if (!summon)
                            _zombiesList.erase(_zombiesList.begin());
                        else
                        {
                            _zombiesList.erase(_zombiesList.begin());
                            if (TempSummon* summ = summon->ToTempSummon())
                            {
                                summon->DestroyForNearbyPlayers();
                                summ->UnSummon();
                            }
                            else
                                summon->DisappearAndDie();
                        }
                    }
                case IN_PROGRESS: // Transform Citizens
                    for (std::list<uint64>::iterator itr = _citizensList.begin(); itr != _citizensList.end(); ++itr)
                        if(Creature* citizen = instance->GetCreature((*itr)))
                        {
                            if(Creature* arthas = instance->GetCreature(GetData64(DATA_ARTHAS)))
                                if(Creature* risenZombie = arthas->SummonCreature(NPC_ZOMBIE, citizen->GetPositionX(), citizen->GetPositionY(), citizen->GetPositionZ(), citizen->GetOrientation())) //, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000))
                                    _zombiesList.push_back(risenZombie->GetGUID());
                            citizen->SetPhaseMask(2, true);
                        }
                    break;
                }
                break;
            case DATA_ZOMBIEFEST:
                if (!instance->IsHeroic() || GetData(DATA_ZOMBIEFEST) == DONE)
                    break;

                switch(data)
                {
                case DONE:
                    DoCompleteAchievement(ACHIEVEMENT_ZOMBIEFEST);
                    DoSendNotifyToInstance(zombiefestWarnings[10]);
                    _zombieFest = data;
                    break;
                case IN_PROGRESS:
                    DoSendNotifyToInstance(zombiefestWarnings[0]);
                    _zombieFest = data;
                    break;
                case FAIL:
                    _killedZombieCount = 0;
                    _zombieTimer = 60000;
                    _zombieFest = data;
                    DoSendNotifyToInstance(zombiefestWarnings[11]);
                    break;
                case SPECIAL:
                    _killedZombieCount++;
                    if(_killedZombieCount == 1)
                        SetData(DATA_ZOMBIEFEST, IN_PROGRESS);
                    else if(_killedZombieCount >= 100 && GetData(DATA_ZOMBIEFEST) == IN_PROGRESS)
                        SetData(DATA_ZOMBIEFEST, DONE);
                    else
                    {
                        if(_killedZombieCount%10 == 0)
                            DoSendNotifyToInstance(zombiefestWarnings[_killedZombieCount/10]);
                    }
                    break;
                }
                break;
            case DATA_ARTHAS_STEP:
                _artasStepUi = data;
                return;
            }

            if (data == DONE)
                SaveToDB();
        }