您的位置:首页 > 其它

本地配置合服(工作记录)

2015-05-27 00:00 267 查看
本地配置合服
蔡剑彬 C++服务器开发工程师(caijianbin668943@163.com)
一、配置

硬件环境:X86 PC机

软件环境:Windows7、VS2010、MySql5.5、SQLyog企业版

二、实现方法

1、新建服务器

要实现合服的效果,首先得要有两个以上的服务器,现阶段的本地服务器:serverId=1,serverAddress=”127.0.0.1”,portNum=10100。现在添加一个新的服务器,新建服务器只有serverId与之前的服务器不一样,serverAddress和portNum均相同,因为在最终客户端连上的服务器还是处于本地。详细操作步骤如下:

a)、修改Legend\EXE\OFM\config_legend.xml文件,将<UpdateInfoURL>和<ChunkResURL>项删除,使客户端不从资源服务器上下载服务器入口,而是从Legend\EXE\OFM\Data\server.txt中加载服务器入口;

b)、编辑server.txt文件,复制本地服务器那一行,粘贴到文件尾,并将id修改为其他服务器入口没有使用的数字,将name命名为“本地_Ex”(名字可以任意命名);

c)、将以下4个文件的server_id修改为b)步骤中的id号:Legend\OFMGame\LegendServer\Dragon\server\build\ValidateServer\Win32\ServerConfig.ini、Legend\OFMGame\LegendServer\Dragon\server\build\GameServer\win32\ServerConfig.ini、Legend\OFMGame\LegendServer\Dragon\server\build\GateServer\Win32\ServerConfig.ini、Legend\OFMGame\LegendServer\Dragon\server\build\DBServer\Win32\spconfig.ini

重新运行服务器和客户端,点击客户端的“点击换服”,可以看到“S001-本地”和“S010-本地_Ex”(因为在b)步骤中的id设为10,故这里显示为“S010”)。此时这两个入口进入的服务器都是同一个服务器,但是只有“本地_Ex”服务器能够成功登陆,因为此时新服务器能够识别的账号均是基于server_id=10创建出来的账号,需要进一步配置数据库才能够识别基于server_id=1的账号。

2、修改数据库

玩家登陆时,会发送FLASH_MSG_CMD_LOGIN的消息,这个消息最终会调用到DBServer的处理函数Handle_DBCheckPlayer,有一个检查玩家账号所属服务器id的动作。正常情况下,如果玩家在该服务器以外的服务器注册的账号,将无法通过检查,从而登陆不上。但是程序里面是可以配置检查的id链表,通过加载玩家数据库中的gameserveraddress表数据来配置,这是合服技术的关键点。
合服中需要手动操作的部分除了新建服务器外,还有就是合并数据库。将原本的旧服务器的数据合并到一起,形成一个新的数据库。至于数据库中的主键,比如actorid、msgid、emailid、appendix以及物品id,均与服务器id挂钩(其实现算法见附录),故在合并数据时并不会冲突。 新数据库的名称在Legend\OFMGame\LegendServer\Dragon\server\build\DBServer\Win32\spconfig.ini更改。

由于这里只是配置本地合服效果,故没有合成新的数据库,而是利用原有的数据库进行配置。这里只需要配置一个地方,就是在gameserveraddress加入“本地”服务器的信息,执行指令:INSERT INTO gameserveraddress(serverindex, serveraddress, serverport) VALUES(1, ‘127.0.0.1’, 10100);将原本的服务器配置插入表中,重启服务器后,便能够实现合服效果了。

3、验证合服效果

分别在“本地”服务器和“本地_Ex”服务器中登录同一账号,分别创建3个角色。然后在数据库中执行指令:SELECT * FROM actors WHERE accounted = (SELECT cq_account.globaluser.userid FROM cq_account.globaluser WHERE account = ‘账号名’);可以看到同一个账号id有6个角色,合服成功。

三、附录

1)、角色id:
bool generalActorID(unsigned int &actorid)
{
if(m_nServerIndex <= 0)
return false;
if(m_nMaxActorID < ((m_nServerIndex<<21) & 0xFFE00000) || (m_nMaxActorID >=((m_nServerIndex << 21) | 0x001FFFFF)))
return false;
actorid = ++ m_nMaxActorID;
return true;
}


2)、帮会id:

bool generalGuildID(unsigned int& guildID)
{
if(m_nServerIndex <= 0)
return false;
if(m_nMaxGuildID < ((m_nServerIndex<<21)i & 0xFFE00000) || (m_nMaxGuildID >= ((m_nServerIndex << 21) | 0x001FFFFF)))
return false;
guildID = ++ m_nMaxGuildID;
return true;
}

3)、msg id:

bool generalMsgID(unsigned __int64& msgID)
{
unsigned __int64 iServerIndex = (unsigned __int64)m_nServerIndex;
if(iServerIndex <= 0)
return false;
if(m_nMaxMsgID < ((iServerIndex << 53) & 0xFFE0000000000000) || (m_nMaxMsgID >= ((iServerIndex << 53) | 0x01FFFFFFFFFFFFFF)))
return false;
msgID = ++m_nMaxMsgID;
return true;
}

4)、email id:

bool generalEmailID(unsigned __int64& EmailID)
{
unsigned __int64 iServerIndex = (unsigned __int64)m_nServerIndex;
if(isServerIndex <= 0)
return flase;
if(m_nMaxEmailID < ((iServerIndex << 49) & 0xFFFE000000000000) || (m_nMaxEmailID >= ((iServerIndex << 49) | 0x0001FFFFFFFFFFFF)))
return false;
EmailID = ++ m_nMaxEmailID;
return true;
}

5)、appendix id

bool generalAppendixID(unsigned __int64& AppendixId)
{
unsigned __int64 iServerIndex = (unsigned __int64)m_nServerIndex;
if(iServerIndex <= 0)
return false;
if(m_nMaxAppendixID < ((iServerIndex << 53) & 0xFFE0000000000000) || (m_nMaxAppendixID >= ((iServerIndex << 53) | 0x001FFFFFFFFFFFFF)))
return false;
AppendixId = ++m_nMaxAppendixID;
return true;
}

6)、物品id

31-0位表示物品产生的日期和时间,值短日期类型,单位是秒;

47-32位表示在一秒内的序列,每产生一个物品则序列值+1,一秒后序列值归零;

63-48位表示服务器ID。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: