1032 lines
27 KiB
C++
1032 lines
27 KiB
C++
|
|
#include "StdAfx.h"
|
|||
|
|
#define MAX_NAME_SIZE 8
|
|||
|
|
CGateDBReqestHandler::CGateDBReqestHandler()
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CGateDBReqestHandler::~CGateDBReqestHandler()
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CGateDBReqestHandler::Init(CSQLConenction *pConn, CDBDataServer *pServer)
|
|||
|
|
{
|
|||
|
|
m_pSQLConnection = pConn;
|
|||
|
|
m_pDBServer = pServer;
|
|||
|
|
if (!pConn || !pServer)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError, _T("%s Init Failed"), __FUNCTION__);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CGateDBReqestHandler::OnDeleteActor( CDataPacketReader& inPacket,ILogicDBRequestHost * pDataClient )
|
|||
|
|
{
|
|||
|
|
DECLARE_FUN_TIME_PROF()
|
|||
|
|
//首先判断网关用户是否通过查询角色消息设定了全局会话ID和帐号
|
|||
|
|
|
|||
|
|
|
|||
|
|
int nError =0;
|
|||
|
|
|
|||
|
|
unsigned int nAccountId =0;
|
|||
|
|
int nRawServerId=0; //原始的服务器编号
|
|||
|
|
int nServerId =0; //当前的服务器编号
|
|||
|
|
UINT64 lKey =0;
|
|||
|
|
BYTE bGateIndex =0;
|
|||
|
|
unsigned int nActorId =0;
|
|||
|
|
|
|||
|
|
//读出玩家的账户id,服务器id 以及在逻辑网关的key
|
|||
|
|
inPacket >> nRawServerId >>nServerId >> bGateIndex >> lKey >> nAccountId >> nActorId;
|
|||
|
|
char accountName[jxSrvDef::ACCOUNT_NAME_BUFF_LENGTH]; //账户名称
|
|||
|
|
inPacket.readString(accountName,sizeof(accountName));
|
|||
|
|
//数据库连接是否就绪
|
|||
|
|
if ( !m_pSQLConnection->Connected() )
|
|||
|
|
{
|
|||
|
|
nError = ERR_SQL_NOT_CONNECT;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
MYSQL_ROW pRow;
|
|||
|
|
nError = m_pSQLConnection->Query(szSQLSP_SelecteGuildData,nActorId);
|
|||
|
|
bool errFlag = false;
|
|||
|
|
if ( !nError )
|
|||
|
|
{
|
|||
|
|
pRow = m_pSQLConnection->CurrentRow();
|
|||
|
|
if (pRow && pRow[0] && atoi(pRow[0]) >=1)
|
|||
|
|
{
|
|||
|
|
nError = ERR_GUILD;
|
|||
|
|
}
|
|||
|
|
m_pSQLConnection->ResetQuery();
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
nError = ERR_SQL; //执行sql错误
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
if(nError == 0)
|
|||
|
|
{
|
|||
|
|
//查询数据库
|
|||
|
|
char szSql[100];
|
|||
|
|
sprintf(szSql,szSQLSP_ClientDeleteCharactor,nActorId,accountName);
|
|||
|
|
nError = m_pSQLConnection->RealExec(szSql,strlen(szSql));
|
|||
|
|
if (nError != 0)
|
|||
|
|
{
|
|||
|
|
nError =ERR_SQL;//-1是错误码
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
m_pSQLConnection->ResetQuery();
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
char szAn[32];
|
|||
|
|
sprintf(szAn,"%d",ReqData.Actoid);
|
|||
|
|
|
|||
|
|
m_pDBServer->getLogClient()->SendLoginLog(ltDelActor,pGateUser->nGlobalSessionId,pGateUser->sAccount,
|
|||
|
|
pGateUser->sIPAddr,szAn);//最后的描述字段保存用户删除的角色id
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
//OutputMsg( rmTip, _T("发送删除角色列表回应包!,用户id:%d,角色:%d,错误码:0"),pGateUser->nGlobalSessionId,ReqData.Actoid);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//向客户端发包
|
|||
|
|
CDataPacket &retPack= pDataClient->AllocDataPacket(dcDeleteActor);
|
|||
|
|
|
|||
|
|
retPack << nRawServerId << nServerId << bGateIndex <<lKey << nActorId << (BYTE)nError ;//合并起来
|
|||
|
|
pDataClient->FlushDataPacket(retPack);//下发数据
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CGateDBReqestHandler::OnRecvLoginMsg(const jxSrvDef::INTERSRVCMD nCmd, CDataPacketReader& inPacket,ILogicDBRequestHost * pDataClient)
|
|||
|
|
{
|
|||
|
|
if(dcGetActorList ==nCmd)
|
|||
|
|
{
|
|||
|
|
unsigned int nAccountId =0;
|
|||
|
|
int nRawServerId=0; //原始的服务器编号
|
|||
|
|
int nServerId =0; //当前的服务器编号
|
|||
|
|
UINT64 lKey =0;
|
|||
|
|
BYTE bGateIndex =0;
|
|||
|
|
|
|||
|
|
//读出玩家的账户id,服务器id 以及在逻辑网关的key
|
|||
|
|
inPacket >>nRawServerId >>nServerId >> bGateIndex >> lKey >> nAccountId;
|
|||
|
|
|
|||
|
|
CDataPacket &retPack= pDataClient->AllocDataPacket(nCmd);
|
|||
|
|
retPack << nRawServerId <<nServerId << bGateIndex <<lKey << nAccountId ;//合并起来
|
|||
|
|
GetActorList(nAccountId,nRawServerId,retPack);
|
|||
|
|
//GetActorSecondPsw(nAccountId,nRawServerId,retPack);
|
|||
|
|
pDataClient->FlushDataPacket(retPack);//下发数据
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else if( dcCreateActor == nCmd) //创建角色
|
|||
|
|
{
|
|||
|
|
OnCreateActor(inPacket,pDataClient);
|
|||
|
|
}
|
|||
|
|
else if(dcDeleteActor == nCmd)
|
|||
|
|
{
|
|||
|
|
OnDeleteActor(inPacket,pDataClient);
|
|||
|
|
}
|
|||
|
|
else if(dcGetRandName ==nCmd)
|
|||
|
|
{
|
|||
|
|
OnRandName(inPacket,pDataClient); //随机一下名字
|
|||
|
|
}
|
|||
|
|
else if(dcChangeActorName == nCmd) //玩家改名字
|
|||
|
|
{
|
|||
|
|
OnChaneActorNameToDb(inPacket,pDataClient);
|
|||
|
|
}
|
|||
|
|
else if(dcCheckSecondPsw == nCmd)
|
|||
|
|
{
|
|||
|
|
OnCheckSecondPsw(inPacket,pDataClient);
|
|||
|
|
}
|
|||
|
|
else if( dcCreateSecondPsw == nCmd )
|
|||
|
|
{
|
|||
|
|
OnCreateSecondPsw(inPacket,pDataClient);
|
|||
|
|
}
|
|||
|
|
else if(dcGetCSActorId == nCmd)
|
|||
|
|
{
|
|||
|
|
QueryCrossServerActor(inPacket,pDataClient);
|
|||
|
|
}
|
|||
|
|
else if(dcCreateCSActorId == nCmd)
|
|||
|
|
{
|
|||
|
|
CreateCrossServerActor(inPacket,pDataClient);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
void CGateDBReqestHandler::OnCreateActor( CDataPacketReader& inPacket,ILogicDBRequestHost * pDataClient )
|
|||
|
|
{
|
|||
|
|
DECLARE_FUN_TIME_PROF()
|
|||
|
|
INT_PTR resultCode = NOERR;
|
|||
|
|
|
|||
|
|
BYTE bGateIndex =0;
|
|||
|
|
Uint64 lKey=0;
|
|||
|
|
int nRawServerId =0;
|
|||
|
|
int nServerId =0;
|
|||
|
|
unsigned int nAccountId=0;
|
|||
|
|
int nLastRandNameIndex =-1;
|
|||
|
|
|
|||
|
|
inPacket >> nRawServerId >> nServerId >> bGateIndex >> lKey >>nAccountId; //读入数据
|
|||
|
|
unsigned long long sip =0; //地址
|
|||
|
|
inPacket >> sip;
|
|||
|
|
|
|||
|
|
char actorName[jxSrvDef::ACTOR_NAME_BUFF_LENGTH]; //角色名称
|
|||
|
|
char accountName[jxSrvDef::ACCOUNT_NAME_BUFF_LENGTH]; //账户名称
|
|||
|
|
|
|||
|
|
char strToken[jxSrvDef::MAX_TOKEN_LENGTH];
|
|||
|
|
|
|||
|
|
INT_PTR nActorCount = ArrayCount(actorName);
|
|||
|
|
inPacket.readString(actorName,nActorCount);
|
|||
|
|
|
|||
|
|
|
|||
|
|
BYTE sex =0,job=0,icon=0,zy=0;
|
|||
|
|
BYTE nEnterId = 0;
|
|||
|
|
int nAdID = 0;
|
|||
|
|
|
|||
|
|
//要改成小写
|
|||
|
|
//m_pDBServer->GetDBEngine()->LowerCaseNameStr(actorName,nActorCount);
|
|||
|
|
|
|||
|
|
INT_PTR nLen = CDBServer::GetStrLenUtf8(actorName);
|
|||
|
|
|
|||
|
|
//读取账户名字
|
|||
|
|
INT_PTR nAccountCount = ArrayCount(accountName);
|
|||
|
|
inPacket.readString(accountName,nAccountCount);
|
|||
|
|
|
|||
|
|
if ( nLen <= 0 || nLen > MAX_NAME_SIZE || !m_pDBServer->GetDBEngine()->CheckNameStr(actorName))
|
|||
|
|
{
|
|||
|
|
resultCode = jxInterSrvComm::NameServerProto::neInvalidName;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
inPacket >> sex;
|
|||
|
|
inPacket >> job;
|
|||
|
|
inPacket >> zy;
|
|||
|
|
inPacket >> icon;
|
|||
|
|
inPacket >>nLastRandNameIndex;
|
|||
|
|
|
|||
|
|
inPacket.readString(strToken,ArrayCount(strToken));
|
|||
|
|
strToken[sizeof(strToken)-1] = 0;
|
|||
|
|
|
|||
|
|
inPacket >> nAdID;
|
|||
|
|
inPacket >> nEnterId;
|
|||
|
|
BYTE bCanCreate = 1;
|
|||
|
|
inPacket >> bCanCreate;
|
|||
|
|
|
|||
|
|
|
|||
|
|
// 检测阵营合法性
|
|||
|
|
bool zyVali = true;
|
|||
|
|
if (zy < 0 || zy > 3)
|
|||
|
|
{
|
|||
|
|
zyVali = false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if ( !zyVali )//选择的阵营必须是之前服务器下发给他的
|
|||
|
|
{
|
|||
|
|
resultCode = ERR_ZY;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
/*
|
|||
|
|
if (zy == 0)//如果是选了随机,则给个最少人选的阵营
|
|||
|
|
{
|
|||
|
|
resultCode = QueryZYReq(nRawServerId);
|
|||
|
|
}
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
|
|||
|
|
if (job <= enVocNone || job >= enMaxVocCount )
|
|||
|
|
{
|
|||
|
|
resultCode = ERR_JOB;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
if(!bCanCreate)
|
|||
|
|
{
|
|||
|
|
//第一个创建的角色,阵营是不能选择的,只能分配个最少人选的
|
|||
|
|
if (QueryActorCount(nAccountId,nRawServerId) <= 0)
|
|||
|
|
{
|
|||
|
|
resultCode = jxInterSrvComm::NameServerProto::neDBlimitCreate;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (resultCode == NOERR)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
if (m_pDBServer->GetJobZyMgr()->IsActorNameExist(actorName,-1) )
|
|||
|
|
{
|
|||
|
|
resultCode = jxInterSrvComm::NameServerProto::neNameinuse;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (resultCode != NOERR)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
|
|||
|
|
OutputMsg(rmError, _T("Create Actor Failed, code=%d,name=%s"), (int)resultCode,actorName);
|
|||
|
|
//发给玩家出错
|
|||
|
|
CDataPacket &retPack= pDataClient->AllocDataPacket(dcCreateActor);
|
|||
|
|
retPack <<nRawServerId << nServerId;
|
|||
|
|
|
|||
|
|
retPack << bGateIndex <<lKey << (unsigned int)0 <<(BYTE)resultCode ;
|
|||
|
|
pDataClient->FlushDataPacket(retPack);
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
//GetActorList(nAccountId,nServerId,retPack);
|
|||
|
|
|
|||
|
|
|
|||
|
|
//OutputMsg( rmTip, _T("create actor error!actorid:%d,actorname:%s,error:%d"),Resp.ActorId,ReqData->ActorName,Resp.Ret);
|
|||
|
|
//m_Allocator.FreeBuffer(ReqData);
|
|||
|
|
//return &Packet;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//OutputMsg(rmTip,_T("post alloc name msg to nameserver!name=%s"),ReqData->ActorName);
|
|||
|
|
|
|||
|
|
CREATEACTORDATA *pData= new(CREATEACTORDATA);
|
|||
|
|
if(pData ==NULL)
|
|||
|
|
{
|
|||
|
|
OutputMsg( rmError, _T("alloc CREATEACTORDATA memery fail "));
|
|||
|
|
return ;
|
|||
|
|
}
|
|||
|
|
strncpy(pData->actorName,actorName,nActorCount);
|
|||
|
|
strncpy(pData->accountName,accountName,nAccountCount);
|
|||
|
|
|
|||
|
|
if(!strToken)
|
|||
|
|
{
|
|||
|
|
strncpy(pData->strToken,"",ArrayCount(pData->strToken));
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
strncpy(pData->strToken,strToken,ArrayCount(strToken));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
pData->icon = icon;
|
|||
|
|
pData->job =job;
|
|||
|
|
pData->lKey =lKey;
|
|||
|
|
pData->nGateIndex = bGateIndex;
|
|||
|
|
pData->nServerIndex = nServerId;
|
|||
|
|
pData->sex = sex;
|
|||
|
|
pData->zy= zy;
|
|||
|
|
pData->lIp = sip; //通过逻辑服把ip发过来
|
|||
|
|
pData->nAccountId = nAccountId;
|
|||
|
|
pData->nLastRandNameIndex = nLastRandNameIndex;
|
|||
|
|
pData->nAdId = nAdID;
|
|||
|
|
pData->nRawServerindex = nRawServerId;
|
|||
|
|
|
|||
|
|
// 向名称服务器查询该名字是否可用
|
|||
|
|
m_pDBServer->GetDBEngine()->getNameSyncClient()->PostAllocateCharId(nAccountId,nRawServerId,actorName,pData);
|
|||
|
|
|
|||
|
|
// 保存创建角色所需要的数据
|
|||
|
|
//((CDBGateUser*)pGateUser)->pCreateCharStruct = ReqData;
|
|||
|
|
|
|||
|
|
//保存到日志服务器
|
|||
|
|
/*
|
|||
|
|
m_pDBServer->getLogClient()->SendLoginLog(ltCreateActor,pGateUser->nGlobalSessionId,pGateUser->sAccount,
|
|||
|
|
pGateUser->sIPAddr,ReqData->ActorName);//最后的描述字段保存用户申请的角色名称
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//处理名字服务器的返回
|
|||
|
|
VOID CGateDBReqestHandler::OnCreateActorResult( INT_PTR nError,unsigned int nActorId,PCREATEACTORDATA pData,ILogicDBRequestHost * pDataClient)
|
|||
|
|
{
|
|||
|
|
if (!pData || ArrayCount(pData->actorName) > jxSrvDef::ACTOR_NAME_BUFF_LENGTH )
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError,_T("OnCreateActorResult NULL"));
|
|||
|
|
delete pData;
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
char szSql[500];
|
|||
|
|
|
|||
|
|
//名称服务器返回正确结果,才执行插入数据库操作
|
|||
|
|
if (nError == jxInterSrvComm::NameServerProto::neSuccess)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
unsigned long long sip = pData->lIp;
|
|||
|
|
sprintf_s(szSql,sizeof(szSql),szSQLSP_ClientCreateNewCharactor,pData->nAccountId,pData->accountName,
|
|||
|
|
sip,
|
|||
|
|
nActorId,pData->actorName,pData->icon,pData->sex,pData->job,pData->zy,pData->nServerIndex,pData->strToken,pData->nAdId);
|
|||
|
|
nError = m_pSQLConnection->RealExec(szSql,strlen(szSql));
|
|||
|
|
if (nError == 0)
|
|||
|
|
{
|
|||
|
|
m_pSQLConnection->ResetQuery();
|
|||
|
|
m_pDBServer->GetJobZyMgr()->OnNewPlayerCreated(pData->nServerIndex, (tagZhenying)pData->zy,(tagActorVocation)pData->job,pData->actorName);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmWaning,"%s call fail",szSql);
|
|||
|
|
nError = ERR_SQL;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (nError != 0)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError, _T("Create Actor Failed, code=%d,actorid=%u,name =%s"), (int)nError,nActorId,pData->actorName);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
CDataPacket& retPack = pDataClient->AllocDataPacket(dcCreateActor);
|
|||
|
|
retPack << pData->nRawServerindex << pData->nServerIndex ;
|
|||
|
|
|
|||
|
|
retPack << (BYTE)pData->nGateIndex;
|
|||
|
|
retPack << pData->lKey;
|
|||
|
|
retPack << (unsigned int)nActorId;
|
|||
|
|
retPack << (BYTE)nError;//角色id
|
|||
|
|
pDataClient->FlushDataPacket(retPack);
|
|||
|
|
|
|||
|
|
//OutputMsg( rmTip, _T("send create actor response!actorid:%d,actorname:%s,errcode:%d"),Resp.ActorId,data->ActorName,Resp.Ret);
|
|||
|
|
|
|||
|
|
delete pData; //把这个内存删除掉
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
//处理名字服务器的返回
|
|||
|
|
VOID CGateDBReqestHandler::OnCreateCrossServerActorResult( INT_PTR nError,unsigned int nActorId,PCREATEACTORDATA pData,ILogicDBRequestHost * pDataClient)
|
|||
|
|
{
|
|||
|
|
if (!pData || ArrayCount(pData->actorName) > jxSrvDef::ACTOR_NAME_BUFF_LENGTH )
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError,_T("OnCreateActorResult NULL"));
|
|||
|
|
delete pData;
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
char szSql[500] = {0};
|
|||
|
|
|
|||
|
|
//名称服务器返回正确结果,才执行插入数据库操作
|
|||
|
|
if (nError == jxInterSrvComm::NameServerProto::neSuccess)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
unsigned long long sip = pData->lIp;
|
|||
|
|
sprintf_s(szSql,sizeof(szSql),szSQLSP_CrateCrossServerCharactor,pData->nAccountId,pData->accountName,
|
|||
|
|
sip,
|
|||
|
|
nActorId,pData->actorName,pData->icon,pData->sex,pData->job,pData->zy,pData->nServerIndex,pData->strToken,pData->nAdId);
|
|||
|
|
nError = m_pSQLConnection->RealExec(szSql,strlen(szSql));
|
|||
|
|
OutputMsg(rmTip,_T("OnCreateCrossServerActorResult:%s"),szSql);
|
|||
|
|
if (nError == 0)
|
|||
|
|
{
|
|||
|
|
m_pSQLConnection->ResetQuery();
|
|||
|
|
m_pDBServer->GetJobZyMgr()->OnNewPlayerCreated(pData->nServerIndex, (tagZhenying)pData->zy,(tagActorVocation)pData->job,pData->actorName);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmWaning,"%s call fail",szSql);
|
|||
|
|
nError = ERR_SQL;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (nError != 0)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError, _T("Create Actor Failed, code=%d,actorid=%u,name =%s"), (int)nError,nActorId,pData->actorName);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
OutputMsg(rmTip,_T("[CrossLogin 6] OnCreateCrossServerActorResult :%d, nActorId:%d"),(int)pData->lKey,nActorId);
|
|||
|
|
CDataPacket& retPack = pDataClient->AllocDataPacket(dcCreateCSActorId);
|
|||
|
|
retPack << pData->nServerIndex << pData->nRawServerindex ;
|
|||
|
|
retPack << (int)pData->lKey;
|
|||
|
|
retPack << (BYTE)nError;//角色id
|
|||
|
|
retPack << (unsigned int)nActorId;
|
|||
|
|
pDataClient->FlushDataPacket(retPack);
|
|||
|
|
|
|||
|
|
//OutputMsg( rmTip, _T("send create actor response!actorid:%d,actorname:%s,errcode:%d"),Resp.ActorId,data->ActorName,Resp.Ret);
|
|||
|
|
|
|||
|
|
delete pData; //把这个内存删除掉
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
void CGateDBReqestHandler::OnRandName( CDataPacketReader& inPacket,ILogicDBRequestHost * pDataClient )
|
|||
|
|
{
|
|||
|
|
DECLARE_FUN_TIME_PROF()
|
|||
|
|
|
|||
|
|
INT_PTR index = 1;
|
|||
|
|
|
|||
|
|
BYTE bGateIndex =0,bSex =0;
|
|||
|
|
Uint64 lKey=0;
|
|||
|
|
int nRawServerId =0,nServerindex=0;
|
|||
|
|
//读取性别
|
|||
|
|
inPacket >> nRawServerId >>nServerindex >> bGateIndex >> lKey >>bSex;
|
|||
|
|
INT_PTR resultCode = NOERR;
|
|||
|
|
char sActorName[32];
|
|||
|
|
|
|||
|
|
CDBServer* pDbServer = m_pDBServer->GetDBEngine();
|
|||
|
|
|
|||
|
|
//DECLARE_TIME_PROF("RandNameReq_GetRandomName");
|
|||
|
|
|
|||
|
|
if (!m_pSQLConnection->Connected())
|
|||
|
|
{
|
|||
|
|
resultCode = ERR_SQL_NOT_CONNECT;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
while(true)
|
|||
|
|
{
|
|||
|
|
if(!pDbServer->GetRandomGroupName(sActorName, ArrayCount(sActorName)))
|
|||
|
|
{
|
|||
|
|
resultCode = ERR_NORANDOMNAME;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
//index = pDbServer->GetRandomName(sActorName,bSex);
|
|||
|
|
//if (index < 0)
|
|||
|
|
//{
|
|||
|
|
// resultCode = ERR_NORANDOMNAME;
|
|||
|
|
// break;
|
|||
|
|
//}
|
|||
|
|
//// 如果此名字属于屏蔽字,过滤掉
|
|||
|
|
//if (pDbServer->hasFilterWordsInclude(sActorName))
|
|||
|
|
//{
|
|||
|
|
// OutputMsg(rmTip,"name =%s has filtername",sActorName);
|
|||
|
|
// pDbServer->AllocRandomName(index, bSex);
|
|||
|
|
// continue;
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
//查找本地数据库有没有这个名字
|
|||
|
|
//查找本地库是否存在这个名字
|
|||
|
|
if ( !m_pDBServer->GetJobZyMgr()->IsActorNameExist((char*)sActorName,-1) )
|
|||
|
|
{
|
|||
|
|
//OutputMsg(rmNormal,_T("alloc name[%s],serverid=%d"),sActorName,(int)nRawServerId);
|
|||
|
|
break; //找到了
|
|||
|
|
}
|
|||
|
|
else //查询失败
|
|||
|
|
{
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//如果是成功的,就返回这个
|
|||
|
|
CDataPacket &retPack= pDataClient->AllocDataPacket(dcGetRandName);
|
|||
|
|
retPack << nRawServerId << nServerindex << bGateIndex <<lKey << (int)index <<(BYTE)resultCode <<bSex;
|
|||
|
|
if(resultCode == NOERR)
|
|||
|
|
{
|
|||
|
|
retPack.writeString(sActorName);
|
|||
|
|
}
|
|||
|
|
pDataClient->FlushDataPacket(retPack);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
void CGateDBReqestHandler::GetActorList(const unsigned int nAccountId, const int nServerId,CDataPacket &packet )
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
DECLARE_FUN_TIME_PROF()
|
|||
|
|
|
|||
|
|
|
|||
|
|
char szSql[256];
|
|||
|
|
OutputMsg(rmNormal, _T("Start GetActorList nAccountId[%u] nServerId[%d]"), nAccountId,nServerId);
|
|||
|
|
sprintf(szSql, szSQLSP_LoadActorListByAccountId, nAccountId, nServerId);
|
|||
|
|
int nError = m_pSQLConnection->Query(szSql);
|
|||
|
|
|
|||
|
|
if (nError != 0)
|
|||
|
|
{
|
|||
|
|
packet << (char)ERR_SQL; //-1是错误码
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
INT_PTR nActorCount = m_pSQLConnection->GetRowCount();
|
|||
|
|
MYSQL_ROW pRow = m_pSQLConnection->CurrentRow();
|
|||
|
|
packet << (char)nActorCount;
|
|||
|
|
|
|||
|
|
INT_PTR nLastActor = 0;
|
|||
|
|
INT_PTR nIndex = 0;
|
|||
|
|
while ( pRow )
|
|||
|
|
{
|
|||
|
|
Actors actor;
|
|||
|
|
sscanf(pRow[0], "%d", &(actor.ActorId));
|
|||
|
|
_asncpytA(actor.ActorName, pRow[1]);
|
|||
|
|
actor.Icon = _StrToInt(pRow[2]);
|
|||
|
|
sscanf(pRow[3], "%d", &(actor.Sex));
|
|||
|
|
sscanf(pRow[4], "%d", &(actor.Level));
|
|||
|
|
sscanf(pRow[5], "%d", &(actor.Circle));
|
|||
|
|
sscanf(pRow[6], "%d", &(actor.Job));
|
|||
|
|
int status = 0;
|
|||
|
|
sscanf(pRow[8], "%d", &status);
|
|||
|
|
actor.Zy = _StrToInt(pRow[9]);
|
|||
|
|
|
|||
|
|
if( pRow[10] ) //要判断下是否为空
|
|||
|
|
{
|
|||
|
|
_asncpytA(actor.GuildName, pRow[10]);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
_asncpytA(actor.GuildName, "");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Write data to packet
|
|||
|
|
packet << (UINT)actor.ActorId;
|
|||
|
|
packet.writeString(actor.ActorName);
|
|||
|
|
packet << (char)actor.Icon;
|
|||
|
|
packet << (char)actor.Sex;
|
|||
|
|
packet << (short)actor.Level;
|
|||
|
|
packet << (short)actor.Circle;
|
|||
|
|
packet << (char)actor.Job;
|
|||
|
|
packet << (char)actor.Zy;
|
|||
|
|
packet << (char)status;
|
|||
|
|
packet.writeString(actor.GuildName);
|
|||
|
|
|
|||
|
|
// 如果第三位是1,表示这个是上次登陆的角色
|
|||
|
|
status = (status >> 2) & 1 ;
|
|||
|
|
if (1 == status)
|
|||
|
|
{
|
|||
|
|
nLastActor = nIndex;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
pRow = m_pSQLConnection->NextRow();
|
|||
|
|
nIndex++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
m_pSQLConnection->ResetQuery();
|
|||
|
|
|
|||
|
|
|
|||
|
|
packet << (BYTE)nLastActor;
|
|||
|
|
packet << (BYTE)QueryLessJobReq(nServerId);
|
|||
|
|
BYTE nCamp = 1;
|
|||
|
|
if (nActorCount <= 0)
|
|||
|
|
{
|
|||
|
|
packet << (WORD)7;
|
|||
|
|
packet <<(BYTE)1;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// 获取可选的阵营列表
|
|||
|
|
packet <<(WORD)1;
|
|||
|
|
packet <<(BYTE)1; // 这里的1是无效的,防止读错
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
BYTE btCode = 0;
|
|||
|
|
sprintf(szSql, szSQLSP_LoadAccountPsw, nAccountId, nServerId);
|
|||
|
|
nError = m_pSQLConnection->Query(szSql);
|
|||
|
|
if ( nError != 0 )
|
|||
|
|
{
|
|||
|
|
packet << (BYTE)btCode;
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
pRow = m_pSQLConnection->CurrentRow();
|
|||
|
|
if ( pRow && pRow[0] && strlen(pRow[0]) > 30)
|
|||
|
|
{
|
|||
|
|
btCode = 3;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
btCode = 0;
|
|||
|
|
}
|
|||
|
|
packet << (BYTE)btCode;
|
|||
|
|
m_pSQLConnection->ResetQuery();
|
|||
|
|
OutputMsg(rmNormal, _T("End GetActorList nAccountId[%u], nIndex[%d], nLastActor[%d]"), nAccountId,nIndex,nLastActor);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int CGateDBReqestHandler::StartEnterGame(const int nServerId,
|
|||
|
|
const int nRawServerId,
|
|||
|
|
const unsigned int nAccountId,
|
|||
|
|
const unsigned int nActorId,
|
|||
|
|
const char *szAccount,
|
|||
|
|
LONGLONG nIP)
|
|||
|
|
{
|
|||
|
|
// 验证登录逻辑服务器是否合法。防止玩家随意登录服务器
|
|||
|
|
int nLastLoginServerId = 0;
|
|||
|
|
int nError = m_pSQLConnection->Query(szSQLSP_QueryActorLastLoginServerId,
|
|||
|
|
nActorId,
|
|||
|
|
nAccountId,
|
|||
|
|
nRawServerId);
|
|||
|
|
if (nError)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError, _T("查询角色[actorid=%u accountid=%u rawserverid=%d]上次登录服务器ID失败,错误码:%d"),
|
|||
|
|
nActorId, nAccountId, nRawServerId, nError);
|
|||
|
|
return nError;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (m_pSQLConnection->GetRowCount() >= 1)
|
|||
|
|
{
|
|||
|
|
MYSQL_ROW pRow = m_pSQLConnection->CurrentRow();
|
|||
|
|
sscanf(pRow[0], "%d", &nLastLoginServerId);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
nError = ERR_SQL;
|
|||
|
|
}
|
|||
|
|
m_pSQLConnection->ResetQuery();
|
|||
|
|
if (ERR_SQL == nError)
|
|||
|
|
{
|
|||
|
|
return nError;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 角色只能登录原始服务器以及上次登录的服务器
|
|||
|
|
if (nLastLoginServerId != 0)
|
|||
|
|
{
|
|||
|
|
if (nServerId != nLastLoginServerId && nServerId != nRawServerId)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError,
|
|||
|
|
_T("%s 角色[actorid=%u, accountid=%u]选择服务器错误[rserverid:%d, curloginserverid:%d, lastloginserverid:%d],可能是客户端攻击行为!"),
|
|||
|
|
__FUNCTION__,
|
|||
|
|
nActorId,
|
|||
|
|
nAccountId,
|
|||
|
|
nRawServerId,
|
|||
|
|
nLastLoginServerId,
|
|||
|
|
nServerId);
|
|||
|
|
return ERR_SELSERVER;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
nError = m_pSQLConnection->Query(szSQLSP_ClientStartPlay,
|
|||
|
|
nServerId,
|
|||
|
|
nActorId,
|
|||
|
|
szAccount,
|
|||
|
|
nAccountId,
|
|||
|
|
nIP);
|
|||
|
|
if (!nError)
|
|||
|
|
{
|
|||
|
|
MYSQL_ROW pRow = m_pSQLConnection->CurrentRow();
|
|||
|
|
if (pRow[0] && _StrToInt(pRow[0]))
|
|||
|
|
{
|
|||
|
|
nError = NOERR;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
nError = ERR_NOUSER;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
m_pSQLConnection->ResetQuery();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return nError;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int CGateDBReqestHandler::QueryLessJobReq(const int nServerId)
|
|||
|
|
{
|
|||
|
|
int job = 1;
|
|||
|
|
if(m_pDBServer)
|
|||
|
|
{
|
|||
|
|
job = m_pDBServer->GetJobZyMgr()->GetPriorityJob(nServerId);
|
|||
|
|
}
|
|||
|
|
return job;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int CGateDBReqestHandler::QueryZyList(const int nServerId)
|
|||
|
|
{
|
|||
|
|
int result = 7;
|
|||
|
|
|
|||
|
|
if(m_pDBServer)
|
|||
|
|
{
|
|||
|
|
result = m_pDBServer->GetJobZyMgr()->GetOptionalZy(nServerId);
|
|||
|
|
}
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
tagZhenying CGateDBReqestHandler::QueryZYReq(const int nServerId)
|
|||
|
|
{
|
|||
|
|
tagZhenying camp = zyWuJi;
|
|||
|
|
if(m_pDBServer)
|
|||
|
|
{
|
|||
|
|
camp = m_pDBServer->GetJobZyMgr()->GetPriorityZY(nServerId);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return camp;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CGateDBReqestHandler::OnChaneActorNameToDb(CDataPacketReader & inPacket,ILogicDBRequestHost * pDataClient)
|
|||
|
|
{
|
|||
|
|
DECLARE_FUN_TIME_PROF()
|
|||
|
|
int nRawServerId = 0, nServerId = 0;
|
|||
|
|
unsigned int nActorId = 0;
|
|||
|
|
inPacket >> nRawServerId >> nServerId >> nActorId;
|
|||
|
|
|
|||
|
|
CUserItem::ItemSeries series ;
|
|||
|
|
inPacket >> series.llId;
|
|||
|
|
char actorName[32];
|
|||
|
|
inPacket.readString(actorName,ArrayCount(actorName));
|
|||
|
|
|
|||
|
|
char sName[32];
|
|||
|
|
inPacket.readString(sName,ArrayCount(sName));
|
|||
|
|
|
|||
|
|
INT_PTR resultCode = NOERR;
|
|||
|
|
|
|||
|
|
//要改成小写
|
|||
|
|
//m_pDBServer->GetDBEngine()->LowerCaseNameStr(actorName,ArrayCount(actorName));
|
|||
|
|
|
|||
|
|
INT_PTR nLen = CDBServer::GetStrLenUtf8(actorName);
|
|||
|
|
|
|||
|
|
if ( nLen <= 0 || nLen > MAX_NAME_SIZE || !m_pDBServer->GetDBEngine()->CheckNameStr(actorName))
|
|||
|
|
{
|
|||
|
|
resultCode = jxInterSrvComm::NameServerProto::neInvalidName;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (resultCode == NOERR)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
if (m_pDBServer->GetJobZyMgr()->IsActorNameExist(actorName,-1))
|
|||
|
|
{
|
|||
|
|
resultCode = jxInterSrvComm::NameServerProto::neNameinuse;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (resultCode == NOERR)
|
|||
|
|
{
|
|||
|
|
int nError = m_pSQLConnection->Exec(szSQLSP_ChangeActorName,actorName,nActorId,nServerId);
|
|||
|
|
if(!nError)
|
|||
|
|
{
|
|||
|
|
m_pSQLConnection->ResetQuery();
|
|||
|
|
|
|||
|
|
m_pDBServer->GetJobZyMgr()->ChangeNameToList(actorName,sName,nServerId);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CDataPacket& retPack = pDataClient->AllocDataPacket(dcChangeActorName);
|
|||
|
|
retPack << (int)nRawServerId <<(int)nServerId << (unsigned int)nActorId;
|
|||
|
|
retPack << (BYTE)resultCode << (LONG64)series.llId;
|
|||
|
|
retPack.writeString(actorName?actorName:"");
|
|||
|
|
pDataClient->FlushDataPacket(retPack);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CGateDBReqestHandler::GetActorSecondPsw(const unsigned int nAccountId, const int nServerId, CDataPacket &packet)
|
|||
|
|
{
|
|||
|
|
char szSql[256];
|
|||
|
|
sprintf(szSql, szSQLSP_LoadAccountPsw, nAccountId, nServerId);
|
|||
|
|
int nError = m_pSQLConnection->Query(szSql);
|
|||
|
|
BYTE btFlag = 0;
|
|||
|
|
if ( !nError )
|
|||
|
|
{
|
|||
|
|
MYSQL_ROW pRow = m_pSQLConnection->CurrentRow();
|
|||
|
|
if ( pRow && pRow[0] && strlen(pRow[0]) > 30 )
|
|||
|
|
{
|
|||
|
|
btFlag = 3;
|
|||
|
|
}
|
|||
|
|
packet << (BYTE)btFlag;
|
|||
|
|
m_pSQLConnection->ResetQuery();
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
packet << (BYTE)btFlag;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CGateDBReqestHandler::OnCheckSecondPsw(CDataPacketReader & inPacket,ILogicDBRequestHost * pDataClient)
|
|||
|
|
{
|
|||
|
|
unsigned int nAccountId =0;
|
|||
|
|
int nRawServerId=0;
|
|||
|
|
int nServerId =0;
|
|||
|
|
UINT64 lKey =0;
|
|||
|
|
BYTE bGateIndex =0;
|
|||
|
|
ACTORNAME sGatePsw = {0};
|
|||
|
|
unsigned int nActorId = 0;
|
|||
|
|
|
|||
|
|
inPacket >>nRawServerId >>nServerId >> bGateIndex >> lKey >> nAccountId;
|
|||
|
|
inPacket.readString(sGatePsw,ArrayCount(sGatePsw));
|
|||
|
|
char szSql[256];
|
|||
|
|
sprintf(szSql, szSQLSP_LoadAccountPsw, nAccountId, nServerId);
|
|||
|
|
int nError = m_pSQLConnection->Query(szSql);
|
|||
|
|
if ( !nError )
|
|||
|
|
{
|
|||
|
|
MYSQL_ROW pRow = m_pSQLConnection->CurrentRow();
|
|||
|
|
ACTORNAME sPsw = {0};
|
|||
|
|
if ( pRow && pRow[0])
|
|||
|
|
{
|
|||
|
|
sscanf(pRow[0], "%s", &sPsw);
|
|||
|
|
}
|
|||
|
|
if ( !sPsw || strcmp(sPsw, sGatePsw) != 0)
|
|||
|
|
{
|
|||
|
|
nError = 2;
|
|||
|
|
}
|
|||
|
|
m_pSQLConnection->ResetQuery();
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
nError = ERR_SQL;
|
|||
|
|
}
|
|||
|
|
CDataPacket &retPack= pDataClient->AllocDataPacket(dcCheckSecondPsw);
|
|||
|
|
retPack << nRawServerId <<nServerId << bGateIndex <<lKey;
|
|||
|
|
retPack << (BYTE)nError;
|
|||
|
|
|
|||
|
|
pDataClient->FlushDataPacket(retPack);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
void CGateDBReqestHandler::OnCreateSecondPsw(CDataPacketReader & inPacket,ILogicDBRequestHost * pDataClient)
|
|||
|
|
{
|
|||
|
|
unsigned int nAccountId =0;
|
|||
|
|
int nRawServerId=0;
|
|||
|
|
int nServerId =0;
|
|||
|
|
UINT64 lKey =0;
|
|||
|
|
BYTE bGateIndex =0;
|
|||
|
|
ACTORNAME sGatePsw = {0};
|
|||
|
|
unsigned int nActorId = 0;
|
|||
|
|
|
|||
|
|
inPacket >>nRawServerId >>nServerId >> bGateIndex >> lKey >> nAccountId ;
|
|||
|
|
inPacket.readString(sGatePsw,ArrayCount(sGatePsw));
|
|||
|
|
|
|||
|
|
|
|||
|
|
char sBuff[1024] = {0};
|
|||
|
|
sprintf(sBuff, szSQLSP_CreateAccountPsw,nAccountId,nServerId,sGatePsw);
|
|||
|
|
int nErrorCode = m_pSQLConnection->Exec(sBuff);
|
|||
|
|
if (!nErrorCode)
|
|||
|
|
{
|
|||
|
|
m_pSQLConnection->ResetQuery();
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
nErrorCode = ERR_SQL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CDataPacket &retPack= pDataClient->AllocDataPacket(dcCreateSecondPsw);
|
|||
|
|
retPack << nRawServerId <<nServerId << bGateIndex <<lKey << (BYTE)nErrorCode;
|
|||
|
|
pDataClient->FlushDataPacket(retPack);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
INT_PTR CGateDBReqestHandler::QueryActorCount( INT_PTR nAccountId, INT_PTR nServerIndex )
|
|||
|
|
{
|
|||
|
|
DECLARE_FUN_TIME_PROF()
|
|||
|
|
BYTE result = 0;
|
|||
|
|
if (!m_pSQLConnection->Connected())
|
|||
|
|
{
|
|||
|
|
result = 0;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
int nError = m_pSQLConnection->Query(szSQLSP_QueryActorCount,nAccountId,nServerIndex);
|
|||
|
|
if (nError != 0)
|
|||
|
|
{
|
|||
|
|
result = 0;
|
|||
|
|
}
|
|||
|
|
else{
|
|||
|
|
MYSQL_ROW pRow;
|
|||
|
|
pRow = m_pSQLConnection->CurrentRow();
|
|||
|
|
if (pRow && pRow[0])
|
|||
|
|
{
|
|||
|
|
result = StrToInt(pRow[0]);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
result = 0;//数据库无数据
|
|||
|
|
}
|
|||
|
|
m_pSQLConnection->ResetQuery();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
INT_PTR CGateDBReqestHandler::QueryCrossServerActor( CDataPacketReader& inPacket,ILogicDBRequestHost * pDataClient)
|
|||
|
|
{
|
|||
|
|
DECLARE_FUN_TIME_PROF()
|
|||
|
|
int nActorId = 0;
|
|||
|
|
int nServerId = 0;
|
|||
|
|
int nCSSrvid = 0;
|
|||
|
|
int result = 0;
|
|||
|
|
int nAccountId = 0;
|
|||
|
|
int nLastActorId = 0;
|
|||
|
|
inPacket >> nServerId >>nCSSrvid >> nActorId >> nLastActorId;
|
|||
|
|
OutputMsg(rmTip,_T("[CrossLogin 3] DB收到查询跨服id :%d,nCSSrvid:%d,nLastActorId:%d"),nActorId,nCSSrvid, nLastActorId);
|
|||
|
|
// int64_t token = nCSSrvid << 32 + nActorId;
|
|||
|
|
BYTE nError = NOERR;
|
|||
|
|
//数据库连接是否就绪
|
|||
|
|
if ( !m_pSQLConnection->Connected() )
|
|||
|
|
{
|
|||
|
|
nError = ERR_SQL_NOT_CONNECT;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
char szSql[100];
|
|||
|
|
nError = m_pSQLConnection->Query(szSQLSP_QueryeCrossServerCharactor,nLastActorId);
|
|||
|
|
if (nError != 0)
|
|||
|
|
{
|
|||
|
|
nError =ERR_SQL;//-1是错误码
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
MYSQL_ROW pRow = m_pSQLConnection->CurrentRow();
|
|||
|
|
if (pRow && pRow[0] && atoi(pRow[0]) >=1)
|
|||
|
|
{
|
|||
|
|
sscanf(pRow[0], "%d", &(result));
|
|||
|
|
}
|
|||
|
|
m_pSQLConnection->ResetQuery();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(result > 0)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmTip,_T("[CrossLogin 4] 跨服id查询成功 :%d,nCSSrvid:%d,nLastActorId:%d"),nActorId,nCSSrvid, nLastActorId);
|
|||
|
|
CDataPacket &retPack= pDataClient->AllocDataPacket(dcGetCSActorId);
|
|||
|
|
retPack << nServerId << nCSSrvid << nActorId << (BYTE)nError << result ;//合并起来
|
|||
|
|
pDataClient->FlushDataPacket(retPack);//下发数据
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
char sactorname[32] = {0};
|
|||
|
|
inPacket >> nAccountId;
|
|||
|
|
inPacket.readString(sactorname, sizeof(sactorname));
|
|||
|
|
CREATEACTORDATA *pData= new(CREATEACTORDATA);
|
|||
|
|
if(pData ==NULL)
|
|||
|
|
{
|
|||
|
|
OutputMsg( rmError, _T("alloc CREATEACTORDATA memery fail "));
|
|||
|
|
return nError;
|
|||
|
|
}
|
|||
|
|
INT_PTR nActorCount = ArrayCount(sactorname);
|
|||
|
|
strncpy(pData->actorName,sactorname,nActorCount);
|
|||
|
|
pData->icon = 0;
|
|||
|
|
pData->job =0;
|
|||
|
|
pData->lKey = nActorId; //玩家本服真实id
|
|||
|
|
pData->nGateIndex = 0;
|
|||
|
|
pData->nServerIndex = nServerId;
|
|||
|
|
pData->sex = 0;
|
|||
|
|
pData->zy= 0;
|
|||
|
|
pData->lIp = 0; //通过逻辑服把ip发过来
|
|||
|
|
pData->nAccountId = nAccountId;
|
|||
|
|
pData->nLastRandNameIndex = 0;
|
|||
|
|
pData->nAdId = 0;
|
|||
|
|
pData->nRawServerindex = nCSSrvid;
|
|||
|
|
// OutputMsg(rmTip,_T("CrossLogin 5:actorName:%s,icon:%d,job:%d,lKey:%lld,nGateIndex:%d,sex:%d,zy:%d,lIp:%d, nAccountId:%d,nRawServerindex:%d,accountName:%s"),
|
|||
|
|
// pData->actorName,pData->icon, pData->job,pData->lKey,pData->nGateIndex,pData->sex,pData->zy,pData->lIp,pData->nAccountId,pData->nRawServerindex,pData->accountName);
|
|||
|
|
OutputMsg(rmTip,_T("[CrossLogin 5] 需要向NS注册 :%d,nCSSrvid:%d,nLastActorId:%d,nServerId"),nActorId,nCSSrvid, nLastActorId,nServerId);
|
|||
|
|
// 向名称服务器查询该名字是否可用
|
|||
|
|
m_pDBServer->GetDBEngine()->getNameSyncClient()->PostCrossServerAllocateCharId(nAccountId,nServerId,sactorname,pData);
|
|||
|
|
}
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
INT_PTR CGateDBReqestHandler::CreateCrossServerActor( CDataPacketReader& inPacket,ILogicDBRequestHost * pDataClient)
|
|||
|
|
{
|
|||
|
|
int result = 0;
|
|||
|
|
|
|||
|
|
return result;
|
|||
|
|
DECLARE_FUN_TIME_PROF()
|
|||
|
|
int nActorId = 0;
|
|||
|
|
int nAccountId = 0;
|
|||
|
|
int nServerId = 0;
|
|||
|
|
int nCSSrvid = 0;
|
|||
|
|
int64_t nToken = 0;
|
|||
|
|
|
|||
|
|
char sactorname[32] = {0};
|
|||
|
|
inPacket >> nServerId >>nCSSrvid >> nActorId >> nAccountId >> nToken;
|
|||
|
|
inPacket.readString(sactorname, sizeof(sactorname));
|
|||
|
|
|
|||
|
|
BYTE nError = NOERR;
|
|||
|
|
//数据库连接是否就绪
|
|||
|
|
if ( !m_pSQLConnection->Connected() )
|
|||
|
|
{
|
|||
|
|
nError = ERR_SQL_NOT_CONNECT;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//查询数据库
|
|||
|
|
char szSql[100];
|
|||
|
|
sprintf(szSql,szSQLSP_CrateCrossServerCharactor,nAccountId,nActorId, sactorname,nCSSrvid,nToken);
|
|||
|
|
nError = m_pSQLConnection->RealExec(szSql,strlen(szSql));
|
|||
|
|
if (nError != 0)
|
|||
|
|
{
|
|||
|
|
nError =ERR_SQL;//-1是错误码
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
m_pSQLConnection->ResetQuery();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|