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直接查指定的玩家,并反映很慢,就猜测是索引的问题 ...
随机推荐
- 设计模式之装饰器模式(PHP实现)
/** * 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. * 这种模式创建了一个 ...
- ubuntu 安装 regex模块时 fatal error: Python.h: No such file or directory
原因是 python-dev包没有安装 根据Py2还是py3 sudo apt-get install python-dev 或者 sudo apt-get install python3-dev 安 ...
- python scrapy简单爬虫记录(实现简单爬取知乎)
之前写了个scrapy的学习记录,只是简单的介绍了下scrapy的一些内容,并没有实际的例子,现在开始记录例子 使用的环境是python2.7, scrapy1.2.0 首先创建项目 在要建立项目的目 ...
- 【Hadoop】Hadoop mr wordcount基础
1.基本概念 2.Mapper package com.ares.hadoop.mr.wordcount; import java.io.IOException; import java.util.S ...
- CSS——display(Block none inline等)属性的用法
在一般的CSS布局制作时候,我们常常会用到display对应值有block.none.inline这三个值.下面我们来分别来认识和学习什么时候用什么值.这里通过CSS display知识加实例.图演示 ...
- 手写 jQuery 框架
1.测试页面; <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- react-native 创建 ios 项目
创建React-Native项目 打开终端输入react-native init ProjectName,这里的ProjectName可以改成你想创建的项目名称.然后有两种方法启动项目 1.从终端开启 ...
- Android 创建Listener监听器形式选择:匿名内部类?外部类?
说到监听器,第一感觉就是直接写作匿名内部类来用,可是依据单一职责原则,好像又不应该作为匿名内部类来写(由于监听中有时要写较多的逻辑代码),所曾经段时间把有共性的listener单独创建放在glut.l ...
- Android高级控件(三)—— 使用Google ZXing实现二维码的扫描和生成相关功能体系
Android高级控件(三)-- 使用Google ZXing实现二维码的扫描和生成相关功能体系 摘要 如今的二维码可谓是烂大街了.到处都是二维码.什么都是二维码,扫一扫似乎已经流行到习以为常了,今天 ...
- 使用FREDATED引擎实现跨实例訪问
跨数据库server.跨实例訪问是比較常见的一种訪问方式,在Oracle中能够通过DB LINK的方式来实现. 对于MySQL而言,有一个FEDERATED存储引擎与之相相应.相同也是通过创建一个链接 ...