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干什么的的更多相关文章

  1. LA 3231 - Fair Share

    You are given N processors and M jobs to be processed. Two processors are specified to each job. To ...

  2. 重新想象 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 ...

  3. 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 ...

  4. sendEmail报错:at /usr/share/perl5/vendor_perl/IO/Socket/SSL.pm

    sendEmail发送邮件是出现以下报错: *******************************************************************  Using the ...

  5. iOS - Share 分享/第三方登录

    1.系统方式创建分享 按照下图在 Info.plist 文件中将 Localization native development region 的值改为 China.如果不设置此项弹出的分享页面中显示 ...

  6. share登录Samba可读可写(适合虚拟机下学习使用)

    直接配置 smb.conf ( path = /etc/samba/smb.conf ). 首先,进入到 samba 文件夹: cd /etc/samba/ 备份 smb.conf: mv smb.c ...

  7. Select for update/lock in share mode 对事务并发性影响

    select for update/lock in share mode 对事务并发性影响 事务并发性理解 事务并发性,粗略的理解就是单位时间内能够执行的事务数量,常见的单位是 TPS( transa ...

  8. 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. ...

  9. Filestream/Windows Share导致Alwayson Failover失败

    最近做了一个case, 客户在ALWAYSON环境下进行failover操作, 之后所有replica上的alwayson group状态变成了resolving. 并且在执行failover的rep ...

随机推荐

  1. redis的数据类型

    redis有string,hash,list,sets.zsets几种数据类型 1.string数据类型 可包含任何数据,是二进制安全的,比如图片或者序列化的对象set key valueset na ...

  2. CentOS下MySQL忘记root密码解决方法【转载】

    1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的 状态下,其他的用户也可以任意地登录 ...

  3. Android的ADT内容助手快捷方式设置

    请注明出处:http://www.cnblogs.com/killerlegend/p/3550019.html  Written By KillerLegend 先将Word Completion的 ...

  4. 谈谈final、finally、finalize的区别

    1.final:如果一个类被final修饰,意味着该类不能派生出新的子类,不能作为父类被继承.因此一个类不能被声明为abstract,又被声明为final.将变量或方法声明为final.可以保证他们在 ...

  5. sqlalchemy - day4

    query 此文算是自己的一个总结,不敢说对sqlalchemy有多精通,只能算是入门的总结,免得后面忘记了这些个基本的东西.数据库的增,删,改,查,前面已经介绍了session的增,删,改,现在来介 ...

  6. Python 2.7的安装(64位win10)

    Python 2.7.12 下载地址:https://www.python.org/downloads/release/python-2712/ 安装路径D:\Program Files\Python ...

  7. python 遍历文件夹

    import os import os.path rootdir = “d:\data” # 指明被遍历的文件夹 for parent,dirnames,filenames in os.walk(ro ...

  8. [原创]pg_shard使用场景及功能测试

    pg_shard是一个PostgreSQL的sharding extension.可以用于Shards.Replicates tables和高可用.它可以在不修改Applications的情况下无缝分 ...

  9. [原创]PostgreSQL中十进制、二进制、十六进制之间的相互转换

    在PostgreSQL中,二进制.十进制.十六进制之间的转换是非常方便的,如下: 十进制转十六进制和二进制 mydb=# SELECT to_hex(10); to_hex -------- a (1 ...

  10. Go中的指针与函数接收器

    Go中使用*号表示指针,但是没有指针算数,不能对其进行加减.同时内存管理都由Go来负责,不需要拖动释放内存. Go中的函数接收者,可以为值类型,也可以是引用类型. 看代码: package main ...