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_LOCKFREEfor (;;){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中
?
轉載于:https://www.cnblogs.com/zzyoucan/p/4117523.html
總結
- 上一篇: php 自带过滤和转义函数
- 下一篇: 高可用