Files
Client/Server/RylServerProject/RylDBAgentServer/DataStorage/SessionDataMgr.cpp
LGram16 dd97ddec92 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>
2025-11-29 20:17:20 +09:00

425 lines
10 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20>߸<EFBFBD><DFB8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD><CCB5>Դϴ<D4B4>.");
}
else
{
// <20><><EFBFBD><EFBFBD> DB<44><42> <20><><EFBFBD><EFBFBD> ã<><C3A3>
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 / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.", dwUID);
lpSessionData = 0;
}
else
{
INFLOG1(g_Log, "UID:%10u / <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", 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 / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", dwUID);
}
else
{
ERRLOG1(g_Log, "UID:%10u / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : UID<49>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", 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 / <20><><EFBFBD><EFBFBD> <20>ݱ<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>", dwUID);
}
else
{
CSessionData* lpSessionData = pos->second;
m_uidMap.erase(pos);
if(lpSessionData && lpSessionData->GetSessionID() != dwSessionID)
{
SERLOG3(g_Log, "UID:%10u / OldSessionID:%10u / CloseSessionID:%10u / <20><><EFBFBD><EFBFBD> <20>ݱ<EFBFBD> <20><><EFBFBD><EFBFBD> : "
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID<49><44> <20>ٸ<EFBFBD><D9B8>ϴ<EFBFBD>", 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 / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ݱ<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>", dwUID);
}
else
{
CSessionData* lpSessionData = pos->second;
if(lpSessionData->GetServerID() != dwServerID)
{
SERLOG3(g_Log, "UID:%10u / ServerID:0x%08X / CloseServerID:0x%08X / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ݱ<EFBFBD> <20><><EFBFBD><EFBFBD> : "
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ID<49><44> <20>ٸ<EFBFBD><D9B8>ϴ<EFBFBD>", 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)
{
// <20><><EFBFBD><EFBFBD> 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;
// <20><>Ƽ<EFBFBD><C6BC> <20>α׾ƿ<D7BE> <20>ϸ<EFBFBD>
CPartyDBInfo* lpParty = CPartyDBMgr::GetInstance().OpenParty(
CDBSingleObject::GetInstance(), dwPID);
if (0 != lpParty)
{
CPartyDBMgr::GetInstance().LogoutPartyMember(
CDBSingleObject::GetInstance(), lpParty, dwCID);
}
// <20><><EFBFBD><20>α׾ƿ<D7BE> <20>˸<EFBFBD>
CGuildDB* lpGuild = static_cast<CGuildDB*>(
CGuildDBMgr::GetInstance().GetGuild(dwGID));
if (0 != lpGuild)
{
lpGuild->SendLoginOutMember(dwCID, 0);
}
}
// ij<><C4B3><EFBFBD><EFBFBD> Disable
lpSessionData->CharDisable(
lpSessionData->GetCID(), lpSessionData->GetServerID());
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if(lpSessionData)
{
delete lpSessionData;
lpSessionData = NULL;
}
}
void CSessionDataMgr::SessionCloseCurrentServer(unsigned long dwServerID)
{
INFLOG1(g_Log, "ServerID:0x%08X / <20><><EFBFBD><EFBFBD> <20>α<EFBFBD> <20>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>α<EFBFBD> <20>ƿ<EFBFBD> ó<><C3B3> <20><><EFBFBD><EFBFBD>", 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 / <20><><EFBFBD><EFBFBD> <20>α<EFBFBD> <20>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>α<EFBFBD> <20>ƿ<EFBFBD> ó<><C3B3> <20>Ϸ<EFBFBD> : %u<><75>",
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 / Ȱ<><C8B0>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD> ", dwCID);
return true;
}
else
{
ERRLOG1(g_Log, "CID:%10u / Ȱ<><C8B0>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD> : <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>.", dwCID);
}
return false;
}
bool CSessionDataMgr::RemoveCharLoadedSession(unsigned long dwCID)
{
if(0 != m_cidMap.erase(dwCID))
{
INFLOG1(g_Log, "CID:%10u / Ȱ<><C8B0>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ", dwCID);
return true;
}
else
{
ERRLOG1(g_Log, "CID:%10u / Ȱ<><C8B0>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>", dwCID);
}
return false;
}
// Load <20><> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ν<EFBFBD><CEBD>Ͻ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> OFF <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
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);
}
}
}
}
}
}
}