ms人物上线

在看MS人物上线
else if(gs2ms_add_player == pkt.cmd)
{
    PlayerChannel* pPC = new PlayerChannel(this);
    //加到地图中,但是并未激活该玩家
    int nChannelId = pPC->OnPlayerEnter(pkt.data, pkt.len);//主要playchannel人物基本信息的初始化
    m_vecPlayerChannel[nChannelId] = pPC;
    AddPlayer(nChannelId);    //人物上线位置和血量处理    
}

m_fnSendCmd2Client(s2c_enter_newmap, &cPkt, sizeof(cPkt));//向客户端发送enter_map包,以前这个是走json的,现在服务器全部不走json,因为read_json效率很低
然后客户端想服务器发送c2s_activate_player激活包
激活包做的事情很多
void Map::ActivatePlayer(int mapChannelId) //激活玩家
{
    PlayerChannel* pPC = m_vecPlayerChannel[mapChannelId];
    if (pPC->m_bBeActived)
        return;
    pPC->m_bBeActived = true;
    auto& pActorInfoEx = pPC->m_pActorInfoEx;

    if (!pActorInfoEx->m_bGaming) 
    {//第一次进游戏
        pActorInfoEx->m_bGaming = true;
        StartGame(mapChannelId);//好友上线通知,任务面板的显示
    }        
    pos2d& cPlayerMapPos = m_spBase->GetMapPos(pPC->tgtPos); 
//    SetMapColl(mpos.x, mpos.y, true);
    GetAllPlayers()[pPC->objId.id] = pPC;
    m_MapCellMgr.AddObj(cPlayerMapPos.x, cPlayerMapPos.y, pPC);

    //在新进入块中通知
    pos2d newBlockPos = {pPC->m_nBlockX, pPC->m_nBlockY};
    pPC->m_fnSendStatChange(pPC->stat);
    NotifyBlock(pos2d(), newBlockPos, pPC, true);

    //让玩家上线就能看到所有附近角色的动作。
    m_MapCellMgr.m_vecRolesBlock[pPC->m_nBlockX][pPC->m_nBlockY].Add(pPC);

    UpdateRegionInfo(pPC, cPlayerMapPos);

    //判断罪恶值
    if(pPC->m_pActorInfoEx->GetSinValue() > 0)
    {
        m_spSinMgr->AddPlayer(pPC);
    }

    //宠物(现在主要是切图时宠物携带)
    if(pPC->m_pActorInfoEx->IsCarryTempPet())
    {
        const ShuiHu::PetInfo* pTempPetInfo = pPC->m_pActorInfoEx->GetTempPetInfoPtr();
        if (pTempPetInfo->m_nCurHP <= 0)
        {
            ShuiHu::GetLogger()->Warning("玩家(ID=%d)进入新地图(%d),带了个血量为<=0的宠物(ID=%d)!",
                pPC->objId.id, m_nMapId, pTempPetInfo->m_nID);
            return;
        }
        pos2d cPetMapPos = {0};
        if (!Round(1, cPlayerMapPos, cPetMapPos))
        {
            pPC->m_pActorInfoEx->SetNoneTempPet();
            return; 
        }

        // 召唤正式宠物
        m_pSkill->CallPetByPos(pPC, *pTempPetInfo, cPetMapPos);
    }
}
map暂时就看到这了,在回到share中
原文地址:https://www.cnblogs.com/zzyoucan/p/4168467.html