GS踢玩家下线功能
GS踢玩家下线功能 //key:userId, val:nChannelId (当前在线用户) std::map<int, int> m_mapOnLineUserByUid; ///< 当前在线用户,用户Id,对应ChannelId //所有在线的玩家通道 std::vector<GameChannel*> m_vecChannel; ///< 所有在线玩家连接 主要就是通过这两个容器实现 if(0 == strncmp(User.m_szUserPwd, m_pUserInfo->m_szUserPwd, MAX_NAME_LEN))//用点击登录成功 { // Kick the same user GameChannel* pGC = m_pShare->GetGcByUid(m_UserId); if(pGC) { //也许对于刚来的我pGC != this这个肯定是看不懂的,现在就好多了,其实指针就是地址,他也是一个变量,值是地址和int差不多 //只是赋予它操作内存的功能,我看他的值0x0044fbcc应该和int差不多,所有这样直接比较就相当于int比较可以 if(pGC != this)//同客户端重复登录不提下线,就是同一个客户端不停地点击登录他还是同一个channel,无需踢下线 m_pShare->KickLink(pGC);//不同客户端重新new channel了 else//相同客户端 return; } // Login Successed! m_eGameState = eGameState_Login; m_pShare->AddOnLineUser(m_UserId, m_nChannelId);//将userid,channelid放入m_mapOnLineUserByUid在线容器中,下次就能查找了 LoginEnum ret = LoginSuccess; SendCmd(s2c_login, &ret, sizeof(LoginEnum)); SendActorListAsyn(m_UserId); } GameChannel* Share::GetGcByUid(int nUserId) const { int nChannelId = GetChannelIdByUid(nUserId);//根据user查找channelid if(nChannelId == -1) return nullptr; return GetGcByChannelId(nChannelId);//根绝channelid查找用户指针 }