Files
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

160 lines
3.6 KiB
C++

#include "StdAfx.h"
void CLogicDBReqestHandler::QuerySkillImpl(MYSQL_ROW pRow, ONESKILLDBDATA& data)
{
int nValue =0;
WORD wValue =0;
//技能的ID,等级,秘籍放一个地方存储
sscanf(pRow[0], "%d", &nValue);
data.nSkillID = LOWORD(nValue);
wValue = HIWORD(nValue);
data.nLevel = LOBYTE(wValue);
data.nIsClosed = HIBYTE(wValue);
sscanf(pRow[1], "%d", &data.nCd);
sscanf(pRow[2], "%d", &data.nExp);
if(pRow[3])
{
sscanf(pRow[3], "%d", &data.nMijiExpiredTime);
}
if(pRow[4])
{
sscanf(pRow[4], "%d", &data.nMijiId);
}
}
void CLogicDBReqestHandler::QuerySkillFromDB(unsigned int nActorID, int nRawServerId, int nLoginServerId)
{
DECLARE_FUN_TIME_PROF()
INT_PTR nErroID = reSucc;
if (!m_pSQLConnection->Connected())
{
nErroID = reDbErr;
}
else
{
nErroID = m_pSQLConnection->Query(szSQLSP_LoadCharSkills, nActorID);
if ( !nErroID )
{
CDataPacket& retPack = allocProtoPacket(dcLoadSkill);
retPack << nRawServerId << nLoginServerId;
retPack << nActorID << (BYTE) nErroID;
ONESKILLDBDATA data;
MYSQL_ROW pRow = m_pSQLConnection->CurrentRow();
int nCount = m_pSQLConnection->GetRowCount();
retPack << (int)nCount;
while ( pRow)
{
QuerySkillImpl(pRow, data);
retPack << data;
pRow = m_pSQLConnection->NextRow();
}
flushProtoPacket(retPack);
m_pSQLConnection->ResetQuery(); //函数调用里没有重置数据的
return;
}
else
{
OutputMsg(rmError,_T("%s error"),__FUNCTION__);
m_pSQLConnection->ResetQuery();
}
}
if( nErroID != reSucc)
{
OutputMsg(rmError,_T("%s装载玩家的技能数据失败%u"),__FUNCTION__,nActorID);
CDataPacket& retPack = allocProtoPacket(dcLoadSkill);
retPack << nRawServerId << nLoginServerId << nActorID << (BYTE) nErroID;
flushProtoPacket(retPack);
}
}
void CLogicDBReqestHandler::SaveSkillToDB(CDataPacketReader &inPacket, bool bResp)
{
DECLARE_FUN_TIME_PROF()
int nRawServerId, nLoginServerId;
unsigned int nActorId = 0;
int nSkillCount =0;
inPacket >> nRawServerId >> nLoginServerId >> nActorId >> nSkillCount;
int nErrorCode =0;
if (nActorId < 0 )
{
nErrorCode = reNoActor;
}
else
{
//先删除玩家的技能列表
//nErrorCode =ExecuteSimplyProcedure(szSQLSP_CleanCharSkills,nActorId) ;
int nErrorCode = m_pSQLConnection->Exec(szSQLSP_CleanCharSkills, nActorId);
if(!nErrorCode)
{
m_pSQLConnection->ResetQuery();
}
else
{
OutputMsg(rmError,_T("%s error"),__FUNCTION__);
return;
}
if( nErrorCode == reSucc)
{
if(nSkillCount >0)
{
strcpy(m_pHugeSQLBuffer,szSQLSP_AddCharAllSkills); //表头放这里
char buff[2048];
ONESKILLDBDATA data;
int nValue;
for(INT_PTR i=0; i< nSkillCount; i++)
{
inPacket >> data; //每次读一个的数据
strcat(m_pHugeSQLBuffer," (");
nValue =MAKELONG(data.nSkillID,MAKEWORD(data.nLevel,data.nIsClosed));
sprintf(buff,"%u,%d,%d,%d,%d,%d",nActorId,nValue,data.nCd,data.nExp,data.nMijiExpiredTime,data.nMijiId); //actotID,guid
strcat(m_pHugeSQLBuffer,buff);
strcat(m_pHugeSQLBuffer," )");
if(i < nSkillCount -1)
{
strcat(m_pHugeSQLBuffer,",");
}
}
nErrorCode= m_pSQLConnection->Exec(m_pHugeSQLBuffer);
if(!nErrorCode)
{
m_pSQLConnection->ResetQuery();
}
else
{
OutputMsg(rmError,_T("%s error"),__FUNCTION__);
}
}
}
else
{
OutputMsg(rmWaning,_T("clean skill error,actorID=%u"),nActorId);
}
}
if (bResp)
{
CDataPacket& retPack = allocProtoPacket(dcSaveSkill);
retPack << nRawServerId << nLoginServerId;
retPack << nActorId << char(nErrorCode);
flushProtoPacket(retPack);
}
}