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>
425 lines
10 KiB
C++
425 lines
10 KiB
C++
#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);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
}
|
||
}
|
||
|