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,623 @@
#include "stdafx.h"
#include "AuthDispatch.h"
#include "Part1DBAgentDispatch.h"
#include <Log/ServerLog.h>
#include <Network/Address/INET_Addr.h>
#include <Network/SendPacket/SendServerInfo.h>
#include <Network/SendPacket/SendCharManage.h>
#include <Network/Packet/PacketCommand.h>
#include <Network/Packet/PacketStruct/UnifiedCharPacket.h>
#include <Utility/Setup/ServerSetup.h>
#include <DataStorage/SessionDataMgr.h>
#include <DataStorage/StoreDataMgr.h>
#include <DataStorage/CharacterDataMgr.h>
#include <Creature/Creature.h>
#include <Creature/Character/CharacterClass.h>
#include <DB/DBComponent.h>
#include <DB/GameDBComponent.h>
#include <Network/Packet/PacketStruct/CharQuestPacket.h>
namespace DBAgent
{
class CCharBackupItemData
{
public:
CCharBackupItemData()
: m_bBackupData(false), m_cOldServerGroupID(0)
{
memset(&m_CharInfo, 0, sizeof(CHAR_INFOST)); // <20><20><><EFBFBD><EFBFBD>
memset(&m_Skill, 0, sizeof(SKILL)); // <20><>ų <20><><EFBFBD><EFBFBD>
memset(&m_Equip, 0, sizeof(EQUIP)); // <20><><EFBFBD><EFBFBD>
memset(&m_Inven, 0, sizeof(INVEN)); // <20>κ<EFBFBD>
memset(&m_Extra, 0, sizeof(EXTRA)); // <20><><EFBFBD><EFBFBD>
memset(&m_Exchange, 0, sizeof(EXCHANGE)); // <20><>ȯ
memset(&m_TempInven, 0, sizeof(TEMPINVEN)); // <20>ӽ<EFBFBD> <20>κ<EFBFBD><CEBA>
memset(&m_Quest, 0, sizeof(QUEST)); // <20><><EFBFBD><EFBFBD>Ʈ
memset(&m_History, 0, sizeof(HISTORY)); // <20><><EFBFBD><EFBFBD><EFBFBD>
}
bool IsBackupedData() const { return m_bBackupData; }
unsigned char GetOldServerGroupID() const { return m_cOldServerGroupID; }
void BackupData(DataStorage::CSessionData& sessionData, DataStorage::CCharacterData& charData)
{
m_CharInfo = charData.GetInfo();
m_Skill = charData.GetSkill();
m_Equip = charData.GetEquip();
m_Inven = charData.GetInven();
m_Extra = charData.GetExtra();
m_Exchange = charData.GetExchange();
m_TempInven = charData.GetTempInven();
m_Quest = charData.GetQuest();
m_History = charData.GetHistory();
const UnifiedCharData* lpUnifiedCharData =
sessionData.GetUnifiedCharData(charData.GetCID());
if(0 != lpUnifiedCharData)
{
m_cOldServerGroupID = lpUnifiedCharData->cOldServerGroupID;
}
m_bBackupData = true;
}
void RestoreData(DataStorage::CCharacterData& charData)
{
if (m_bBackupData)
{
charData.SetInfo(m_CharInfo);
charData.SetSkill(m_Skill);
charData.SetEquip(m_Equip.Data, m_Equip.dwSize);
charData.SetInven(m_Inven.Data, m_Inven.dwSize);
charData.SetExtra(m_Extra.Data, m_Extra.dwSize);
charData.SetExchange(m_Exchange.Data, m_Exchange.dwSize);
charData.SetTempInven(m_TempInven.Data, m_TempInven.dwSize);
charData.SetQuest(m_Quest);
charData.SetHistory(m_History);
}
}
private:
CHAR_INFOST m_CharInfo; // <20><20><><EFBFBD><EFBFBD>
SKILL m_Skill; // <20><>ų <20><><EFBFBD><EFBFBD>
EQUIP m_Equip; // <20><><EFBFBD><EFBFBD>
INVEN m_Inven; // <20>κ<EFBFBD>
EXTRA m_Extra; // <20><><EFBFBD><EFBFBD>
EXCHANGE m_Exchange; // <20><>ȯ
TEMPINVEN m_TempInven; // <20>ӽ<EFBFBD> <20>κ<EFBFBD><CEBA>
QUEST m_Quest; // <20><><EFBFBD><EFBFBD>Ʈ
HISTORY m_History; // History
unsigned char m_cOldServerGroupID; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>׷<EFBFBD> ID
bool m_bBackupData; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
};
void ProcessUnifiedCharSelect(CSendStream& SendStream, PktBase* lpPktBase);
CSingleDispatch& CPart1DBAgentDispatch::GetDispatchTable()
{
static CSingleDispatch part1DBAgentDispatch;
return part1DBAgentDispatch;
}
CPart1DBAgentDispatch::CPart1DBAgentDispatch(CSession& Session)
: CRylServerDispatch(Session, MAX_PACKET_DISPATCH_PER_PULSE)
{
}
CPart1DBAgentDispatch::~CPart1DBAgentDispatch()
{
}
void CPart1DBAgentDispatch::Connected()
{
DETLOG3(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/Part1 DBAgentServer Connected",
&GetSession(), this, GetRemoteAddr().get_addr_string());
GetDispatchTable().SetDispatch(this);
SendPacket::ServerLogin(GetSendStream(),
CServerSetup::GetInstance().GetServerID());
}
void CPart1DBAgentDispatch::Disconnected()
{
DETLOG3(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/Part1 DBAgentServer Disconnected",
&GetSession(), this, GetRemoteAddr().get_addr_string());
GetDispatchTable().RemoveDispatch(this);
}
bool CPart1DBAgentDispatch::DispatchPacket(PktBase* lpPktBase)
{
switch(lpPktBase->GetCmd())
{
case CmdUnifiedCharSelect:
ProcessUnifiedCharSelect(GetSendStream(), lpPktBase);
break;
}
return true;
}
bool CPart1DBAgentDispatch::TransferCharPart1ToPart2(CSendStream& SendStream, unsigned long dwUID,
unsigned char cSelectedServerGroup,
unsigned char cSelectedNation,
unsigned long* lpdwSelectedCID,
unsigned char cSelectedCharNum)
{
char* lpBuffer = SendStream.GetBuffer(sizeof(PktUnifiedCharSelectReq));
if(0 != lpBuffer)
{
PktUnifiedCharSelectReq* lpPktUnifiedCharSelectReq =
reinterpret_cast<PktUnifiedCharSelectReq*>(lpBuffer);
memset(lpPktUnifiedCharSelectReq->szPassword, 0,
sizeof(char) * PktUnifiedCharSelectReq::MAX_PASSWORD_LEN);
lpPktUnifiedCharSelectReq->cSelectedNation = cSelectedNation;
lpPktUnifiedCharSelectReq->cSelectedServerGroupID = cSelectedServerGroup;
lpPktUnifiedCharSelectReq->dwRequestKey = 0;
lpPktUnifiedCharSelectReq->dwUID = dwUID;
memcpy(lpPktUnifiedCharSelectReq->dwCID, lpdwSelectedCID,
sizeof(unsigned long) * std::min(int(cSelectedCharNum), int(USER_INFO::MAX_CHAR_NUM)));
return SendStream.WrapHeader(sizeof(PktUnifiedCharSelectReq), CmdUnifiedCharSelect, 0, 0);
}
return false;
}
void ProcessUnifiedCharSelect(CSendStream& SendStream, PktBase* lpPktBase)
{
PktUnifiedCharSelectReq* lpPktUnifiedCharSelectReq =
reinterpret_cast<PktUnifiedCharSelectReq*>(lpPktBase);
unsigned long dwUID = lpPktUnifiedCharSelectReq->dwUID;
unsigned long dwRequestKey = lpPktUnifiedCharSelectReq->dwRequestKey;
unsigned char cSelectedServerGroupID = lpPktUnifiedCharSelectReq->cSelectedServerGroupID;
unsigned char cSelectedNation = lpPktUnifiedCharSelectReq->cSelectedNation;
unsigned short usError = 0;
using namespace DBAgent::DataStorage;
unsigned char cAgentServerType = static_cast<unsigned char>(
CServerSetup::GetInstance().GetAgentServerType());
CStoreDataMgr& storeDataMgr = CStoreDataMgr::GetInstance();
CCharacterDataMgr& charDataMgr = CCharacterDataMgr::GetInstance();
CDBComponent& dbComponent = CDBSingleObject::GetInstance();
UnifiedStoreKey srcStoreKey(dwUID, cSelectedServerGroupID);
UnifiedStoreKey dstStoreKey(dwUID, cAgentServerType);
CSessionData* lpSessionData = 0;
CStoreData* lpStoreData = 0;
CCharacterData* lpCharacterData = 0;
if(0 != lpPktBase->GetError())
{
// <20>ش<EFBFBD> UID<49><44> <20><><EFBFBD><EFBFBD>.
ERRLOG2(g_Log, "UID:%10u / Part2Unified ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - Part1 DB<44>߰輭<DFB0><E8BCAD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %d<><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.",
dwUID, lpPktBase->GetError());
usError = lpPktBase->GetError();
}
else if(0 == (lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession(dwUID)))
{
// <20>ش<EFBFBD> UID<49><44> <20><><EFBFBD><EFBFBD>.
ERRLOG1(g_Log, "UID:%10u / Part2Unified ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>", dwUID);
usError = PktUnifiedCharSelectAck::SERVER_ERROR;
}
else
{
// â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
if (!(lpSessionData->GetFirstLogin() & UnifiedConst::SELECTED_PART2))
{
// Ȥ<><C8A4> ij<><C4B3><EFBFBD><EFBFBD> loginDB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD>ɴ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if(storeDataMgr.IsDataLoginDB(srcStoreKey))
{
ERRLOG2(g_Log, "UID:%10u / SrcServerGroupID:%d / Part2Unified â<><C3A2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - <20>ش<EFBFBD> â<><C3A2><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>.",
srcStoreKey.first, srcStoreKey.second);
usError = PktUnifiedCharSelectAck::SERVER_ERROR;
}
else if(storeDataMgr.IsDataLoginDB(dstStoreKey))
{
ERRLOG2(g_Log, "UID:%10u / DstServerGroupID:%d / Part2Unified â<><C3A2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - <20>ش<EFBFBD> â<><C3A2><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>.",
dstStoreKey.first, dstStoreKey.second);
usError = PktUnifiedCharSelectAck::SERVER_ERROR;
}
else
{
// <20>ϴ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if(storeDataMgr.RemoveLogoutData(srcStoreKey))
{
ERRLOG2(g_Log, "UID:%10u / SrcServerGroupID:%d / "
"Part2Unified â<><C3A2> <20><><EFBFBD><EFBFBD> <20>̻<EFBFBD> - <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>־<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.",
srcStoreKey.first, srcStoreKey.second);
}
if(storeDataMgr.RemoveLogoutData(dstStoreKey))
{
ERRLOG2(g_Log, "UID:%10u / DstServerGroupID:%d / "
"Part2Unified â<><C3A2> <20><><EFBFBD><EFBFBD> <20>̻<EFBFBD> - <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>־<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.",
dstStoreKey.first, dstStoreKey.second);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> â<><C3A2><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>׷<EFBFBD> â<><C3A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>!
if (!lpSessionData->ChangeUnifiedStoreInfoGroup(
dbComponent, cSelectedServerGroupID, cAgentServerType))
{
usError = PktUnifiedCharSelectAck::UNIFIED_STORE_READ_ERROR;
}
// <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
else
{
if(0 == (lpStoreData = storeDataMgr.GetLogoutData(dstStoreKey)))
{
ERRLOG2(g_Log, "UID:%10u / ServerGroupID:%d / <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : â<><C3A2> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD>",
dwUID, cSelectedServerGroupID);
usError = PktUnifiedCharSelectAck::UNIFIED_STORE_READ_ERROR;
}
// â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> Part2<74><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
else if (!lpStoreData->ConvertToPart2Item(true))
{
ERRLOG2(g_Log, "UID:%10u / ServerGroupID:%d / <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : â<><C3A2> <20><>Ʈ2 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
dwUID, cSelectedServerGroupID);
usError = PktUnifiedCharSelectAck::UNIFIED_STORE_WRITE_ERROR;
}
// â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
else if(!lpStoreData->ForceUpdateDBAllData(dbComponent))
{
ERRLOG2(g_Log, "UID:%10u / ServerGroupID:%d / <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD> â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
dwUID, cSelectedServerGroupID);
usError = PktUnifiedCharSelectAck::UNIFIED_STORE_WRITE_ERROR;
}
else if(!DBComponent::GameDB::UpdateUserFirstLogin(dbComponent, dwUID,
lpSessionData->GetFirstLogin() | UnifiedConst::SELECTED_PART2))
{
ERRLOG2(g_Log, "UID:%10u / ServerGroupID:%d / <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
dwUID, cSelectedServerGroupID);
}
if(0 != usError)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>߱<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>,
// <20>׳<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20>ȴ<EFBFBD>.
storeDataMgr.RemoveLogoutData(dstStoreKey);
if(!lpSessionData->ChangeUnifiedStoreInfoGroup(
dbComponent, cAgentServerType, cSelectedServerGroupID))
{
ERRLOG3(g_Log, "UID:%10u / ServerGroupID:%d -> %d / <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ѹ<EFBFBD> <20><><EFBFBD><EFBFBD>",
dwUID, cAgentServerType, cSelectedServerGroupID);
}
}
else
{
lpSessionData->SetFirstLogin(
lpSessionData->GetFirstLogin() | UnifiedConst::SELECTED_PART2);
INFLOG2(g_Log, "UID:%10u / ServerGroupID:%d / <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
dwUID, cSelectedServerGroupID);
}
}
}
}
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>.
// 1. ij<><C4B3><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>ϴ<EFBFBD> UserInfo<66><6F> <20>ε<EFBFBD><CEB5><EFBFBD> <20>Ŀ<EFBFBD>,
// <20>ùٸ<C3B9> <20><><EFBFBD>Կ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ߺ<EFBFBD><DFBA><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> ij<><C4B3><EFBFBD>͸<EFBFBD> ã<>´<EFBFBD>.
// 2. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Part1 DB<44>߰輭<DFB0><E8BCAD><EFBFBD><EFBFBD>, <20>ش<EFBFBD> ij<><C4B3><EFBFBD>͸<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD><CEB5>ϰ<EFBFBD>
// <20><><EFBFBD><EFBFBD> / <20><>Ƽ<EFBFBD><C6BC> Ż<><C5BB><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0><EFBFBD><EFBFBD> <20><>û<EFBFBD>Ѵ<EFBFBD>.
// 3. <20><>û <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD>, <20>ش<EFBFBD> ij<><C4B3><EFBFBD>͸<EFBFBD> DB<44><42><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5>ϰ<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>Ŀ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20>ѹ<EFBFBD><D1B9>Ѵ<EFBFBD>.
// 4. <20><><EFBFBD><EFBFBD> <20>۾<EFBFBD><DBBE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, DB<44><42> UserInfo<66><6F> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
CClass::RaceType eRace =
lpSessionData->CheckUnifiedCharRace(lpPktUnifiedCharSelectReq->dwCID);
USER_INFO userInfo = lpSessionData->GetUserInfo();
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD> <20>˻縦 <20>ѹ<EFBFBD> <20><> <20>Ѵ<EFBFBD>.
unsigned long dwSelectedCID[USER_INFO::MAX_CHAR_NUM];
unsigned long* lpdwRequestedCID = lpPktUnifiedCharSelectReq->dwCID;
int nSelectedCount = 0;
std::fill_n(dwSelectedCID, size_t(USER_INFO::MAX_CHAR_NUM), 0);
// <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Դ<EFBFBD>.
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD> <20><> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD><C6B4><EFBFBD> <20>Ǵ<EFBFBD><C7B4>Ѵ<EFBFBD>.
unsigned char cRestrictedPart1ToPart2Level =
CServerSetup::GetInstance().GetRestrictedPart1ToPart2Level();
for(int nCount = 0; nCount < USER_INFO::MAX_CHAR_NUM; ++nCount)
{
unsigned long dwBindCID = lpdwRequestedCID[nCount];
const UnifiedCharData* lpUnifiedCharData = 0;
if (0 == userInfo.CharID[nCount] &&
0 != dwBindCID && !userInfo.HasCharacter(dwBindCID) &&
0 != (lpUnifiedCharData = lpSessionData->GetUnifiedCharData(dwBindCID)) &&
(lpUnifiedCharData->cOldServerGroupID < UnifiedConst::Part1 ||
(lpUnifiedCharData->cOldServerGroupID == UnifiedConst::Part1Unified &&
cRestrictedPart1ToPart2Level <= lpUnifiedCharData->cLevel)))
{
dwSelectedCID[nCount] = dwBindCID;
++nSelectedCount;
}
}
if (0 < nSelectedCount && CClass::MAX_RACE == eRace)
{
usError = PktUnifiedCharSelectAck::PACKET_ERROR;
}
else if(0 == usError)
{
// <20>ѹ<EFBFBD><D1B9><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> / <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
CCharBackupItemData backupData[USER_INFO::MAX_CHAR_NUM];
for(int nCount = 0; nCount < USER_INFO::MAX_CHAR_NUM; ++nCount)
{
if(0 != dwSelectedCID[nCount])
{
if(0 == (lpCharacterData = charDataMgr.GetLogoutData(dwSelectedCID[nCount])))
{
ERRLOG3(g_Log, "UID:%10u / CID:%10u / ServerGroupID:%d / <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : ij<><C4B3><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD>",
dwUID, dwSelectedCID[nCount], cSelectedServerGroupID);
usError = PktUnifiedCharSelectAck::UNIFIED_CHAR_READ_ERROR;
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
backupData[nCount].BackupData(*lpSessionData, *lpCharacterData);
// Part2 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if (!lpCharacterData->ConvertToPart2Item(true))
{
ERRLOG3(g_Log, "UID:%10u / CID:%10u / ServerGroupID:%d / <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : ij<><C4B3><EFBFBD><EFBFBD> Part2<74><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
dwUID, dwSelectedCID[nCount], cSelectedServerGroupID);
usError = PktUnifiedCharSelectAck::UNIFIED_CHAR_WRITE_ERROR;
}
// UnifiedCharInfo<66><6F><EFBFBD><EFBFBD>, ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȣ<EFBFBD><C8A3> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
else if (!lpSessionData->ChangeUnifiedCharServerGroupID(
dbComponent, dwUID, dwSelectedCID[nCount], cAgentServerType))
{
usError = PktUnifiedCharSelectAck::UNIFIED_CHAR_WRITE_ERROR;
}
else if (!lpCharacterData->ForceUpdateDBAllData(dbComponent))
{
ERRLOG3(g_Log, "UID:%10u / CID:%10u / ServerGroupID:%d / <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
dwUID, dwSelectedCID[nCount], cSelectedServerGroupID);
usError = PktUnifiedCharSelectAck::UNIFIED_CHAR_WRITE_ERROR;
}
if(0 != usError)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٷ<EFBFBD> <20>ѹ<EFBFBD>;;
break;
}
// <20>籹ü<E7B1B9><C3BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //
if(lpSessionData->GetAccountNation()==Creature::ALMIGHTY_PIRATE)
{
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD≯鼭, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޸<EFBFBD><DEB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ī<><C4AB><EFBFBD>׶<EFBFBD>Ʈ<EFBFBD><C6AE> <20>ٲ<EFBFBD><D9B2>ش<EFBFBD>. */
if(lpCharacterData->GetRace()==CClass::HUMAN)
{
lpSessionData->SetAccountNation(Creature::KARTERANT);
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD≯鼭, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ĭ<EFBFBD><C4AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޸<EFBFBD>ī<EFBFBD><C4AB><EFBFBD>Ʒ<EFBFBD> <20>ٲ<EFBFBD><D9B2>ش<EFBFBD>. */
else if(lpCharacterData->GetRace()==CClass::AKHAN)
{
lpSessionData->SetAccountNation(Creature::MERKADIA);
}
}
// ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ, <20>ź<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> //
/*unsigned long dwMemberCID[CFriendList::MAX_FRIENDS_NUM] = {0,};
unsigned long dwDeleteCID[CFriendList::MAX_FRIENDS_NUM] = {0,};
// ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> CID <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>´<EFBFBD>. //
CFriendList friendList = lpCharacterData->GetFriendList();
friendList.GetCIDList(dwMemberCID);
for(unsigned char cIndex = 0; cIndex < friendList.GetFriendNum(); cIndex++)
{
CFriendList::Rebind* lpRebind = friendList.GetFriend(dwMemberCID[cIndex]);
if(lpCharacterData->GetRace()==CClass::HUMAN)
{
if(lpRebind->GetClass()>=CClass::Combatant)
{
dwDeleteCID[cIndex] = dwMemberCID[cIndex];
}
}
else if(lpCharacterData->GetRace()==CClass::AKHAN)
{
if(lpRebind->GetClass()<CClass::Combatant)
{
dwDeleteCID[cIndex] = dwMemberCID[cIndex];
}
}
// <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //
if(dwDeleteCID[cIndex])
{
friendList.Remove(dwDeleteCID[cIndex]);
}
}
memset(dwMemberCID, 0, sizeof(unsigned long) * CFriendList::MAX_FRIENDS_NUM);
memset(dwDeleteCID, 0, sizeof(unsigned long) * CFriendList::MAX_FRIENDS_NUM);
CBanList banList = lpCharacterData->GetBanList();
banList.GetCIDList(dwMemberCID);
for(unsigned char cIndex = 0; cIndex < banList.GetBanNum(); cIndex++)
{
CBanList::Rebind* lpRebind = banList.GetBan(dwMemberCID[cIndex]);
if(lpCharacterData->GetRace()==CClass::HUMAN)
{
if(lpRebind->GetClass()>=CClass::Combatant)
{
dwDeleteCID[cIndex] = dwMemberCID[cIndex];
}
}
else if(lpCharacterData->GetRace()==CClass::AKHAN)
{
if(lpRebind->GetClass()<CClass::Combatant)
{
dwDeleteCID[cIndex] = dwMemberCID[cIndex];
}
}
// <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //
if(dwDeleteCID[cIndex])
{
banList.Remove(dwDeleteCID[cIndex]);
}
}*/
}
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD>ε<EFBFBD><CEB5>Ѵ<EFBFBD>.
if(0 == usError)
{
// <20><><EFBFBD>õ<EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>Ѹ<EFBFBD><D1B8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if(0 == userInfo.GetCharacterNum())
{
unsigned char cOldAccountNation = lpSessionData->GetAccountNation();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>´<EFBFBD><C2B4><EFBFBD> üũ<C3BC><C5A9> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if(Creature::ALMIGHTY_PIRATE == cSelectedNation)
{
lpSessionData->SetAccountNation(Creature::ALMIGHTY_PIRATE);
}
else
{
lpSessionData->SetAccountNation(
CClass::HUMAN == eRace ? Creature::KARTERANT : Creature::MERKADIA);
}
if (cOldAccountNation != lpSessionData->GetAccountNation())
{
INFLOG3(g_Log, "UID:%10u / OldAccountNation:%s / AccountNation:%s / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
dwUID, Creature::GetShortNationName(cOldAccountNation),
Creature::GetShortNationName(lpSessionData->GetAccountNation()));
}
}
if(!lpSessionData->UpdateCharacterBinding(dbComponent, dwSelectedCID))
{
ERRLOG2(g_Log, "UID:%10u / ServerGroupID:%d / <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>",
dwUID, cSelectedServerGroupID);
usError = PktUnifiedCharSelectAck::UNIFIED_CHAR_WRITE_ERROR;
}
else
{
// â<><C3A2><><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD>!
lpSessionData->SetOldServerGroupID(cAgentServerType);
}
}
if(0 != usError)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD> Rollback<63>Ѵ<EFBFBD>.
for(int nCount = 0; nCount < USER_INFO::MAX_CHAR_NUM; ++nCount)
{
if(0 != dwSelectedCID[nCount] && backupData[nCount].IsBackupedData())
{
if(0 == (lpCharacterData = charDataMgr.GetLogoutData(dwSelectedCID[nCount])))
{
ERRLOG3(g_Log, "UID:%10u / CID:%10u / ServerGroupID:%d / <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : ij<><C4B3><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD>",
dwUID, dwSelectedCID[nCount], cSelectedServerGroupID);
}
else
{
backupData[nCount].RestoreData(*lpCharacterData);
lpCharacterData->ForceUpdateDBAllData(dbComponent);
lpSessionData->ChangeUnifiedCharServerGroupID(dbComponent,
dwUID, dwSelectedCID[nCount], backupData[nCount].GetOldServerGroupID());
}
}
}
}
}
}
GET_SINGLE_DISPATCH(lpAuthDispatch, CAuthDispatch,
CAuthDispatch::GetDispatchTable());
if(0 != lpAuthDispatch && SendPacket::UnifiedCharSelectAck(
lpAuthDispatch->GetSendStream(), dwUID, dwRequestKey, usError))
{
if(0 == usError)
{
INFLOG2(g_Log, "UID:%10u / ServerGroupID:%d / ij<><C4B3><EFBFBD><EFBFBD> <20><> â<><C3A2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
dwUID, cSelectedServerGroupID);
}
}
else
{
ERRLOG2(g_Log, "UID:%10u / ServerGroupID:%d / ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : "
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD> <20><><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.", dwUID, cSelectedServerGroupID);
}
}
}