MapMgr* InstanceMgr::ClusterCreateInstance( uint32 mapid, uint32 instanceid )
{
    // shouldn't happen
    if( mapid >= NUM_MAPS )
        return NULLMAPMGR;

    MapInfo * info = WorldMapInfoStorage.LookupEntry( mapid );
    if( !info )
        return NULLMAPMGR;

    if( !m_maps[mapid] )
    {
        _CreateMap(mapid);
        if(!m_maps[mapid])
            return NULLMAPMGR;
    }

    MapMgr* mgr = new MapMgr(m_maps[mapid],mapid,instanceid);
    if( !mgr )
        return NULLMAPMGR;
    mgr->Init(true);

    Instance * pInstance = new Instance();
    if( !pInstance )
    {
        delete mgr;
        return NULLMAPMGR;
    }
    pInstance->m_creation = UNIXTIME;
    pInstance->m_creatorGroup = 0;
    pInstance->m_creatorGuid = 0;
    pInstance->m_difficulty = 0;
    pInstance->m_expiration = 0;
    pInstance->m_instanceId = mgr->GetInstanceID();
    pInstance->m_isBattleground = true;
    pInstance->m_mapId = mapid;
    pInstance->m_dbcMap = dbcMap.LookupEntry(mapid);
    pInstance->m_mapInfo = info;
    pInstance->m_mapMgr = mgr;
    m_mapLock.Acquire();
    InstanceMap * pInstanceMap = new InstanceMap;
    if( !pInstanceMap )
    {
        m_mapLock.Release();
        delete mgr;
        delete pInstance;
        return NULLMAPMGR;
    }
    if( m_instances[mapid] == NULL )
        m_instances[mapid] = pInstanceMap;

    m_instances[mapid]->insert( make_pair( pInstance->m_instanceId, pInstance ) );
    m_mapLock.Release();
    ThreadPool.ExecuteTask(format("Map mgr - M%u|I%u", mapid, pInstance->m_instanceId).c_str(), mgr);
    return mgr;
}
MapMgr* InstanceMgr::CreateBattlegroundInstance(uint32 mapid)
{
    // shouldn't happen
    if( mapid >= NUM_MAPS )
        return NULLMAPMGR;

    if(dbcMap.LookupEntry(mapid) == NULL)
        return NULLMAPMGR;

    if(!m_maps[mapid])
    {
        _CreateMap(mapid);
        if(!m_maps[mapid])
            return NULLMAPMGR;
    }

    MapMgr* ret = (new MapMgr(m_maps[mapid], mapid, GenerateInstanceID()));
    ret->Init(true);
    Instance * pInstance = new Instance();
    pInstance->m_creation = UNIXTIME;
    pInstance->m_creatorGroup = 0;
    pInstance->m_creatorGuid = 0;
    pInstance->m_difficulty = MODE_5PLAYER_NORMAL;
    pInstance->m_expiration = 0;
    pInstance->m_instanceId = ret->GetInstanceID();
    pInstance->m_isBattleground = true;
    pInstance->m_mapId = mapid;
    pInstance->m_dbcMap = dbcMap.LookupEntry(mapid);
    pInstance->m_mapInfo = WorldMapInfoStorage.LookupEntry(mapid);
    pInstance->m_mapMgr = ret;
    m_mapLock.Acquire();
    if( m_instances[mapid] == NULL )
        m_instances[mapid] = new InstanceMap;

    m_instances[mapid]->insert( make_pair( pInstance->m_instanceId, pInstance ) );
    m_mapLock.Release();
    ThreadPool.ExecuteTask(format("BattleGround Mgr - M%u|I%u", mapid, pInstance->m_instanceId).c_str(), ret);
    return ret;
}