Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
291 lines
6.9 KiB
C++
291 lines
6.9 KiB
C++
#include "stdafx.h"
|
|
|
|
#include "RYL_GameDB.h"
|
|
#include <Log/ServerLog.h>
|
|
#include <Network/Packet/PacketStruct/UnifiedCharPacket.h>
|
|
|
|
|
|
// UID에 걸려있는 모든 캐릭터 정보를 가져온다.
|
|
bool CGameDB::UIDByCharacterList(unsigned long UID, unsigned int nAgentType,
|
|
unsigned int nOldServerID, void* GetData)
|
|
{
|
|
char* first = reinterpret_cast<char*>(GetData);
|
|
unsigned char* lpCount = reinterpret_cast<unsigned char*>(first);
|
|
char* In_CharPos = static_cast<char*>(first + 1);
|
|
|
|
CGameDB::In_UserInfo TblUserInfo;
|
|
CGameDB::Out_CharList* lpOut_CharList;
|
|
|
|
*lpCount = 0;
|
|
ZeroMemory(&TblUserInfo, sizeof(CGameDB::In_UserInfo));
|
|
|
|
if (UnifiedConst::Part2Selectable == nAgentType)
|
|
{
|
|
_snprintf(m_szQuery, MAX_QUERY_LENGTH,
|
|
"SELECT Char1, Char2, Char3, Char4, Char5 FROM UserInfo "
|
|
"WHERE UID = %d AND OldServerGroupID = %d", UID, nOldServerID);
|
|
}
|
|
else
|
|
{
|
|
_snprintf(m_szQuery, MAX_QUERY_LENGTH,
|
|
"SELECT Char1, Char2, Char3, Char4, Char5 FROM UserInfo "
|
|
"WHERE UID = %d AND OldServerGroupID IN (%d, %d)",
|
|
UID, UnifiedConst::ROW, UnifiedConst::Part2Unified);
|
|
}
|
|
|
|
if (true == ExecuteQuery(m_szQuery))
|
|
{
|
|
if(this->GetData(&TblUserInfo))
|
|
{
|
|
char* CharCID = reinterpret_cast<char*>(&TblUserInfo);
|
|
for(int cnt = 0; cnt < SIZE::MAX_CHAR_SLOT; cnt++)
|
|
{
|
|
unsigned long* CID = reinterpret_cast<unsigned long*>(CharCID + (sizeof(unsigned long) * cnt));
|
|
|
|
lpOut_CharList = reinterpret_cast<CGameDB::Out_CharList*>(
|
|
In_CharPos + ((*lpCount) * sizeof(CGameDB::Out_CharList)));
|
|
|
|
if(*CID)
|
|
{
|
|
lpOut_CharList->m_UID = UID;
|
|
lpOut_CharList->m_CID = *CID;
|
|
CIDByCharacterName(*CID, lpOut_CharList->m_szCharName);
|
|
*lpCount += 1;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool CGameDB::UIDbyUserInfo(unsigned long dwUID, unsigned int nAgentType,
|
|
unsigned int nOldServerID, void* GetData)
|
|
{
|
|
if (UnifiedConst::Part2Selectable == nAgentType)
|
|
{
|
|
_snprintf(m_szQuery, MAX_QUERY_LENGTH,
|
|
"SELECT Char1, Char2, Char3, Char4, Char5 FROM UserInfo "
|
|
"WHERE UID = %d AND OldServerGroupID = %d", dwUID, nOldServerID);
|
|
}
|
|
else
|
|
{
|
|
_snprintf(m_szQuery, MAX_QUERY_LENGTH,
|
|
"SELECT Char1, Char2, Char3, Char4, Char5 FROM UserInfo "
|
|
"WHERE UID = %d AND OldServerGroupID IN (%d, %d)",
|
|
dwUID, UnifiedConst::ROW, UnifiedConst::Part2Unified);
|
|
}
|
|
|
|
if (true == ExecuteQuery(m_szQuery))
|
|
{
|
|
if(this->GetData(GetData))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool CGameDB::GetUserNation(unsigned int nAgentType, unsigned long dwUID,
|
|
unsigned long dwCID, void* GetData)
|
|
{
|
|
// CID대신 OldServerGroupID를 받으면 깔끔하지만
|
|
// 그렇게 하려면 클라이언트쪽에 애로사항이 꽃핀다.
|
|
|
|
if (UnifiedConst::Part2Selectable == nAgentType)
|
|
{
|
|
_snprintf(m_szQuery, MAX_QUERY_LENGTH,
|
|
"SELECT Nation FROM UserInfo "
|
|
"WHERE UID = %d AND (Char1 = %u OR Char2 = %u OR Char3 = %u OR Char4 = %u OR Char5 = %u)",
|
|
dwUID, dwCID, dwCID, dwCID, dwCID, dwCID);
|
|
}
|
|
else
|
|
{
|
|
_snprintf(m_szQuery, MAX_QUERY_LENGTH,
|
|
"SELECT Nation FROM UserInfo "
|
|
"WHERE UID = %d AND OldServerGroupID IN (%d, %d)",
|
|
dwUID, UnifiedConst::ROW, UnifiedConst::Part2Unified);
|
|
}
|
|
|
|
if (true == ExecuteQuery(m_szQuery))
|
|
{
|
|
if (this->GetData(GetData))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
ERRLOG1(g_Log, "계정 국가 얻기 실패- %s", GetErrorString());
|
|
return false;
|
|
}
|
|
|
|
// 캐릭터 이름으로 검색
|
|
bool CGameDB::CNameByCharacterList(char* szCharacterName, void* GetData)
|
|
{
|
|
char* first = reinterpret_cast<char*>(GetData);
|
|
unsigned char* lpCount = reinterpret_cast<unsigned char*>(first);
|
|
|
|
char* In_CharPos = static_cast<char*>(first + 1);
|
|
|
|
CGameDB::Out_CharList* lpOut_CharList = reinterpret_cast<CGameDB::Out_CharList*>(In_CharPos);
|
|
|
|
unsigned long dwCID;
|
|
|
|
_snprintf(m_szQuery, MAX_QUERY_LENGTH,
|
|
"SELECT NewCID FROM TblUnifiedCharList "
|
|
"WHERE NewCID IN (SELECT CID FROM CharInfo WHERE Name = '%s') "
|
|
"AND (OldServerGroupID <= 15 OR OldServerGroupID IN (%d, %d, %d))",
|
|
szCharacterName, UnifiedConst::ROW, UnifiedConst::Part2Unified, UnifiedConst::Part2Selectable);
|
|
|
|
if (true == ExecuteQuery(m_szQuery))
|
|
{
|
|
if (this->GetData(&dwCID))
|
|
{
|
|
*lpCount = 1;
|
|
lpOut_CharList = reinterpret_cast<CGameDB::Out_CharList*>(In_CharPos);
|
|
lpOut_CharList->m_CID = dwCID;
|
|
|
|
if(!CIDByCharacterName(dwCID, lpOut_CharList->m_szCharName))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if(!CIDByUID(dwCID, &lpOut_CharList->m_UID))
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool CGameDB::CharacterNameByCID(char* szCharacterName, void* GetData)
|
|
{
|
|
_snprintf(m_szQuery, MAX_QUERY_LENGTH,
|
|
"SELECT CID FROM CharInfo WHERE Name = '%s'", szCharacterName);
|
|
|
|
if(!ExecuteQueryGetData(m_szQuery, GetData))
|
|
{
|
|
ERRLOG2(g_Log, "쿼리 실패. 쿼리-%s, 에러-%s", m_szQuery, GetErrorString());
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// CID로 캐릭터 검색
|
|
bool CGameDB::CIDByCharacterList(unsigned long CID, void* GetData)
|
|
{
|
|
char* first = reinterpret_cast<char*>(GetData);
|
|
unsigned char* lpCount = reinterpret_cast<unsigned char*>(first);
|
|
char* In_CharPos = static_cast<char*>(first + 1);
|
|
|
|
CGameDB::Out_CharList* lpOut_CharList = reinterpret_cast<CGameDB::Out_CharList*>(In_CharPos);
|
|
|
|
*lpCount = 1;
|
|
lpOut_CharList->m_CID = CID;
|
|
|
|
if (false == CIDByCharacterName(CID, lpOut_CharList->m_szCharName))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (false == CIDByUID(CID, &lpOut_CharList->m_UID))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// CID로 UID검색
|
|
bool CGameDB::CIDByUID(unsigned long CID, void* GetData)
|
|
{
|
|
_snprintf(m_szQuery, MAX_QUERY_LENGTH,
|
|
"SELECT UID FROM UserInfo WHERE Char1 = %d OR Char2 = %d OR Char3 = %d OR Char4 = %d OR Char5 = %d",
|
|
CID, CID, CID, CID, CID);
|
|
|
|
if (true == ExecuteQuery(m_szQuery))
|
|
{
|
|
if (this->GetData(GetData))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
GetData = NULL;
|
|
|
|
return false;
|
|
}
|
|
|
|
// CID로 캐릭터 이름 검색
|
|
bool CGameDB::CIDByCharacterName(unsigned long CID, void* GetData)
|
|
{
|
|
_snprintf(m_szQuery, MAX_QUERY_LENGTH, "SELECT Name FROM CharInfo WHERE CID = %d", CID);
|
|
|
|
if (true == ExecuteQuery(m_szQuery))
|
|
{
|
|
if(this->GetData(GetData))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
GetData = NULL;
|
|
return false;
|
|
}
|
|
|
|
bool CGameDB::ChangeName(unsigned long dwCID, char* szName)
|
|
{
|
|
// 중계서버에 캐릭명 변경을 직접 요청하는 방식으로 변경되었음.
|
|
/*
|
|
_snprintf(m_szQuery, MAX_QUERY_LENGTH,
|
|
"UPDATE CharInfo SET Name = '%s' WHERE CID = %d", szName, dwCID);
|
|
|
|
if(!ExecuteQuery(m_szQuery))
|
|
{
|
|
return false;
|
|
}
|
|
*/
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CGameDB::UseCharacterName(char* szName)
|
|
{
|
|
char result[20];
|
|
|
|
_snprintf(m_szQuery, MAX_QUERY_LENGTH,
|
|
"SELECT Name FROM CharInfo WHERE Name = '%s'", szName);
|
|
|
|
if(ExecuteQuery(m_szQuery))
|
|
{
|
|
if(GetData(result))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
unsigned char CGameDB::GetOldServerGroupID(unsigned long dwCID)
|
|
{
|
|
unsigned char cOldServerGroupID = 0;
|
|
|
|
_snprintf(m_szQuery, MAX_QUERY_LENGTH,
|
|
"SELECT OldServerGroupID FROM UserInfo"
|
|
" WHERE Char1 = %u OR Char2 = %u OR Char3 = %u OR Char4 = %u OR Char5 = %u",
|
|
dwCID, dwCID, dwCID, dwCID, dwCID);
|
|
|
|
if (true == ExecuteQueryGetData(m_szQuery, &cOldServerGroupID))
|
|
{
|
|
return cOldServerGroupID;
|
|
}
|
|
|
|
return 0;
|
|
} |