zoukankan      html  css  js  c++  java
  • share干什么的

    share到底干什么的
    //--------------------打开GameServer,share中加载-------------------------
    1.加载nBodyID
    //玩家的nBodyID表([职业][性别][nboduid])
    std::vector<std::vector<int> > m_nbodyid_table;
    if(!load_nbodyid())
            Plug::PlugMessageBox("加载nBodyID表失败啊!");
    
    2.加载人物等级信息
    //玩家等级基础信息([职业][等级][等级信息])
    std::vector<std::vector<ActorLevelInfo> > m_level_info_vec;
    if(!load_level_info())
            Plug::PlugMessageBox("加载角色等级信息失败!");
    
    //获取地图信息
    std::map<int, MapData> m_mapdata_table;
    if(!load_mapdata())
            Plug::PlugMessageBox("加载地图数据失败!");
    
    
    for(auto iter_map : m_mapdata_table)
    {
        auto& map = m_maps[iter_map.first] = NEW(Map);//创建map
        map->init(get_max_gc_numb(), iter_map.second.map_path.c_str());//初始化map里面的很多东西,有待详解
        map->m_get_level_info = std::bind(&Share::getLevelInfo, this, ph::_1, ph::_2, ph::_3);
    
        map->mapId = iter_map.first;
        std::wstring name = L"地图";
        name += boost::lexical_cast<std::wstring>(map->mapId);
        onThrID(map->getThrID(), name); //获取线程ID
    }
    m_pDataLayer = data_layer;//用于发送包到客户端
    //---------------------------上线玩家--------------------------------
    m_share->add_player2(m_actor_id, mapID, m_actor_name);//需要将玩家加入到这两个容器中
    void Share::add_player2(int actID, int mapID, const std::string& name)
    {
        m_all_player[actID] = mapID;
        m_name_info[name]  = actID;
    }
    //--------------------------玩家下线-----------------------------------
    void Share::del_player2(int actor_id, const std::string& name)
    {    
        m_all_player.erase(actor_id);//从这两个容器中删掉
        m_name_info.erase(name);
    }
    
    //-------------------------其他一些跨地图的操作------------------------
    如:聊天,还有就是玩家切换地图的操作,等于说是share保存的是所有地图的信息,以后也会有相应的跨地图的操作放在这里面
    //--------------------------最后一个最重要的操作,就是接受map中的消息--------------------
    void Share::procMapSendData()
    {
        for(auto map : m_maps)
        {
            MapPkt pkt;
            for (;;)
            {
                if(!map.second->revData(pkt))
                    break;
                if(pkt.cmd == ms2gs_转client_cmd)
                {
                    m_pDataLayer->send_data(pkt.channel_id, pkt.data, pkt.len);
                }
                else if(ms2gs_db_buff_info == pkt.cmd)
                {
                    //玩家下线,保存数据到DB
                    auto channel = m_Channels[pkt.channel_id];//看来share里面保存了所有的channel信息
                    channel->OnSaveData(pkt.data, pkt.len);
    
                    //注意:小退不断开连接
                    if(channel->isDisconnect()) 
                    {
                        //放入释放队列中,断开
                        push_freeQueue(channel);
                        m_Channels[pkt.channel_id] = NULL;
                    }
                }
                else if(ms2gs_obj_leave == pkt.cmd)//玩家切换地图
                {
                    int tgtMapID = -1;
                    std::stringstream ss;
                    ss.write((char*)pkt.data, pkt.len);
                    boost::archive::binary_iarchive ia(ss);
                    ia >> tgtMapID;
    
                    //进入新地图
                    auto newMap = getMapByMapID(tgtMapID);
                    newMap->gs2msData(gs2ms_add_player/*gs2ms_obj_enter*/, pkt.channel_id , (void*)ss.str().c_str(), ss.str().size());
                    auto gc = m_Channels[pkt.channel_id]; //->m_map = newMap;
                    gc->m_map = newMap; //修改地图
                    m_all_player[gc->getActorID()] = tgtMapID; //放入在线玩家容器
                    
                    ////激活玩家【应客户端处理】
                    //Protocol ptl = {0};
                    //ptl.cmd_type = c2s_activate_player;
                    //ptl.content = nullptr;
                    //ptl.size = 0;
                    //std::vector<char> buffer;
                    /ffer.resize(sizeof(Protocol));
                    //int send_len = ptl.to_buffer(&buffer[0], buffer.size());
                    //newMap->gs2msData(gs2ms_转client_cmd, pkt.channel_id, &buffer[0], send_len);
                }
                delete[] pkt.data;
                pkt.data = nullptr;
            }
        }
    }
    /*share里面保存了所有的map信息,保存所有上线玩家的部分信息,所有的channel信息,我就有个疑问了为什么GameServer要继承
    share,难道只是因为需要在在GS线程中处理procMapSendData(),那也不用完全继承share啊,我就去问队长,得到的回答是
    GameServer管理所有的channel,而所有的channel保存在share中,所以这样就继承了,其实也不用继承share,直接把channel信息放到GameServer中也可以
    这算是疑问,待我在看看*/
  • 相关阅读:
    ES6 数值类型常用方法
    阿里云如何发布网站
    常用的网站推荐
    笔记一 sql 基础知识
    笔记一 MVC初识
    基础二 面向对象编程
    基础一
    css reset 样式
    CSS 嵌套绝对定位
    ADO
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/3928370.html
Copyright © 2011-2022 走看看