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

本地配置合服

蔡剑彬 C++服务器开发工程师([email protected])

一、配置

硬件环境: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。

你可能感兴趣的:(本地配置合服(工作记录))