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中