map 玩家上线
else if(gs2ms_add_player == pkt.cmd)
{
PlayerChannel* pPC = new PlayerChannel(this);
//加到地图中,但是并未激活该玩家
int nChannelId = pPC->OnPlayerEnter(pkt.data, pkt.len);//玩家信息的初始化工作
m_vecPlayerChannel[nChannelId] = pPC;
AddPlayer(nChannelId);//玩家加入地图,玩家进入地图位置,向客户端发送entermap包
}
在AddPlayer中向客户端发送了玩家位置包,现在好像DataLayer专门搞了个线程取所有线程的包和GS的包
接下来客户端就发送了玩家激活包,如果客户端不发送是不让玩家进入地图的 //激活包处理
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->GetAttrTgtPos());
// SetMapColl(mpos.x, mpos.y, true);
// GetAllPlayers()[pPC->GetAttrObjID_Id()] = pPC;
m_MapCellMgr.AddPlayer(pPC->GetAttrObjID_Id(), pPC);//这个就是说了很久的地图单元格管理
m_MapCellMgr.AddObj(cPlayerMapPos.x, cPlayerMapPos.y, pPC); //在新进入块中通知
pos2d newBlockPos(pPC->GetAttrBlockX(), pPC->GetAttrBlockY());
pPC->m_fnSendStatChange(pPC->GetAttrObjStat());//向客户端发送statchang包,就是有名的玩家状态包,表示其魔量,血量,可以说是玩家最基本的信息
#ifdef USE_BLOCK_MGR
NotifyBlockX(pos2d(), newBlockPos, pPC, Map::eBlockChange_EnterMap);
m_MapBlockMgr.Add(newBlockPos, pPC);
#else
NotifyBlock(pos2d(), newBlockPos, pPC, true);//以前好像是5*5block格子的通知,现在不清楚,就是说玩家上线5*5格子内的玩家可以看到他上线,发的是objinfo结构体
m_MapCellMgr.m_vecRolesBlock[pPC->GetAttrBlockX()][pPC->GetAttrBlockY()].Add(pPC);//加入到blockmgr中,有名的block管理器
#endif
//让玩家上线就能看到所有附近角色的动作。 UpdateRegionInfo(pPC, cPlayerMapPos);//初始化服务器玩家区域信息,是在哪个区域中 //判断罪恶值
if(pPC->GetAttrSinValue() > )
{
m_spSinMgr->AddPlayer(pPC);//加入罪恶管理器中
}
//如果在皇宫内地图,重新设置皇宫内帮会类型
if(eMAPTYPE_PALACE == m_MapType)
{
std::wstring GuildName = safe::mbstowcs(pPC->m_pActorInfoEx->GetGangName());
m_spCityObj->SetPalaceGuild(GuildName, true);
}
//宠物(现在主要是切图时宠物携带)
if(pPC->m_pActorInfoEx->IsCarryTempPet())
{
const ShuiHu::PetInfo* pTempPetInfo = pPC->m_pActorInfoEx->GetTempPetInfoPtr();
if (pTempPetInfo->m_nCurHP <= )
{
ShuiHu::GetLogger()->Warning("玩家(ID=%d)进入新地图(%d),带了个血量为<=0的宠物(ID=%d)!",
pPC->GetAttrObjID_Id(), m_nMapId, pTempPetInfo->m_nID);
return;
}
pos2d cPetMapPos();
if (!Round(, cPlayerMapPos, cPetMapPos))//???
{
pPC->m_pActorInfoEx->SetNoneTempPet();
return;
} // 召唤正式宠物
m_pSkill->CallPetByPos(pPC, *pTempPetInfo, cPetMapPos);//召唤宠物出来
}
} void Map::StartGame(int mapChannelId)
{
auto plchannel = m_vecPlayerChannel[mapChannelId];
//上线通知好友
m_pRelationOpt->ActorOnline(plchannel);
int missionid = -;
auto& misison_map = plchannel->m_pActorInfoEx->Mission_map; //这步应该是根据玩家任务状态发送跟新客户端玩家任务面板任务信息,关于lua后面再看
ActorInfoExTemp* pAcInfoT = plchannel->m_pActorInfoEx;
for(auto i = ; i < MAX_MISSION_RCV_NUM; i++)
{
int id = pAcInfoT->GetAcceptedMissionId(i);
if(pAcInfoT->GetIsOnTrack(i))
m_pMission->GetLuaMissionPtr()->SendSavedTaskPanelMsg(m_nMapId, mapChannelId, id);
if(pAcInfoT->GetMissionState(id) == ShuiHu::eMissionState_In)
{
m_pMission->GetLuaMissionPtr()->SetMissionFlag(m_nMapId,mapChannelId,id);
missionid = id;
}
} //m_pMission->GetLuaMissionPtr()->ChangeMapClearMission(m_nMapId,mapChannelId,missionid);
// for(int i = 2;i < 4;i++)
// GetLuaMisson()->GetMUIMissionName(m_nMapId,mapChannelId, i);
GetLuaMisson()->GetMUIMissionName(m_nMapId,mapChannelId, -); } //经过激活之后附近玩家就可以看到玩家的动作和其他的状态信息,服务器也响应处理好了玩家的相关信息,表示玩家正式的加入地图了

