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. [置顶] kubernetes资源类型--RC和RS

    Replication Controller(RC) RC是K8S中的另一个核心概念,应用托管在K8S后,K8S需要保证应用能够持续运行,这是RC的工作内容. 主要功能 确保pod数量:RC用来管理正 ...

  2. 理解Hbase RowKey的字典排序;HBase Rowkey的散列与预分区设计

    HBase是三维有序存储的,是指rowkey(行键),column key(column family和qualifier)和TimeStamp(时间戳)这个三个维度是依照ASCII码表排序的. HB ...

  3. UIViewController的生命周期及iOS程序运行顺序

    当一个视图控制器被创建,并在屏幕上显示的时候. 代码的运行顺序 1. alloc                                   创建对象,分配空间 2.init (initWit ...

  4. 项目笔记:导出XML和导出全部XML功能

    前台代码: //导出一条Xml function btn_createXml(){ var title =$("#editButton").attr("title&quo ...

  5. jsp中URL传递中文參数的处理

    在页面的url中使用encodeURI(encodeURI(中文)).对中文进行编码.并在server的java程序中使用URLDecoder.decode(中文, "UTF-8" ...

  6. mysql 修复

    /home/wkubuntu/mysql/data/iZ25sgya7raZbak.pid  pid 文件notfond 错误解决 一.截图 snipingtool skip-locking 修改成 ...

  7. php 处理 form 表单提交多个 name 属性值相同的 input 标签

    一 问题 在公司的开发过程中,遇到了一个问题:如何处理 form 表单提交了多个 name 属性值相同的 input 标签?源码如下(源码是在 form 表单之中的): <!--{loop $a ...

  8. jm解决乱码问题-参数化-数据库操作-文件上传下载

    jm解决乱码问题-参数化-数据库操作-文件上传下载 如果JM出果运行结果是乱码(解决中文BODY乱码的问题) 找到JM的安装路径,例如:C:\apache-jmeter-3.1\bin 用UE打开jm ...

  9. 转 【MQTT】在Windows下搭建MQTT服务器

    MQTT简介 MQ 遥测传输 (MQTT) 是轻量级基于代理的发布/订阅的消息传输协议,设计思想是开放.简单.轻量.易于实现.这些特点使它适用于受限环境.该协议的特点有: 使用发布/订阅消息模式,提供 ...

  10. js 元素Dom新建并插入页面createElement

    纯js var o = document.createElement('script'); o.type = 'text/template'; o.id = 'demo'; document.docu ...