share干什么的
share到底干什么的
//--------------------打开GameServer,share中加载-------------------------
.加载nBodyID
//玩家的nBodyID表([职业][性别][nboduid])
std::vector<std::vector<int> > m_nbodyid_table;
if(!load_nbodyid())
Plug::PlugMessageBox("加载nBodyID表失败啊!"); .加载人物等级信息
//玩家等级基础信息([职业][等级][等级信息])
std::vector<std::vector<ActorLevelInfo> > m_level_info_vec;
if(!load_level_info())
Plug::PlugMessageBox("加载角色等级信息失败!"); //获取地图信息
std::map<int, MapData> m_mapdata_table;
if(!load_mapdata())
Plug::PlugMessageBox("加载地图数据失败!"); for(auto iter_map : m_mapdata_table)
{
auto& map = m_maps[iter_map.first] = NEW(Map);//创建map
map->init(get_max_gc_numb(), iter_map.second.map_path.c_str());//初始化map里面的很多东西,有待详解
map->m_get_level_info = std::bind(&Share::getLevelInfo, this, ph::_1, ph::_2, ph::_3); map->mapId = iter_map.first;
std::wstring name = L"地图";
name += boost::lexical_cast<std::wstring>(map->mapId);
onThrID(map->getThrID(), name); //获取线程ID
}
m_pDataLayer = data_layer;//用于发送包到客户端
//---------------------------上线玩家--------------------------------
m_share->add_player2(m_actor_id, mapID, m_actor_name);//需要将玩家加入到这两个容器中
void Share::add_player2(int actID, int mapID, const std::string& name)
{
m_all_player[actID] = mapID;
m_name_info[name] = actID;
}
//--------------------------玩家下线-----------------------------------
void Share::del_player2(int actor_id, const std::string& name)
{
m_all_player.erase(actor_id);//从这两个容器中删掉
m_name_info.erase(name);
} //-------------------------其他一些跨地图的操作------------------------
如:聊天,还有就是玩家切换地图的操作,等于说是share保存的是所有地图的信息,以后也会有相应的跨地图的操作放在这里面
//--------------------------最后一个最重要的操作,就是接受map中的消息--------------------
void Share::procMapSendData()
{
for(auto map : m_maps)
{
MapPkt pkt;
for (;;)
{
if(!map.second->revData(pkt))
break;
if(pkt.cmd == ms2gs_转client_cmd)
{
m_pDataLayer->send_data(pkt.channel_id, pkt.data, pkt.len);
}
else if(ms2gs_db_buff_info == pkt.cmd)
{
//玩家下线,保存数据到DB
auto channel = m_Channels[pkt.channel_id];//看来share里面保存了所有的channel信息
channel->OnSaveData(pkt.data, pkt.len); //注意:小退不断开连接
if(channel->isDisconnect())
{
//放入释放队列中,断开
push_freeQueue(channel);
m_Channels[pkt.channel_id] = NULL;
}
}
else if(ms2gs_obj_leave == pkt.cmd)//玩家切换地图
{
int tgtMapID = -;
std::stringstream ss;
ss.write((char*)pkt.data, pkt.len);
boost::archive::binary_iarchive ia(ss);
ia >> tgtMapID; //进入新地图
auto newMap = getMapByMapID(tgtMapID);
newMap->gs2msData(gs2ms_add_player/*gs2ms_obj_enter*/, pkt.channel_id , (void*)ss.str().c_str(), ss.str().size());
auto gc = m_Channels[pkt.channel_id]; //->m_map = newMap;
gc->m_map = newMap; //修改地图
m_all_player[gc->getActorID()] = tgtMapID; //放入在线玩家容器 ////激活玩家【应客户端处理】
//Protocol ptl = {0};
//ptl.cmd_type = c2s_activate_player;
//ptl.content = nullptr;
//ptl.size = 0;
//std::vector<char> buffer;
/ffer.resize(sizeof(Protocol));
//int send_len = ptl.to_buffer(&buffer[0], buffer.size());
//newMap->gs2msData(gs2ms_转client_cmd, pkt.channel_id, &buffer[0], send_len);
}
delete[] pkt.data;
pkt.data = nullptr;
}
}
}
/*share里面保存了所有的map信息,保存所有上线玩家的部分信息,所有的channel信息,我就有个疑问了为什么GameServer要继承
share,难道只是因为需要在在GS线程中处理procMapSendData(),那也不用完全继承share啊,我就去问队长,得到的回答是
GameServer管理所有的channel,而所有的channel保存在share中,所以这样就继承了,其实也不用继承share,直接把channel信息放到GameServer中也可以
这算是疑问,待我在看看*/
share干什么的的更多相关文章
- LA 3231 - Fair Share
You are given N processors and M jobs to be processed. Two processors are specified to each job. To ...
- 重新想象 Windows 8.1 Store Apps (81) - 控件增强: WebView 之加载本地 html, 智能替换 html 中的 url 引用, 通过 Share Contract 分享 WebView 中的内容, 为 WebView 截图
[源码下载] 重新想象 Windows 8.1 Store Apps (81) - 控件增强: WebView 之加载本地 html, 智能替换 html 中的 url 引用, 通过 Share Co ...
- linux下安装MySQL出错file /usr/share/mysql/charsets/latin2.xml from install of MySQL-......
linux64 red hat 6.3企业版 开始错误装了32位mysql最后怎么也装不上64mysql了,折腾了一番最后全部卸载搞定: file /etc/init.d/mysql from ins ...
- sendEmail报错:at /usr/share/perl5/vendor_perl/IO/Socket/SSL.pm
sendEmail发送邮件是出现以下报错: ******************************************************************* Using the ...
- iOS - Share 分享/第三方登录
1.系统方式创建分享 按照下图在 Info.plist 文件中将 Localization native development region 的值改为 China.如果不设置此项弹出的分享页面中显示 ...
- share登录Samba可读可写(适合虚拟机下学习使用)
直接配置 smb.conf ( path = /etc/samba/smb.conf ). 首先,进入到 samba 文件夹: cd /etc/samba/ 备份 smb.conf: mv smb.c ...
- Select for update/lock in share mode 对事务并发性影响
select for update/lock in share mode 对事务并发性影响 事务并发性理解 事务并发性,粗略的理解就是单位时间内能够执行的事务数量,常见的单位是 TPS( transa ...
- file /usr/share/mysql/... conflicts with file from package mysql-libs-5.1.73-3.el6_5.x86_ 64 MySQL安装
在CentOS 6.5安装MySQL 5.6.17,安装到最后一个rpm文件MySQL-server时 安装命令是:rpm -ivh MySQL-server-5.6.17-1.el6.x86_64. ...
- Filestream/Windows Share导致Alwayson Failover失败
最近做了一个case, 客户在ALWAYSON环境下进行failover操作, 之后所有replica上的alwayson group状态变成了resolving. 并且在执行failover的rep ...
随机推荐
- SSM框架
1.http://www.cnblogs.com/verlen11/p/5349747.html 2.Mybatis http://www.cnblogs.com/xdp-gacl/p/4261895 ...
- WebService到底是什么?(转)
一.序言 大家或多或少都听过WebService(Web服务),有一段时间很多计算机期刊.书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成分.但是不得不承认的是Web ...
- 浅谈Objective—C中的面向对象特性
Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...
- 关于HTML中,绝对定位,相对定位的理解...(学习HTML过程中的小记录)
关于HTML中,绝对定位,相对定位的理解...(学习HTML过程中的小记录) 作者:王可利(Star·星星) HTML中 相对定位:position:relative; 绝对定位:position ...
- shell括号操作符
以下以bash环境下做解说 一.单小括号() 二.双小括号(()) 可作数值条件操作,也可作数值运算使用(近似于 let 命令) 如 C 语言语法一样,支持运算符:<<.<<= ...
- Java入门到精通——基础篇之static关键字
一.概述 static 关键字是声明静态变量,静态方法用的.static的含义是属于类且不属于类对象的变量和函数. 二.static的产生. 在创建对象的时候除非用new ...
- golang:slice陷阱
slice陷阱,slice底层指向某个array,在赋值后容易导致array长期被引用而无法释放
- 海蜘蛛ISPV6.1.5,目前破解版本中最稳定的!
海蜘蛛ISPV6.1.5,目前破解版本中最稳定的! 破解步骤如下: 一.安装完毕进控制台 二.使用muddyboot登陆 密码(123456) 三.输入root回车 四.输入regtools回车 五. ...
- ExtJS MVC学习手记 2
开发环境 eclipse(indigo) ExtJS4.0 开发目标 使用store.model和controller创建菜单树 开发步骤 之前我们已经建立了一个MVC的项目框架.现在要做的就是在这个 ...
- easyui 布局自适应
最近在把以前写的一个项目改成用easyui做前端.过程中遇到了不少问题.其中一个就是datagrid不能很好的布局.想了好多办法都有局限.最后想到会不会是布局(easyui-layout)的问题,经过 ...