GS玩家登录
玩家上线 这个过程看了很多很多次了,这里在看下 客户端打开,服务器收到libevent事件,然后new Channel这个过程都付给他各种指针,然后放到channel容器中 1.客户端发送c2s_login 服务器发送s2c_login 并带以下结果 enum LoginEnum { LoginSuccess, LoginPasswordOrUserError, LoginUserNotExist, LoginUserIsOnline, //用户已在线 }; 1.根据用户名查询id,如果没有返回LoginUserNotExist 2.如果有在去查询用户信息,然后匹配密码,如果不正确 发送LoginPasswordOrUserError 成功就发送LoginSuccess 3.登录成功之后发送角色列表 这步走的是json,感觉可以改成结构体,json解析封装太慢 2.客户端发送c2s_select_actor 服务器根据id到数据库获取actorinfoex {//给客户端发送本地玩家信息s2c_local_player_info,其实就是客户端玩家,其实这个刚知道,其实是通过这个消息发送登录玩家信息 LocPlayerInfo info; InitLocalPlayer(rActorEx, info); SendCmd(s2c_local_player_info, &info, sizeof(info)); } 3.将玩家加载到map中 m_pMap->Gs2MsData(gs2ms_add_player, m_nChannelId, (void*)&rActorEx, sizeof(rActorEx)); GameMap专门负责地图的所有东西,和GS之间通过内部协议通信 void Map::Gs2MsData(int cmd, int channel_id, void* data, int len) { MapPkt pkt; pkt.channelId = channel_id; pkt.data = m_memPool.popPkt(len);//需要拷贝一份内存 memcpy(pkt.data, data, len); pkt.len = len; pkt.cmd = cmd; PushPkt(pkt);//将 } void ThrTransData::PushPkt(MapPkt Pkt) { #ifdef BOOST_LOCKFREE for (;;) { if(m_gs2msPkts2.push(Pkt)) break; boost::this_thread::interruptible_wait(1); } #else { std::lock_guard<std::mutex> lock(m_mtxGs2Ms); m_queGs2MsPkts.push(Pkt); } #endif }; //... else if(gs2ms_add_player == pkt.cmd)//在MS里面还有大量的事情要做,才能进入地图,回头再看 { PlayerChannel* pPC = new PlayerChannel(this); //加到地图中,但是并未激活该玩家 int nChannelId = pPC->OnPlayerEnter(pkt.data, pkt.len); m_vecPlayerChannel[nChannelId] = pPC; AddPlayer(nChannelId); } //... c2s_login s2c_login s2c_json 角色列表 c2c_select_actor s2c_local_player_info 然后将玩家放到MS中