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中也可以 这算是疑问,待我在看看*/