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:
@@ -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>/ij<><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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user