385 lines
11 KiB
C++
385 lines
11 KiB
C++
|
||
#include "StdAfx.h"
|
||
const CNameSyncClient::OnHandleSockPacket CNameSyncClient::NSSockPacketHandlers[] =
|
||
{
|
||
NULL,
|
||
};
|
||
|
||
CNameSyncClient::CNameSyncClient(CDBServer *lpDBEngine)
|
||
:Inherited()
|
||
{
|
||
m_pDBServer = lpDBEngine;
|
||
SetClientName(_T("名称"));
|
||
m_NewNameOperateList.setLock(&m_NewNameOperateListLock);
|
||
}
|
||
|
||
CNameSyncClient::~CNameSyncClient()
|
||
{
|
||
|
||
}
|
||
jxSrvDef::SERVERTYPE CNameSyncClient::getLocalServerType()
|
||
{
|
||
return DBServer;
|
||
}
|
||
LPCSTR CNameSyncClient::getLocalServerName()
|
||
{
|
||
return m_pDBServer->getServerName();
|
||
}
|
||
|
||
//VOID CNameSyncClient::SendRegisteClient()
|
||
//{
|
||
// SERVER_REGDATA regData;
|
||
//
|
||
// ZeroMemory( ®Data, sizeof(regData) );
|
||
// regData.GameType = SERVER_REGDATA::GT_JianXiaoJiangHu;
|
||
// regData.ServerType = getLocalServerType();
|
||
// regData.ServerIndex = m_pDBServer->getServerIndex();
|
||
// _asncpytA( regData.ServerName, m_pDBServer->getServerName() );
|
||
//
|
||
// send(®Data, sizeof(regData));
|
||
//}
|
||
/*
|
||
VOID CNameSyncClient::SendKeepAlive()
|
||
{
|
||
flushProtoPacket(allocProtoPacket(jxInterSrvComm::NameServerProto::cKeepAlive));
|
||
}
|
||
*/
|
||
|
||
|
||
VOID CNameSyncClient::OnRun()
|
||
{
|
||
INT_PTR i;
|
||
NameOperateData *pNameOP;
|
||
TICKCOUNT dwCurTick = _getTickCount();
|
||
|
||
//如果有新的名称操作数据,则发送数据并追加到操作中列表
|
||
if ( m_NewNameOperateList.count() > 0 )
|
||
{
|
||
m_NewNameOperateList.lock();
|
||
//向名称服务器发送新增加的名称操作消息
|
||
SendNewNameOperateRequest();
|
||
//将新操作的数据添加到才做中的列表中
|
||
m_NameOperatingList.addList(m_NewNameOperateList);
|
||
m_NewNameOperateList.clear();
|
||
m_NewNameOperateList.unlock();
|
||
}
|
||
|
||
//检查每个正在操作的名称请求的状态
|
||
//必须降序循环,因为列表中的数据可能被删除
|
||
for ( i=m_NameOperatingList.count()-1; i>-1; --i )
|
||
{
|
||
pNameOP = m_NameOperatingList[i];
|
||
//检查超时
|
||
if ( dwCurTick >= pNameOP->dwTimeOut )
|
||
{
|
||
NameOperateTimedOut(pNameOP);
|
||
m_NameOperatingList.remove(i);
|
||
m_Allocator.FreeBuffer(pNameOP);
|
||
}
|
||
}
|
||
}
|
||
|
||
VOID CNameSyncClient::OnDispatchRecvPacket(const jxSrvDef::INTERSRVCMD nCmd, CDataPacketReader &inPacket)
|
||
{
|
||
int nId;
|
||
NAMESERVER_OPERROR eError;
|
||
LPCSTR sName;
|
||
INT_PTR nIndex;
|
||
int nServerIndex = 0;
|
||
NameOperateData *pNameOP;
|
||
|
||
inPacket >> nServerIndex;
|
||
inPacket >> sName;
|
||
|
||
switch(nCmd)
|
||
{
|
||
case jxInterSrvComm::NameServerProto::sAllocCharId://申请角色ID返回 TODO 创角不成功,很多情况是这个 NameServer 没有返回这个协议导致的
|
||
{
|
||
pNameOP = GetNameOperatePtr(NameOperateData::noAllocCharId, sName, &nIndex,nServerIndex);
|
||
if ( pNameOP )
|
||
{
|
||
inPacket >> eError;
|
||
inPacket >> nId;
|
||
//向网关管理器投递申请角色名称返回的消息
|
||
|
||
m_pDBServer->getDataServer()->PostCreateActorResult(
|
||
pNameOP->nServerIndex, eError, nId, (PCREATEACTORDATA)pNameOP->pData);
|
||
m_NameOperatingList.remove(nIndex);
|
||
m_Allocator.FreeBuffer(pNameOP);
|
||
}
|
||
}
|
||
break;
|
||
case jxInterSrvComm::NameServerProto::sCrossAllocCharId://申请角色ID返回 TODO 创角不成功,很多情况是这个 NameServer 没有返回这个协议导致的
|
||
{
|
||
pNameOP = GetNameOperatePtr(NameOperateData::noCSAllocCharId, sName, &nIndex,nServerIndex);
|
||
if ( pNameOP )
|
||
{
|
||
inPacket >> eError;
|
||
inPacket >> nId;
|
||
//向网关管理器投递申请角色名称返回的消息
|
||
|
||
m_pDBServer->getDataServer()->PostCreateCrossServerActorResult(
|
||
pNameOP->nServerIndex, eError, nId, (PCREATEACTORDATA)pNameOP->pData);
|
||
m_NameOperatingList.remove(nIndex);
|
||
m_Allocator.FreeBuffer(pNameOP);
|
||
}
|
||
}
|
||
break;
|
||
case jxInterSrvComm::NameServerProto::sAllocGuildId://申请帮会ID返回
|
||
{
|
||
pNameOP = GetNameOperatePtr(NameOperateData::noAllocGuildId, sName, &nIndex,nServerIndex);
|
||
if ( pNameOP )
|
||
{
|
||
inPacket >> eError;
|
||
inPacket >> nId;
|
||
//使用一个包含2个INT的数组,[0]保存操作结果,[1]保存帮会ID
|
||
PINT_PTR pResult = (PINT_PTR)malloc(sizeof(*pResult) * 2);
|
||
pResult[0] = eError;
|
||
pResult[1] = nId;
|
||
//向数据服务器投递申请帮会ID返回的消息
|
||
m_pDBServer->getDataServer()->PostAllocGuildNameResult(
|
||
pNameOP->nServerIndex, pResult, pNameOP->allocGuildId.nOPIdent);
|
||
m_NameOperatingList.remove(nIndex);
|
||
m_Allocator.FreeBuffer(pNameOP);
|
||
}
|
||
}
|
||
break;
|
||
case jxInterSrvComm::NameServerProto::sRenameChar://重命名角色返回
|
||
{
|
||
pNameOP = GetNameOperatePtr(NameOperateData::noRenameChar, sName, &nIndex);
|
||
if ( pNameOP )
|
||
{
|
||
inPacket >> eError;
|
||
//向数据服务器投递角色重命名返回的消息
|
||
m_pDBServer->getDataServer()->PostRenameCharResult(pNameOP->nServerIndex,
|
||
eError, pNameOP->renameChar.nOPIdent);
|
||
m_NameOperatingList.remove(nIndex);
|
||
m_Allocator.FreeBuffer(pNameOP);
|
||
}
|
||
}
|
||
break;
|
||
case jxInterSrvComm::NameServerProto::sRenameGuild://重命名帮会返回
|
||
{
|
||
pNameOP = GetNameOperatePtr(NameOperateData::noRenameGuild, sName, &nIndex);
|
||
if ( pNameOP )
|
||
{
|
||
m_NameOperatingList.remove(nIndex);
|
||
m_Allocator.FreeBuffer(pNameOP);
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
VOID CNameSyncClient::SendNewNameOperateRequest()
|
||
{
|
||
INT_PTR i, nCount;
|
||
NameOperateData *pNameOP;
|
||
|
||
nCount = m_NewNameOperateList.count();
|
||
for ( i=0; i<nCount; ++i )
|
||
{
|
||
pNameOP = m_NewNameOperateList[i];
|
||
|
||
//构造通信数据包
|
||
switch(pNameOP->nOPType)
|
||
{
|
||
case NameOperateData::noAllocCharId://申请角色ID
|
||
{
|
||
CDataPacket &packet = allocProtoPacket(jxInterSrvComm::NameServerProto::cAllocCharId);
|
||
packet << (int)pNameOP->nServerIndex;
|
||
packet << pNameOP->sName;
|
||
flushProtoPacket(packet);
|
||
}
|
||
break;
|
||
case NameOperateData::noCSAllocCharId://申请跨服角色ID
|
||
{
|
||
CDataPacket &packet = allocProtoPacket(jxInterSrvComm::NameServerProto::cCrossAllocCharId);
|
||
packet << (int)pNameOP->nServerIndex;
|
||
packet << pNameOP->sName;
|
||
flushProtoPacket(packet);
|
||
}
|
||
break;
|
||
case NameOperateData::noAllocGuildId://申请帮会ID
|
||
{
|
||
CDataPacket &packet = allocProtoPacket(jxInterSrvComm::NameServerProto::cAllocGuildId);
|
||
packet << (int)pNameOP->nServerIndex;
|
||
packet << pNameOP->sName;
|
||
flushProtoPacket(packet);
|
||
}
|
||
break;
|
||
case NameOperateData::noRenameChar://重命名角色
|
||
{
|
||
CDataPacket &packet = allocProtoPacket(jxInterSrvComm::NameServerProto::cRenameChar);
|
||
packet << pNameOP->renameChar.nCharId;
|
||
packet << pNameOP->sName;
|
||
flushProtoPacket(packet);
|
||
}
|
||
break;
|
||
case NameOperateData::noRenameGuild://重命名帮会
|
||
{
|
||
CDataPacket &packet = allocProtoPacket(jxInterSrvComm::NameServerProto::cRenameGuild);
|
||
packet << pNameOP->guildRename.nGuildId;
|
||
packet << pNameOP->sName;
|
||
flushProtoPacket(packet);
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
CNameSyncClient::NameOperateData* CNameSyncClient::GetNameOperatePtr(
|
||
const NameOperateData::eNameOperateType eOPType, LPCSTR sName, OUT PINT_PTR lpIndex,int nServerIndex)
|
||
{
|
||
|
||
INT_PTR i;
|
||
NameOperateData *pNameOP;
|
||
|
||
//检查每个正在操作的名称请求的状态
|
||
//必须降序循环,因为列表中的数据可能被删除
|
||
for ( i=m_NameOperatingList.count()-1; i>-1; --i )
|
||
{
|
||
pNameOP = m_NameOperatingList[i];
|
||
if ( pNameOP->nOPType == eOPType && !_stricmp(sName, pNameOP->sName) &&
|
||
(nServerIndex == -1 || nServerIndex == pNameOP->nServerIndex))
|
||
{
|
||
if ( lpIndex ) *lpIndex = i;
|
||
return pNameOP;
|
||
}
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
VOID CNameSyncClient::NameOperateTimedOut(const NameOperateData* pNameOP)
|
||
{
|
||
//构造通信数据包
|
||
switch(pNameOP->nOPType)
|
||
{
|
||
case NameOperateData::noAllocCharId://申请角色ID
|
||
{
|
||
//向网关管理器投递申请角色名称返回超时的结果
|
||
/////m_pDBServer->getGateManager()->PostAllocCharIdResult(pNameOP->allocCharId.nSesionId, neTimedOut, 0);
|
||
}
|
||
break;
|
||
case NameOperateData::noAllocGuildId://申请帮会ID
|
||
{
|
||
//向数据服务器投递申请帮会ID色超时的结果
|
||
//使用一个包含2个INT_PTR的数组,[0]保存操作结果,[1]保存帮会ID
|
||
PINT_PTR pResult = (PINT_PTR)malloc(sizeof(*pResult) * 2);
|
||
pResult[0] = aeTimedOut;
|
||
pResult[1] = 0;
|
||
m_pDBServer->getDataServer()->PostAllocGuildNameResult(pNameOP->nServerIndex,
|
||
pResult, pNameOP->allocGuildId.nOPIdent);
|
||
}
|
||
break;
|
||
case NameOperateData::noRenameChar://重命名角色
|
||
{
|
||
//向数据服务器投递重命名角色超时的结果
|
||
m_pDBServer->getDataServer()->PostRenameCharResult(pNameOP->nServerIndex,
|
||
neTimedOut, pNameOP->renameChar.nOPIdent);
|
||
}
|
||
break;
|
||
case NameOperateData::noRenameGuild://重命名帮会
|
||
break;
|
||
}
|
||
}
|
||
|
||
BOOL CNameSyncClient::PostAllocateCharId(const int nSessionId, const int nServerIndex, LPCSTR sCharName,CREATEACTORDATA *pData)
|
||
{
|
||
if ( !connected() )
|
||
{
|
||
OutputMsg(rmError,"PostAllocateCharId fail, name server not connect");
|
||
return FALSE;
|
||
}
|
||
|
||
//构造名称操作数据
|
||
NameOperateData *pNameOP = (NameOperateData*)m_Allocator.AllocBuffer(sizeof(*pNameOP));
|
||
pNameOP->nOPType = NameOperateData::noAllocCharId;
|
||
pNameOP->nServerIndex = nServerIndex;
|
||
_asncpytA(pNameOP->sName, sCharName);
|
||
pNameOP->dwTimeOut = _getTickCount() + 10 * 1000;
|
||
pNameOP->allocCharId.nSesionId = nSessionId;
|
||
pNameOP->pData = (void *)pData;
|
||
|
||
//添加新的名称操作消息
|
||
m_NewNameOperateList.lock();
|
||
m_NewNameOperateList.add(pNameOP);
|
||
m_NewNameOperateList.unlock();
|
||
TRACE("%d,%d,%s",nSessionId,nServerIndex,sCharName);
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
|
||
BOOL CNameSyncClient::PostCrossServerAllocateCharId(const int nSessionId, const int nServerIndex, LPCSTR sCharName,CREATEACTORDATA *pData)
|
||
{
|
||
if ( !connected() )
|
||
{
|
||
OutputMsg(rmError,"PostCrossServerAllocateCharId fail, name server not connect");
|
||
return FALSE;
|
||
}
|
||
|
||
//构造名称操作数据
|
||
NameOperateData *pNameOP = (NameOperateData*)m_Allocator.AllocBuffer(sizeof(*pNameOP));
|
||
pNameOP->nOPType = NameOperateData::noCSAllocCharId;
|
||
pNameOP->nServerIndex = nServerIndex;
|
||
_asncpytA(pNameOP->sName, sCharName);
|
||
pNameOP->dwTimeOut = _getTickCount() + 10 * 1000;
|
||
pNameOP->allocCharId.nSesionId = nSessionId;
|
||
pNameOP->pData = (void *)pData;
|
||
|
||
//添加新的名称操作消息
|
||
m_NewNameOperateList.lock();
|
||
m_NewNameOperateList.add(pNameOP);
|
||
m_NewNameOperateList.unlock();
|
||
TRACE("%d,%d,%s",nSessionId,nServerIndex,sCharName);
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL CNameSyncClient::PostAllocateGuildId(const int nServerIndex, LPCSTR sGuildName, const UINT_PTR nOPIdent)
|
||
{
|
||
if ( !connected() )
|
||
return FALSE;
|
||
|
||
//构造名称操作数据
|
||
NameOperateData *pNameOP = (NameOperateData*)m_Allocator.AllocBuffer(sizeof(*pNameOP));
|
||
pNameOP->nOPType = NameOperateData::noAllocGuildId;
|
||
pNameOP->nServerIndex = nServerIndex;
|
||
_asncpytA(pNameOP->sName, sGuildName);
|
||
pNameOP->dwTimeOut = _getTickCount() + 10 * 1000;
|
||
pNameOP->allocGuildId.nOPIdent = nOPIdent;
|
||
|
||
//添加新的名称操作消息
|
||
m_NewNameOperateList.lock();
|
||
m_NewNameOperateList.add(pNameOP);
|
||
m_NewNameOperateList.unlock();
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL CNameSyncClient::PostCharRename(const int nCharId, const int nServerIndex, LPCSTR sNewCharName, const UINT_PTR nOPIdent)
|
||
{
|
||
if ( !connected() )
|
||
return FALSE;
|
||
|
||
//构造名称操作数据
|
||
NameOperateData *pNameOP = (NameOperateData*)m_Allocator.AllocBuffer(sizeof(*pNameOP));
|
||
pNameOP->nOPType = NameOperateData::noRenameChar;
|
||
pNameOP->nServerIndex = nServerIndex;
|
||
_asncpytA(pNameOP->sName, sNewCharName);
|
||
pNameOP->dwTimeOut = _getTickCount() + 10 * 1000;
|
||
pNameOP->renameChar.nCharId = nCharId;
|
||
pNameOP->renameChar.nOPIdent = nOPIdent;
|
||
|
||
//添加新的名称操作消息
|
||
m_NewNameOperateList.lock();
|
||
m_NewNameOperateList.add(pNameOP);
|
||
m_NewNameOperateList.unlock();
|
||
|
||
return TRUE;
|
||
}
|
||
|