map 玩家上线
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 玩家上线的更多相关文章
- GS玩家登录
玩家上线 这个过程看了很多很多次了,这里在看下 客户端打开,服务器收到libevent事件,然后new Channel这个过程都付给他各种指针,然后放到channel容器中 .客户端发送c2s_log ...
- ms人物上线
在看MS人物上线 else if(gs2ms_add_player == pkt.cmd) { PlayerChannel* pPC = new PlayerChannel(this); //加到地图 ...
- 搭建微信小程序服务
准备域名和证书 任务时间:20min ~ 40min 小程序后台服务需要通过 HTTPS 访问,在实验开始之前,我们要准备域名和 SSL 证书. 域名注册 如果您还没有域名,可以在腾讯云上选购,过程可 ...
- 腾讯云&搭建微信小程序服务
准备域名和证书 任务时间:20min ~ 40min 小程序后台服务需要通过 HTTPS 访问,在实验开始之前,我们要准备域名和 SSL 证书. 域名注册 如果您还没有域名,可以在腾讯云上选购,过程可 ...
- 基于centos搭建微信小程序服务,配置及数据库等
基于centos搭建小程序, ps:请提前20天准备将域名备案,申请ssl证书 实验上机地址:https://cloud.tencent.com/developer/labs/lab/10004 准备 ...
- mmzb游戏事故分析
最近一次线上更新,老项目挂了,遍地哀嚎,日活跃掉了好多,心痛... 这次维护时,SA为了缩减硬件资源,做了一次数据库迁移.给到开发手上的player db,只有一些索引数据,不带有任一玩家数据.玩家上 ...
- Unity3d 网络编程(一)(Unity3d内建网络Network介绍)
首先个人说说题外话,Unity3d使用的网络库核心是用C++实现的一款商业网络游戏引擎库. RakNet.所以对于移动设备来说,用Unity3d来写server是全然能够的,而且内建网络库的各项功能封 ...
- AI,如何影响你在看的影视剧和综艺?
文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 转自 | 涵的硅谷成长笔记(公众号ID:HanGrowth) 作者 | Han涵 前段时间,作为奥斯 ...
- MongoDB慢查询性能分析
最近,长期运营后的港台服出现一个问题,web充值很慢,用gm指令查询玩家信息也很慢.最后定位到MongoDB查询也很慢. 刚开始定位的时候,运营SA直接查指定的玩家,并反映很慢,就猜测是索引的问题 ...
随机推荐
- perl一次读取多行文本的策略
在处理文本时,经常遇到这种情况:就是我们须要把两行文本做一个比較,然后选择性输出. 而在while(<FILEHAND>){do something}程序块中默认仅仅能一次读取一行.笔者在 ...
- 第一章 初识shiro
shiro学习教程来自开涛大神的博客:http://jinnianshilongnian.iteye.com/blog/2018936 第一章 初识shiro 简单了解shiro主要记住三张图即可. ...
- CountDownLatch模拟高并发测试代码
直接上代码进行验证吧 /** * 通过countdownlatch的机制,来实现并发运行 * 模拟200个并发测试 * @author ll * @date 2018年4月18日 下午3:55:59 ...
- ES怎么进行字段添加索引,并保留原有数据
1.先将原索引进行备份 curl -XPOST '192.168.46.163:9200/_reindex?pretty' -H 'Content-Type: application/json' -d ...
- go语言编程小tips
go语言一个比较方便的特性是你不需要显示的定义一个变量.例如,在c语言中,你想要使用一个int型变量,那么代码如下 int i; i =0; i++; 而在go语言中, i := 0; i++ 这样你 ...
- 移动web之响应式布局
1.响应式布局的概念 响应式布局是Ethan Marcotte在2010年5月份提出的一个概念.简而言之.就是一个站点可以兼容多个终端--而不是为每一个终端做一个特定的版本号. 这个概念是为解决移动互 ...
- AndroidStudio快捷键大全
很多近期学习移动开发的朋友都是通过Eclipse集成ADT开发安卓程序.但是谷歌已经推出了自己的亲儿子--Android Studio.可以说比原来的开发工具强大很多,现在各大公司也已经逐渐淘汰了Ec ...
- 【高级功能】使用 Ajax
Ajax 是现代Web 应用程序开发的一项关键工具.它让你能向服务器异步发送和接收数据,然后用 Javascript 解析. Ajax 是 Asynchronous JavaScript and XM ...
- ASP.NET MVC生成安全验证码
html部分: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- quick-cocos2d-x transition使用方法
Functions transition.newEasing(action, easingName, more) 为图像创造效果 transition.execute(target, action, ...