void instance_old_hillsbrad::SetData(uint32 uiType, uint32 uiData)
{
    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[TYPE_BARREL_DIVERSION] = IN_PROGRESS;

                if (m_uiBarrelCount == 5)
                {
                    UpdateLodgeQuestCredit();

                    if (Player* pPlayer = GetPlayerInMap())
                        pPlayer->SummonCreature(NPC_DRAKE, 2128.43f, 71.01f, 64.42f, 1.74f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 1800000);
                    else
                        debug_log("SD2: Instance Old Hillsbrad: SetData (Type: %u Data %u) cannot find any pPlayer.", uiType, uiData);

                    m_auiEncounter[TYPE_BARREL_DIVERSION] = DONE;
                }
            }
            break;
        }
        case TYPE_THRALL_EVENT:
        {
            // nothing to do if already done and thrall respawn
            if (m_auiEncounter[TYPE_THRALL_EVENT] == DONE)
                return;

            if (uiData == FAIL)
            {
                if (m_uiThrallEventCount <= 20)
                {
                    ++m_uiThrallEventCount;
                    debug_log("SD2: Instance Old Hillsbrad: Thrall event failed %u times.", m_uiThrallEventCount);

                    HandleThrallRelocation();
                }
                else if (m_uiThrallEventCount > 20)
                {
                    m_auiEncounter[TYPE_THRALL_EVENT] = uiData;
                    m_auiEncounter[TYPE_THRALL_PART1] = uiData;
                    m_auiEncounter[TYPE_THRALL_PART2] = uiData;
                    m_auiEncounter[TYPE_THRALL_PART3] = uiData;
                    m_auiEncounter[TYPE_THRALL_PART4] = uiData;
                    debug_log("SD2: Instance Old Hillsbrad: Thrall event failed %u times. Reset instance required.", m_uiThrallEventCount);
                }
            }
            else
                m_auiEncounter[TYPE_THRALL_EVENT] = uiData;

            debug_log("SD2: Instance Old Hillsbrad: Thrall escort event adjusted to data %u.",uiData);
            break;
        }
        case TYPE_THRALL_PART1:
            m_auiEncounter[TYPE_THRALL_PART1] = uiData;
            debug_log("SD2: Instance Old Hillsbrad: Thrall event part I adjusted to data %u.",uiData);
            break;
        case TYPE_THRALL_PART2:
            m_auiEncounter[TYPE_THRALL_PART2] = uiData;
            debug_log("SD2: Instance Old Hillsbrad: Thrall event part II adjusted to data %u.",uiData);
            break;
        case TYPE_THRALL_PART3:
            m_auiEncounter[TYPE_THRALL_PART3] = uiData;
            debug_log("SD2: Instance Old Hillsbrad: Thrall event part III adjusted to data %u.",uiData);
            break;
        case TYPE_THRALL_PART4:
            m_auiEncounter[TYPE_THRALL_PART4] = uiData;
            debug_log("SD2: Instance Old Hillsbrad: Thrall event part IV adjusted to data %u.",uiData);
            break;
    }
}
void instance_old_hillsbrad::SetData(uint32 uiType, uint32 uiData)
{
    switch (uiType)
    {
        case TYPE_BARREL_DIVERSION:
            m_auiEncounter[uiType] = uiData;
            if (uiData == IN_PROGRESS)
            {
                if (m_uiBarrelCount >= MAX_BARRELS)
                    return;

                // Update barrels used and world state
                ++m_uiBarrelCount;
                DoUpdateWorldState(WORLD_STATE_OH, m_uiBarrelCount);

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

                // Set encounter to done, and spawn Liutenant Drake
                if (m_uiBarrelCount == MAX_BARRELS)
                {
                    UpdateLodgeQuestCredit();

                    if (Player* pPlayer = GetPlayerInMap())
                    {
                        pPlayer->SummonCreature(NPC_DRAKE, aDrakeSummonLoc[0], aDrakeSummonLoc[1], aDrakeSummonLoc[2], aDrakeSummonLoc[3], TEMPSUMMON_DEAD_DESPAWN, 0);

                        // set the houses on fire
                        for (GuidList::const_iterator itr = m_lRoaringFlamesList.begin(); itr != m_lRoaringFlamesList.end(); ++itr)
                            DoRespawnGameObject(*itr, 30 * MINUTE);

                        // move the orcs outside the houses
                        float fX, fY, fZ;
                        for (GuidList::const_iterator itr = m_lRightPrisonersList.begin(); itr != m_lRightPrisonersList.end(); ++itr)
                        {
                            if (Creature* pOrc = instance->GetCreature(*itr))
                            {
                                pOrc->GetRandomPoint(afInstanceLoc[0][0], afInstanceLoc[0][1], afInstanceLoc[0][2], 10.0f, fX, fY, fZ);
                                pOrc->SetWalk(false);
                                pOrc->GetMotionMaster()->MovePoint(0, fX, fY, fZ);
                            }
                        }
                        for (GuidList::const_iterator itr = m_lLeftPrisonersList.begin(); itr != m_lLeftPrisonersList.end(); ++itr)
                        {
                            if (Creature* pOrc = instance->GetCreature(*itr))
                            {
                                pOrc->GetRandomPoint(afInstanceLoc[1][0], afInstanceLoc[1][1], afInstanceLoc[1][2], 10.0f, fX, fY, fZ);
                                pOrc->SetWalk(false);
                                pOrc->GetMotionMaster()->MovePoint(0, fX, fY, fZ);
                            }
                        }
                    }
                    else
                        debug_log("SD2: Instance Old Hillsbrad: SetData (Type: %u Data %u) cannot find any pPlayer.", uiType, uiData);

                    SetData(TYPE_BARREL_DIVERSION, DONE);
                }
            }
            break;
        case TYPE_THRALL_EVENT:
            // nothing to do if already done and thrall respawn
            if (GetData(TYPE_THRALL_EVENT) == DONE)
                return;
            m_auiEncounter[uiType] = uiData;
            if (uiData == FAIL)
            {
                // despawn the bosses if necessary
                if (Creature* pSkarloc = GetSingleCreatureFromStorage(NPC_SKARLOC, true))
                    pSkarloc->ForcedDespawn();
                if (Creature* pEpoch = GetSingleCreatureFromStorage(NPC_EPOCH, true))
                    pEpoch->ForcedDespawn();

                if (m_uiThrallEventCount <= MAX_WIPE_COUNTER)
                {
                    ++m_uiThrallEventCount;
                    debug_log("SD2: Instance Old Hillsbrad: Thrall event failed %u times.", m_uiThrallEventCount);

                    // reset Thrall on timer
                    m_uiThrallResetTimer = 30000;
                }
                // If we already respawned Thrall too many times, the event is failed for good
                else if (m_uiThrallEventCount > MAX_WIPE_COUNTER)
                    debug_log("SD2: Instance Old Hillsbrad: Thrall event failed %u times. Reset instance required.", m_uiThrallEventCount);
            }
            break;
        case TYPE_DRAKE:
        case TYPE_SKARLOC:
        case TYPE_ESCORT_BARN:
        case TYPE_ESCORT_INN:
        case TYPE_EPOCH:
            m_auiEncounter[uiType] = uiData;
            debug_log("SD2: Instance Old Hillsbrad: Thrall event type %u adjusted to data %u.", uiType, uiData);
            break;
    }

    if (uiData == DONE)
    {
        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_strInstData = saveStream.str();

        SaveToDB();
        OUT_SAVE_INST_DATA_COMPLETE;
    }
}