DragonNest/Server/DNDBServer/DNIsolateTask.cpp
2024-12-19 09:48:26 +08:00

123 lines
3.9 KiB
C++

#include "StdAfx.h"
#include "DNIsolateTask.h"
#include "DNConnection.h"
#include "DNSQLConnectionManager.h"
#include "DNSQLMembership.h"
#include "DNSQLWorld.h"
#include "Log.h"
CDNIsolateTask::CDNIsolateTask(CDNConnection* pConnection)
: CDNMessageTask(pConnection)
{
}
CDNIsolateTask::~CDNIsolateTask(void)
{
}
void CDNIsolateTask::OnRecvMessage(int nThreadID, int nMainCmd, int nSubCmd, char* pData)
{
CDNSQLMembership *pMembershipDB = NULL;
CDNSQLWorld *pWorldDB = NULL;
int nRet = ERROR_DB;
switch (nSubCmd)
{
case QUERY_GETISOLATELIST:
{
TQGetIsolateList * pPacket = (TQGetIsolateList*)pData;
TAGetIsolateList packet;
memset(&packet, 0, sizeof(TAGetIsolateList));
packet.nAccountDBID = pPacket->nAccountDBID;
packet.nRetCode = ERROR_DB;
pWorldDB = g_SQLConnectionManager.FindWorldDB(nThreadID, pPacket->cWorldSetID);
if (pWorldDB)
{
packet.nRetCode = pWorldDB->QueryGetListBlockedCharacter(pPacket->biCharacterDBID, packet.cCount, packet.Isolate);
}
else
{
g_Log.Log(LogType::_ERROR, pPacket->cWorldSetID, pPacket->nAccountDBID, pPacket->biCharacterDBID, 0, L"[ADBID:%u CDBID:%lld] [QUERY_GETISOLATELIST:%d] pWorldDB not found\r\n", pPacket->nAccountDBID, pPacket->biCharacterDBID, pPacket->cWorldSetID);
}
m_pConnection->AddSendData(nMainCmd, nSubCmd, (char*)&packet, sizeof(packet) - sizeof(packet.Isolate) + (packet.cCount * sizeof(TIsolateItem)));
}
break;
case QUERY_ADDISOLATE:
{
TQAddIsolate * pPacket = (TQAddIsolate*)pData;
TAAddIsolate packet;
memset(&packet, 0, sizeof(TAAddIsolate));
packet.nAccountDBID = pPacket->nAccountDBID;
_wcscpy(packet.IsolateItem.wszIsolateName, _countof(packet.IsolateItem.wszIsolateName), pPacket->wszIsolateName, (int)wcslen(pPacket->wszIsolateName));
packet.nRetCode = ERROR_DB;
pWorldDB = g_SQLConnectionManager.FindWorldDB(nThreadID, pPacket->cWorldSetID);
if (pWorldDB)
{
bool bNeedDelFriend = false;
packet.nRetCode = pWorldDB->QueryAddBlockedCharacter(pPacket->biCharacterDBID, pPacket->wszIsolateName, packet.IsolateItem.biIsolateCharacterDBID, bNeedDelFriend, ISOLATELISTMAX);
if (packet.nRetCode == ERROR_NONE)
{
packet.cNeedDelFriend = bNeedDelFriend == true ? 1 : 0;
}
}
else
{
g_Log.Log(LogType::_ERROR, pPacket->cWorldSetID, pPacket->nAccountDBID, pPacket->biCharacterDBID, 0, L"[ADBID:%u CDBID:%lld] [QUERY_ADDISOLATE:%d] pWorldDB not found\r\n", pPacket->nAccountDBID, pPacket->biCharacterDBID, pPacket->cWorldSetID);
}
m_pConnection->AddSendData(nMainCmd, nSubCmd, (char*)&packet, sizeof(packet));
}
break;
case QUERY_DELISOLATE:
{
TQDelIsolate * pPacket = (TQDelIsolate*)pData;
if (pPacket->cCount < 0 || pPacket->cCount >= ISOLATELISTMAX)
{
_DANGER_POINT();
break;
}
TADelIsolate packet;
memset(&packet, 0, sizeof(TADelIsolate));
packet.nAccountDBID = pPacket->nAccountDBID;
packet.nRetCode = ERROR_DB;
pWorldDB = g_SQLConnectionManager.FindWorldDB(nThreadID, pPacket->cWorldSetID);
if (pWorldDB)
{
packet.nRetCode = pWorldDB->QueryDelBlockedCharacter(pPacket->biCharacterDBID, pPacket->cCount, pPacket->biIsolateCharacterDBIDs);
if (packet.nRetCode == ERROR_NONE)
{
if (pPacket->cCount < ISOLATELISTMAX && pPacket->cCount > 0)
{
packet.cCount = pPacket->cCount;
memcpy(packet.biIsolateCharacterDBIDs, pPacket->biIsolateCharacterDBIDs, sizeof(INT64) * pPacket->cCount);
}
else
{
_DANGER_POINT();
break;
}
}
}
else
{
g_Log.Log(LogType::_ERROR, pPacket->cWorldSetID, pPacket->nAccountDBID, pPacket->biCharacterDBID, 0, L"[ADBID:%u CDBID:%lld] [QUERY_ADDISOLATE:%d] pWorldDB not found\r\n", pPacket->nAccountDBID, pPacket->biCharacterDBID, pPacket->cWorldSetID);
}
m_pConnection->AddSendData(nMainCmd, nSubCmd, (char*)&packet, sizeof(packet) - sizeof(packet.biIsolateCharacterDBIDs) + (sizeof(INT64) * packet.cCount));
}
break;
}
}