void instance_culling_of_stratholme::SetData(uint32 uiType, uint32 uiData)
{
    switch(uiType)
    {
        case TYPE_GRAIN_EVENT:
            m_auiEncounter[TYPE_GRAIN_EVENT] = uiData;
            if (uiData == SPECIAL)
                DoUpdateWorldState(WORLD_STATE_CRATES, 1);
            else if (uiData == IN_PROGRESS)
            {
                if (m_uiGrainCrateCount >= 5)
                    return;

                ++m_uiGrainCrateCount;
                DoUpdateWorldState(WORLD_STATE_CRATES_COUNT, m_uiGrainCrateCount);

                if (m_uiGrainCrateCount == 5)
                {
                    UpdateQuestCredit();
					ChromiWhispers();
                    m_uiRemoveCrateStateTimer = 20000;
                    SetData(TYPE_GRAIN_EVENT, DONE);
                }
            }
            break;
        case TYPE_ARTHAS_INTRO_EVENT:
            m_auiEncounter[TYPE_ARTHAS_INTRO_EVENT] = uiData;
            break;
        case TYPE_ARTHAS_ESCORT_EVENT:
            m_auiEncounter[TYPE_ARTHAS_ESCORT_EVENT] = uiData;
            break;
        case TYPE_MEATHOOK_EVENT:
            m_auiEncounter[TYPE_MEATHOOK_EVENT] = uiData;
            if (uiData == DONE)
                SetData(TYPE_SALRAMM_EVENT, IN_PROGRESS);
            break;
        case TYPE_SALRAMM_EVENT:
            m_auiEncounter[TYPE_SALRAMM_EVENT] = uiData;
            if (uiData == DONE)
                DoUpdateWorldState(WORLD_STATE_WAVE, 0);    // Remove WaveCounter
            break;
        case TYPE_EPOCH_EVENT:
            m_auiEncounter[TYPE_EPOCH_EVENT] = uiData;
            break;
        case TYPE_MALGANIS_EVENT:
            m_auiEncounter[TYPE_MALGANIS_EVENT] = uiData;
            if (uiData == DONE)
            {
                DoRespawnGameObject(m_uiDarkRunedChestGUID, 30*MINUTE);
                DoSpawnChromieIfNeeded();
            }
            break;
        case TYPE_INFINITE_CORRUPTER_TIME:
            m_auiEncounter[TYPE_INFINITE_CORRUPTER_TIME] = uiData;
            if (!uiData)
            {
                DoUpdateWorldState(WORLD_STATE_TIME, 0);    // Remove Timer
                DoUpdateWorldState(WORLD_STATE_TIME_COUNTER, 0);
            }
            else
                DoUpdateWorldState(WORLD_STATE_TIME_COUNTER, uiData/(MINUTE*IN_MILLISECONDS));
            break;
        case TYPE_INFINITE_CORRUPTER:
            m_auiEncounter[TYPE_INFINITE_CORRUPTER] = uiData;              
            switch(uiData)
            {
                case IN_PROGRESS:
                    if (!m_auiEncounter[TYPE_INFINITE_CORRUPTER_TIME])
                        SetData(TYPE_INFINITE_CORRUPTER_TIME, MINUTE*25*IN_MILLISECONDS);
                    DoUpdateWorldState(WORLD_STATE_TIME, 1);// Show Timer
                    break;
                case DONE:
                    SetData(TYPE_INFINITE_CORRUPTER_TIME, 0);
                    break;
                case SPECIAL:
                    DoChromieHurrySpeech();
                    break;
                case FAIL:
                    SetData(TYPE_INFINITE_CORRUPTER_TIME, 0);
                    if (Creature* pCorrupter = instance->GetCreature(m_uiCorrupterGUID))
                        if (pCorrupter->isAlive())
                            pCorrupter->ForcedDespawn();
                    break;
            }
			break;
		case TYPE_PHASE:
			m_auiEncounter[TYPE_PHASE] = uiData;
			break;
		case TYPE_ENCOUNTER:
			m_auiEncounter[TYPE_ENCOUNTER] = uiData;
			break;
		case TYPE_WING:
			m_auiEncounter[TYPE_WING] = uiData;
			break;
		case TYPE_ZOMBIEFEST:
			m_auiEncounter[TYPE_ZOMBIEFEST] = uiData;
			if(uiData == IN_PROGRESS)
				m_uiZombieTimer = 0;
			break;
		case TYPE_ZOMBIE_COUNT:
			m_uiZombieCount = m_uiZombieCount + uiData;
			break;
	}

    if (uiData == DONE || (uiType == TYPE_INFINITE_CORRUPTER && uiData == FAIL))
    {
        OUT_SAVE_INST_DATA;

        std::ostringstream saveStream;
        saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " "
            << m_auiEncounter[3] << " " << m_auiEncounter[4] << " " << m_auiEncounter[5] << " "
            << m_auiEncounter[6] << " " << m_auiEncounter[7] << " " << m_auiEncounter[8];

        strInstData = saveStream.str();

        SaveToDB();
        OUT_SAVE_INST_DATA_COMPLETE;
    }
}
        void SetData(uint32 type, uint32 data)
        {
            Player* pPlayer = GetPlayerInMap();

            if (!pPlayer)
            {
                sLog->outDebug(LOG_FILTER_TSCR, "TSCR: Instance Old Hillsbrad: SetData (Type: %u Data %u) cannot find any player.", type, data);
                return;
            }

            switch(type)
            {
            case TYPE_BARREL_DIVERSION:
            {
                if (data == IN_PROGRESS)
                {
                    if (mBarrelCount >= 5)
                        return;

                    ++mBarrelCount;
                    DoUpdateWorldState(WORLD_STATE_OH, mBarrelCount);

                    sLog->outDebug(LOG_FILTER_TSCR, "TSCR: Instance Old Hillsbrad: go_barrel_old_hillsbrad count %u", mBarrelCount);

                    m_auiEncounter[0] = IN_PROGRESS;

                    if (mBarrelCount == 5)
                    {
                        UpdateQuestCredit();
                        pPlayer->SummonCreature(DRAKE_ENTRY, 2128.43f, 71.01f, 64.42f, 1.74f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 1800000);
                        m_auiEncounter[0] = DONE;
                    }
                }
                break;
            }
            case TYPE_THRALL_EVENT:
            {
                if (data == FAIL)
                {
                    if (mThrallEventCount <= 20)
                    {
                        ++mThrallEventCount;
                        m_auiEncounter[1] = NOT_STARTED;
                        sLog->outDebug(LOG_FILTER_TSCR, "TSCR: Instance Old Hillsbrad: Thrall event failed %u times. Resetting all sub-events.", mThrallEventCount);
                        m_auiEncounter[2] = NOT_STARTED;
                        m_auiEncounter[3] = NOT_STARTED;
                        m_auiEncounter[4] = NOT_STARTED;
                        m_auiEncounter[5] = NOT_STARTED;
                    }
                    else if (mThrallEventCount > 20)
                    {
                        m_auiEncounter[1] = data;
                        m_auiEncounter[2] = data;
                        m_auiEncounter[3] = data;
                        m_auiEncounter[4] = data;
                        m_auiEncounter[5] = data;
                        sLog->outDebug(LOG_FILTER_TSCR, "TSCR: Instance Old Hillsbrad: Thrall event failed %u times. Resetting all sub-events.", mThrallEventCount);
                    }
                }
                else
                    m_auiEncounter[1] = data;
                sLog->outDebug(LOG_FILTER_TSCR, "TSCR: Instance Old Hillsbrad: Thrall escort event adjusted to data %u.", data);
                break;
            }
            case TYPE_THRALL_PART1:
                m_auiEncounter[2] = data;
                sLog->outDebug(LOG_FILTER_TSCR, "TSCR: Instance Old Hillsbrad: Thrall event part I adjusted to data %u.", data);
                break;
            case TYPE_THRALL_PART2:
                m_auiEncounter[3] = data;
                sLog->outDebug(LOG_FILTER_TSCR, "TSCR: Instance Old Hillsbrad: Thrall event part II adjusted to data %u.", data);
                break;
            case TYPE_THRALL_PART3:
                m_auiEncounter[4] = data;
                sLog->outDebug(LOG_FILTER_TSCR, "TSCR: Instance Old Hillsbrad: Thrall event part III adjusted to data %u.", data);
                break;
            case TYPE_THRALL_PART4:
                m_auiEncounter[5] = data;
                sLog->outDebug(LOG_FILTER_TSCR, "TSCR: Instance Old Hillsbrad: Thrall event part IV adjusted to data %u.", data);
                break;
            }
        }
    void SetData(uint32 uiType, uint32 uiData)
    {
        Player* pPlayer = GetPlayerInMap();

        if (!pPlayer)
        {
            debug_log("SD2: Instance Old Hillsbrad: SetData (Type: %u Data %u) cannot find any pPlayer.", uiType, uiData);
            return;
        }

        switch(uiType)
        {
            case TYPE_BARREL_DIVERSION:
            {
                if (uiData == IN_PROGRESS)
                {
                    if (m_uiBarrelCount >= 5)
                        return;

                    ++m_uiBarrelCount;
                    DoUpdateWorldState(WORLD_STATE_OH, m_uiBarrelCount);

                    debug_log("SD2: Instance Old Hillsbrad: go_barrel_old_hillsbrad count %u", m_uiBarrelCount);

                    m_auiEncounter[0] = IN_PROGRESS;

                    if (m_uiBarrelCount == 5)
                    {
                        UpdateQuestCredit();
                        pPlayer->SummonCreature(NPC_DRAKE,2128.43,71.01,64.42,1.74,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,1800000);
                        m_auiEncounter[0] = DONE;
                    }
                }
                break;
            }
            case TYPE_THRALL_EVENT:
            {
                if (uiData == FAIL)
                {
                    if (m_uiThrallEventCount <= 20)
                    {
                        ++m_uiThrallEventCount;
                        m_auiEncounter[1] = NOT_STARTED;

                        debug_log("SD2: Instance Old Hillsbrad: Thrall event failed %u times. Resetting all sub-events.", m_uiThrallEventCount);

                        m_auiEncounter[2] = NOT_STARTED;
                        m_auiEncounter[3] = NOT_STARTED;
                        m_auiEncounter[4] = NOT_STARTED;
                        m_auiEncounter[5] = NOT_STARTED;
                    }
                    else if (m_uiThrallEventCount > 20)
                    {
                        m_auiEncounter[1] = uiData;
                        m_auiEncounter[2] = uiData;
                        m_auiEncounter[3] = uiData;
                        m_auiEncounter[4] = uiData;
                        m_auiEncounter[5] = uiData;
                        debug_log("SD2: Instance Old Hillsbrad: Thrall event failed %u times. Reset instance required.", m_uiThrallEventCount);
                    }
                }
                else
                    m_auiEncounter[1] = uiData;

                debug_log("SD2: Instance Old Hillsbrad: Thrall escort event adjusted to data %u.",uiData);
                break;
            }
            case TYPE_THRALL_PART1:
                m_auiEncounter[2] = uiData;
                debug_log("SD2: Instance Old Hillsbrad: Thrall event part I adjusted to data %u.",uiData);
                break;
            case TYPE_THRALL_PART2:
                m_auiEncounter[3] = uiData;
                debug_log("SD2: Instance Old Hillsbrad: Thrall event part II adjusted to data %u.",uiData);
                break;
            case TYPE_THRALL_PART3:
                m_auiEncounter[4] = uiData;
                debug_log("SD2: Instance Old Hillsbrad: Thrall event part III adjusted to data %u.",uiData);
                break;
            case TYPE_THRALL_PART4:
                m_auiEncounter[5] = uiData;
                debug_log("SD2: Instance Old Hillsbrad: Thrall event part IV adjusted to data %u.",uiData);
                break;
        }
    }