在看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中