码迷,mamicode.com
首页 > 其他好文 > 详细

GS踢玩家下线功能

时间:2014-11-28 00:59:38      阅读:312      评论:0      收藏:0      [点我收藏+]

标签:style   blog   ar   color   sp   on   div   log   bs   

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查找用户指针
}

 

GS踢玩家下线功能

标签:style   blog   ar   color   sp   on   div   log   bs   

原文地址:http://www.cnblogs.com/zzyoucan/p/4127470.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!