map 玩家上线的更多相关文章

  1. GS玩家登录

    玩家上线 这个过程看了很多很多次了,这里在看下 客户端打开,服务器收到libevent事件,然后new Channel这个过程都付给他各种指针,然后放到channel容器中 .客户端发送c2s_log ...

  2. ms人物上线

    在看MS人物上线 else if(gs2ms_add_player == pkt.cmd) { PlayerChannel* pPC = new PlayerChannel(this); //加到地图 ...

  3. 搭建微信小程序服务

    准备域名和证书 任务时间:20min ~ 40min 小程序后台服务需要通过 HTTPS 访问,在实验开始之前,我们要准备域名和 SSL 证书. 域名注册 如果您还没有域名,可以在腾讯云上选购,过程可 ...

  4. 腾讯云&搭建微信小程序服务

    准备域名和证书 任务时间:20min ~ 40min 小程序后台服务需要通过 HTTPS 访问,在实验开始之前,我们要准备域名和 SSL 证书. 域名注册 如果您还没有域名,可以在腾讯云上选购,过程可 ...

  5. 基于centos搭建微信小程序服务,配置及数据库等

    基于centos搭建小程序, ps:请提前20天准备将域名备案,申请ssl证书 实验上机地址:https://cloud.tencent.com/developer/labs/lab/10004 准备 ...

  6. mmzb游戏事故分析

    最近一次线上更新,老项目挂了,遍地哀嚎,日活跃掉了好多,心痛... 这次维护时,SA为了缩减硬件资源,做了一次数据库迁移.给到开发手上的player db,只有一些索引数据,不带有任一玩家数据.玩家上 ...

  7. Unity3d 网络编程(一)(Unity3d内建网络Network介绍)

    首先个人说说题外话,Unity3d使用的网络库核心是用C++实现的一款商业网络游戏引擎库. RakNet.所以对于移动设备来说,用Unity3d来写server是全然能够的,而且内建网络库的各项功能封 ...

  8. AI,如何影响你在看的影视剧和综艺?

    文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 转自 |  涵的硅谷成长笔记(公众号ID:HanGrowth) 作者 | Han涵 前段时间,作为奥斯 ...

  9. MongoDB慢查询性能分析

    最近,长期运营后的港台服出现一个问题,web充值很慢,用gm指令查询玩家信息也很慢.最后定位到MongoDB查询也很慢.   刚开始定位的时候,运营SA直接查指定的玩家,并反映很慢,就猜测是索引的问题 ...

随机推荐

  1. kubernetes1.5.2集群部署过程--安全模式

    使用https安全模式部署kubernetes集群,能保证集群通讯安全.有效限制非授权用户访问.但部署比非安全模式复杂的多. 本文为etcd.kubernetes集群中各个组件配置证书认证,所有组件通 ...

  2. StringBuilder.append()与String的"+"的效率PK

    如果String通过"+"来拼接,如果拼接的字符串是常量,则效率会非常高,因为会进行编译时优化,这个时候StringBuilder的append()是达不到的. 如果将String ...

  3. [PWA] Cache JSON Data in a React PWA with Workbox, and Display it while Offline

    We can view the PWA offline because we are caching the static and CDN assets for the app - but the l ...

  4. mac查看端口占用

    Mac OS/Linux命令查询网络端口占用情况   netstat命令 netstat -an | grep 3306 3306替换成需要grep的端口号 lsof命令 通过list open fi ...

  5. JavaScript数组求最大值 面试题

    1.JavaScript数组求最大值 (1)方法一:借用math.max (2)方法二:ES6 2.代码 <!DOCTYPE html> <html lang="zh&qu ...

  6. Android Studio加入插件(Genymotion)

    官方模拟器的龟速已让我们无力吐槽.幸好有genymotion这款逆天的Android虚拟机,它有着高速的开启速度,良好的交互界面. 是Android开发必备的良品.甚至有些玩家已经用genymotio ...

  7. Nginx:解析HTTP配置的流程

    参考资料:深入理解Nginx(陶辉) 书中有详细的讲解,这里只用本人的理解梳理一下该流程. 一点提议:对于像我这样的新手,面对暂时看不懂章节,建议先往下看一下(可能就会有新的理解或灵感),而不要死磕在 ...

  8. 打造Android万能上拉下拉刷新框架--XRefreshView(三)

    转载请注明出处:http://blog.csdn.net/footballclub/ 打造Android万能上拉下拉刷新框架–XRefreshView(一) 打造Android万能上拉下拉刷新框架–X ...

  9. Java学习从入门到精通(2) [转载]

    Java Learning Path(二).书籍篇 学习一门新的知识,不可能指望只看一本,或者两本书就能够完全掌握.需要有一个循序渐进的阅读过程.我推荐Oreilly出版的Java系列书籍. 在这里我 ...

  10. STM32F4先设置寄存器还是先使能时钟

    http://zhidao.baidu.com/link?url=gdVNuIgLOJcV37QzbCx0IrFip5pskiPQDWpoZayr_xBEe120p4d_iWtrfDl1d4tSFaH ...