Restructure repository to include all source folders

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>
This commit is contained in:
2025-11-29 20:17:20 +09:00
parent 5d3cd64a25
commit dd97ddec92
11602 changed files with 1446576 additions and 0 deletions

View File

@@ -0,0 +1,424 @@
#include "stdafx.h"
#include "SessionDataMgr.h"
#include "CharacterData.h"
#include <DB/DBComponent.h>
#include <Community/Party/PartyDBInfo.h>
#include <Community/Party/PartyDBMgr.h>
#include <Community/Guild/GuildDB.h>
#include <Community/Guild/GuildDBMgr.h>
#include <Log/ServerLog.h>
#ifdef _RYL_GAME_CLIENT_
#include "RYLNetworkData.h"
#endif
#ifndef _RYL_GAME_CLIENT_
#include <Utility/Setup/ServerSetup.h>
#endif
namespace DBAgent
{
namespace DataStorage
{
CSessionDataMgr& CSessionDataMgr::GetInstance()
{
static CSessionDataMgr sessionDataMgr;
return sessionDataMgr;
}
CSessionData* CSessionDataMgr::GetOpenSession(unsigned long dwUID)
{
SessionMap::iterator pos = m_uidMap.find(dwUID);
return pos != m_uidMap.end() ? pos->second : 0;
}
CSessionData* CSessionDataMgr::GetOpenSession(const char* szAccountName,
IN_ADDR peerAddress, bool bCheckAddress)
{
SessionMap::iterator pos = m_uidMap.begin();
SessionMap::iterator end = m_uidMap.end();
CSessionData* lpSessionData = 0;
CSessionData* lpResultSessionData = 0;
for(; pos != end; ++pos)
{
lpSessionData = pos->second;
if((bCheckAddress && lpSessionData->GetRemoteAddress().S_un.S_addr == peerAddress.S_un.S_addr) &&
0 == strncmp(szAccountName, lpSessionData->GetAccountName(), CHAR_INFOST::MAX_ACCOUNT_LEN))
{
lpResultSessionData = lpSessionData;
break;
}
}
return lpResultSessionData;
}
CSessionData* CSessionDataMgr::GetCharLoadedSession(unsigned long dwCID)
{
SessionMap::iterator pos = m_cidMap.find(dwCID);
return pos != m_cidMap.end() ? pos->second : 0;
}
bool CSessionDataMgr::IsLoadedChar(const char* szCharName)
{
if (NULL != szCharName)
{
SessionMap::iterator pos = m_cidMap.begin();
SessionMap::iterator end = m_cidMap.end();
CSessionData* lpSessionData = 0;
CCharacterData* lpCharData = 0;
for(; pos != end; ++pos)
{
lpSessionData = pos->second;
if(NULL != lpSessionData && NULL != (lpCharData = lpSessionData->GetCharacterData()))
{
if (NULL != lpCharData->GetName() &&
0 == strncmp(lpCharData->GetName(), szCharName, CHAR_INFOST::MAX_NAME_LEN))
{
return true;
}
}
}
}
return false;
}
CSessionData* CSessionDataMgr::SessionOpen(unsigned long dwUID)
{
CSessionData* lpSessionData = 0;
if(0 == dwUID)
{
SERLOG0(g_Log, "세션 생성 실패 : 잘못된 유저 아이디입니다.");
}
else
{
// 연결 DB로 부터 찾기
SessionMap::iterator pos = m_uidMap.find(dwUID);
if(pos != m_uidMap.end())
{
lpSessionData = pos->second;
CSessionData::SessionState eSessionState = lpSessionData->GetSessionState();
if (CSessionData::SE_USER_ENABLED == eSessionState ||
CSessionData::SE_CHAR_ENABLED == eSessionState)
{
ERRLOG1(g_Log, "UID:%10u / 세션 열기 실패 : 이미 세션이 존재합니다.", dwUID);
lpSessionData = 0;
}
else
{
INFLOG1(g_Log, "UID:%10u / 이미 존재하는 세션 열기 성공", dwUID);
}
}
else
{
lpSessionData = new CSessionData;
if(0 != lpSessionData)
{
if(m_uidMap.insert(std::make_pair(dwUID, lpSessionData)).second)
{
lpSessionData->SetUID(dwUID);
INFLOG1(g_Log, "UID:%10u / 세션 열기 성공", dwUID);
}
else
{
ERRLOG1(g_Log, "UID:%10u / 세션 열기 실패 : UID맵에 삽입 실패", dwUID);
if(lpSessionData)
{
delete lpSessionData;
lpSessionData = NULL;
}
}
}
}
}
return lpSessionData;
}
void CSessionDataMgr::SessionClose(unsigned long dwUID, unsigned long dwSessionID)
{
SessionMap::iterator pos = m_uidMap.find(dwUID);
if(pos == m_uidMap.end())
{
ERRLOG1(g_Log, "UID:%10u / 세션 닫기 실패 : 세션이 존재하지 않습니다", dwUID);
}
else
{
CSessionData* lpSessionData = pos->second;
m_uidMap.erase(pos);
if(lpSessionData && lpSessionData->GetSessionID() != dwSessionID)
{
SERLOG3(g_Log, "UID:%10u / OldSessionID:%10u / CloseSessionID:%10u / 세션 닫기 에러 : "
"세션 ID가 다릅니다", dwUID, lpSessionData->GetSessionID(), dwSessionID);
}
if(lpSessionData)
{
delete lpSessionData;
lpSessionData = NULL;
}
}
}
void CSessionDataMgr::SessionCloseWithLogout(unsigned long dwUID, unsigned long dwServerID)
{
SessionMap::iterator pos = m_uidMap.find(dwUID);
if(pos == m_uidMap.end())
{
ERRLOG1(g_Log, "UID:%10u / 세션 강제로 닫기 실패 : 세션이 존재하지 않습니다", dwUID);
}
else
{
CSessionData* lpSessionData = pos->second;
if(lpSessionData->GetServerID() != dwServerID)
{
SERLOG3(g_Log, "UID:%10u / ServerID:0x%08X / CloseServerID:0x%08X / 세션 강제로 닫기 에러 : "
"닫으려는 서버 ID가 다릅니다", dwUID, lpSessionData->GetServerID(), dwServerID);
}
else
{
SessionCloseWithLogout(pos);
}
}
}
void CSessionDataMgr::SessionCloseWithLogout(SessionMap::iterator logoutPos)
{
CSessionData* lpSessionData = logoutPos->second;
m_uidMap.erase(logoutPos);
CSessionData::SessionState eSessionState = lpSessionData->GetSessionState();
if(CSessionData::SE_USER_ENABLED == eSessionState)
{
// 유저 Disable
lpSessionData->UserDisable();
}
else if(CSessionData::SE_CHAR_ENABLED == eSessionState)
{
CCharacterData* lpCharacterData = lpSessionData->GetCharacterData();
if(0 != lpCharacterData)
{
unsigned long dwCID = lpCharacterData->GetCID();
unsigned long dwPID = lpCharacterData->GetInfo().PID;
unsigned long dwGID = lpCharacterData->GetInfo().GID;
// 파티에 로그아웃 일림
CPartyDBInfo* lpParty = CPartyDBMgr::GetInstance().OpenParty(
CDBSingleObject::GetInstance(), dwPID);
if (0 != lpParty)
{
CPartyDBMgr::GetInstance().LogoutPartyMember(
CDBSingleObject::GetInstance(), lpParty, dwCID);
}
// 길드에 로그아웃 알림
CGuildDB* lpGuild = static_cast<CGuildDB*>(
CGuildDBMgr::GetInstance().GetGuild(dwGID));
if (0 != lpGuild)
{
lpGuild->SendLoginOutMember(dwCID, 0);
}
}
// 캐릭터 Disable
lpSessionData->CharDisable(
lpSessionData->GetCID(), lpSessionData->GetServerID());
}
// 세션 날려버림.
if(lpSessionData)
{
delete lpSessionData;
lpSessionData = NULL;
}
}
void CSessionDataMgr::SessionCloseCurrentServer(unsigned long dwServerID)
{
INFLOG1(g_Log, "ServerID:0x%08X / 서버 로그 아웃으로 인해 로그 아웃 처리 시작", dwServerID);
SessionMap::iterator pos = m_uidMap.begin();
SessionMap::iterator end = m_uidMap.end();
unsigned int nLogoutCount = 0;
for(; pos != end; )
{
CSessionData* lpSessionData = pos->second;
if(lpSessionData->GetServerID() == dwServerID)
{
SessionCloseWithLogout(pos++);
++nLogoutCount;
}
else
{
++pos;
}
}
INFLOG2(g_Log, "ServerID:0x%08X / 서버 로그 아웃으로 인해 로그 아웃 처리 완료 : %u명",
dwServerID, nLogoutCount);
}
bool CSessionDataMgr::AddCharLoadedSession(unsigned long dwCID, CSessionData& SessionData)
{
if(m_cidMap.insert(std::make_pair(dwCID, &SessionData)).second)
{
INFLOG1(g_Log, "CID:%10u / 활성화된 세션 추가 성공 ", dwCID);
return true;
}
else
{
ERRLOG1(g_Log, "CID:%10u / 활성화된 세션 추가 실패 : 이미 세션이 있습니다.", dwCID);
}
return false;
}
bool CSessionDataMgr::RemoveCharLoadedSession(unsigned long dwCID)
{
if(0 != m_cidMap.erase(dwCID))
{
INFLOG1(g_Log, "CID:%10u / 활성화된 세션 제거 성공 ", dwCID);
return true;
}
else
{
ERRLOG1(g_Log, "CID:%10u / 활성화된 세션 제거 실패 : 세션이 없습니다", dwCID);
}
return false;
}
// Load 된 캐릭터의 인스턴스 전쟁 플래그 값들을 OFF 로 만들어준다.
void CSessionDataMgr::ClearGuildWarInstanceFlag()
{
if (m_cidMap.empty())
return;
SessionMap::iterator pos = m_cidMap.begin();
SessionMap::iterator end = m_cidMap.end();
CSessionData* lpSessionData = 0;
CCharacterData* lpCharData = 0;
for(; pos != end; ++pos)
{
lpSessionData = pos->second;
#ifdef _RYL_GAME_CLIENT_
if(GameRYL::GLOBAL == CRYLNetworkData::Instance()->m_eInternationalCode)
#endif
#ifndef _RYL_GAME_CLIENT_
if(GameRYL::GLOBAL == CServerSetup::GetInstance().GetNationType())
#endif
{
if(NULL != lpSessionData)
{
if(NULL != (lpCharData = lpSessionData->GetCharacterData()))
{
if (Creature::WAR_INSTANCE == lpCharData->GetGuildWarFlag())
{
lpCharData->SetGuildWarFlag(Creature::WAR_OFF);
}
}
}
}
else
{
if(NULL != lpSessionData && NULL != (lpCharData = lpSessionData->GetCharacterData()))
{
if (Creature::WAR_INSTANCE == lpCharData->GetGuildWarFlag())
{
lpCharData->SetGuildWarFlag(Creature::WAR_OFF);
}
}
}
}
}
void CSessionDataMgr::ClearRealmWarInstanceFlag()
{
if (m_cidMap.empty())
return;
SessionMap::iterator pos = m_cidMap.begin();
SessionMap::iterator end = m_cidMap.end();
CSessionData* lpSessionData = 0;
CCharacterData* lpCharData = 0;
for(; pos != end; ++pos)
{
lpSessionData = pos->second;
#ifdef _RYL_GAME_CLIENT_
if(GameRYL::GLOBAL == CRYLNetworkData::Instance()->m_eInternationalCode)
#endif
#ifndef _RYL_GAME_CLIENT_
if(GameRYL::GLOBAL == CServerSetup::GetInstance().GetNationType())
#endif
{
if(NULL != lpSessionData)
{
if(NULL != (lpCharData = lpSessionData->GetCharacterData()))
{
if (Creature::WAR_INSTANCE == lpCharData->GetRealmWarFlag())
{
lpCharData->SetRealmWarFlag(Creature::WAR_OFF);
}
}
}
}
else
{
if(NULL != lpSessionData && NULL != (lpCharData = lpSessionData->GetCharacterData()))
{
if (Creature::WAR_INSTANCE == lpCharData->GetRealmWarFlag())
{
lpCharData->SetRealmWarFlag(Creature::WAR_OFF);
}
}
}
}
}
}
}