Files
Client/Server/DBProcess/RenumberingItemSerial/RenumberingItemSerial.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

290 lines
9.1 KiB
C++

// RenumberingItemSerial.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//
#include "stdafx.h"
#include <RylDBLibrary/RylDBLibrary.h>
#include <RylDBLibrary/RylDBStoreCommand.h>
#include <RylDBLibrary/RylDBCharCommand.h>
#include <Item/RebalanceConvert/RebalanceItem.h>
#include <Network/Packet/PacketStruct/ServerInfo.h>
#include <Utility/Setup/ServerSetup.h>
#include <Log/ServerLog.h>
CServerLog g_ItemLog("RenumberItemUID");
class CDBRenumberingItemUID :
public IDBCharItemProcess,
public IDBCharItemExProcess,
public IDBStoreProcess
{
public:
// SkillDataMap을 넣으면, 스킬북을 제거하고 컨버팅한다.
CDBRenumberingItemUID(CDBItemSerialMgr& dbItemSerialMgr);
virtual ConvertResult operator() (RylDBCommand::CCharItem& charItem_InOut);
virtual ConvertResult operator() (RylDBCommand::CCharItemEx& charItemEx_InOut);
virtual ConvertResult operator() (RylDBCommand::CUnifiedStore1& unifiedStore1_InOut);
virtual ConvertResult operator() (RylDBCommand::CUnifiedStore2& unifiedStore2_InOut);
bool RenumberingItemUID(unsigned long dwUID, unsigned long dwCID,
const char* szOriginalData, unsigned long dwOriginalSize,
char* szChangedData, unsigned long& dwChangedSize_InOut, const char* szContainerName);
private:
CDBItemSerialMgr& m_DBItemSerialMgr;
};
void PrintUsage()
{
printf("RenumberingItemSerial DBAddress DBName DBAccount DBPassword ServerGroupNum(0~9)");
}
int _tmain(int argc, _TCHAR* argv[])
{
// 전 캐릭을 다 돌면서 itemUID을 수정한다.
// 필요한 것은 서버군 ID뿐이다.
CoInitialize(0);
int nServerGroup = atoi(argv[5]);
SERVER_ID serverID;
serverID.sID.Type = CServerSetup::AuthServer;
serverID.sID.Group = nServerGroup;
serverID.sID.Channel = 0;
serverID.sID.ID = 0;
HRESULT hr = S_OK;
ATL::CDataSource dataSource;
ATL::CSession Session;
CDBItemSerialMgr dbItemSerialMgr;
#define LOG_CONVERT0(str) { ERRLOG0(g_Log, (str)); printf(str "\n"); }
#define LOG_CONVERT1(str, arg1) { ERRLOG1(g_Log, (str), (arg1)); printf(str "\n", (arg1)); }
#define LOG_CONVERT2(str, arg1, arg2) { ERRLOG2(g_Log, (str), (arg1), (arg2)); printf(str "\n", (arg1), (arg2)); }
if(FAILED(hr = CRylDBProcess::ConnectDB(dataSource, argv[1], argv[2], argv[3], argv[4])))
{
LOG_CONVERT1("Connect DB failed : hr:0x%08X", hr);
}
else if(FAILED(hr = Session.Open(dataSource)))
{
LOG_CONVERT1("Open session failed : hr:0x%08X", hr);
}
else if(FAILED(hr = dbItemSerialMgr.ClearAllSerialDB(Session)))
{
LOG_CONVERT1("Clear itemSerial failed : hr:0x%08X", hr);
}
else if(FAILED(hr = dbItemSerialMgr.LoadItemSerialDB(Session, serverID.dwID)))
{
LOG_CONVERT1("Insert itemSerial failed : hr:0x%08X", hr);
}
else
{
if(FAILED(hr = dbItemSerialMgr.SaveItemSerialDB(Session, serverID.dwID)))
{
LOG_CONVERT1("ItemSerial save failed : hr:0x%08X", hr);
}
CRylDBProcess rylDBProcess(Session);
CConsoleCounter consoleCounter(1000);
CDBRenumberingItemUID renumberingItemUID(dbItemSerialMgr);
// 통합 창고 아이템 시리얼 다시 매기기
if(FAILED(hr = rylDBProcess.UnifiedStore1(renumberingItemUID, consoleCounter)))
{
LOG_CONVERT1("UnifiedStore1 process failed : hr:0x%08X", hr);
}
else if(FAILED(hr = rylDBProcess.UnifiedStore2(renumberingItemUID, consoleCounter)))
{
LOG_CONVERT1("UnifiedStore2 process failed : hr:0x%08X", hr);
}
// CharItem 아이템 시리얼 다시 매기기
else if(FAILED(hr = rylDBProcess.CharItem(renumberingItemUID, consoleCounter)))
{
LOG_CONVERT1("CharItem process failed : hr:0x%08X", hr);
}
// CharItemEx 아이템 시리얼 다시 매기기
else if(FAILED(hr = rylDBProcess.CharItemEx(renumberingItemUID, consoleCounter)))
{
LOG_CONVERT1("CharItemEx process failed : hr:0x%08X", hr);
}
// 최종 아이템 시리얼 저장.
else if(FAILED(hr = dbItemSerialMgr.SaveItemSerialDB(Session, serverID.dwID)))
{
LOG_CONVERT1("ItemSerial save failed : hr:0x%08X", hr);
}
}
INFLOG0(g_Log, "Convert Complete");
Session.Close();
dataSource.Close();
CoUninitialize();
return 0;
}
CDBRenumberingItemUID::CDBRenumberingItemUID(CDBItemSerialMgr& dbItemSerialMgr)
: m_DBItemSerialMgr(dbItemSerialMgr)
{
}
ConvertResult CDBRenumberingItemUID::operator()(RylDBCommand::CCharItem& charItem_InOut)
{
bool bChanged = false;
const EQUIP& equip_In = charItem_InOut.GetEquip();
const INVEN& inven_In = charItem_InOut.GetInven();
const EXTRA& extra_In = charItem_InOut.GetExtra();
EQUIP equip_Out;
INVEN inven_Out;
EXTRA extra_Out;
memset(&equip_Out, 0, sizeof(EQUIP));
memset(&inven_Out, 0, sizeof(INVEN));
memset(&extra_Out, 0, sizeof(EXTRA));
if (RenumberingItemUID(0, charItem_InOut.GetCID(), equip_In.Data,
equip_In.dwSize, equip_Out.Data, equip_Out.dwSize, "EQUIP") &&
RenumberingItemUID(0, charItem_InOut.GetCID(), inven_In.Data,
inven_In.dwSize, inven_Out.Data, inven_Out.dwSize, "INVEN") &&
RenumberingItemUID(0, charItem_InOut.GetCID(), extra_In.Data,
extra_In.dwSize, extra_Out.Data, extra_Out.dwSize, "EXTRA"))
{
bChanged = true;
charItem_InOut.SetEquip(equip_Out);
charItem_InOut.SetInven(inven_Out);
charItem_InOut.SetExtra(extra_Out);
}
return bChanged ? CONVERT_FORCE_WRITE : CONVERT_DO_NOT_WRITE;
}
ConvertResult CDBRenumberingItemUID::operator()(RylDBCommand::CCharItemEx& charItemEx_InOut)
{
bool bChanged = false;
const EXCHANGE& exchange_In = charItemEx_InOut.GetExchange();
const TEMPINVEN& tempInven_In = charItemEx_InOut.GetTempInven();
EXCHANGE exchange_Out;
TEMPINVEN tempInven_Out;
memset(&exchange_Out, 0, sizeof(EXCHANGE));
memset(&tempInven_Out, 0, sizeof(TEMPINVEN));
if (RenumberingItemUID(0, charItemEx_InOut.GetCID(), exchange_In.Data,
exchange_In.dwSize, exchange_Out.Data, exchange_Out.dwSize, "EXCHANGE") &&
RenumberingItemUID(0, charItemEx_InOut.GetCID(), tempInven_In.Data,
tempInven_In.dwSize, tempInven_Out.Data, tempInven_Out.dwSize, "TEMPINVEN"))
{
bChanged = true;
charItemEx_InOut.SetExchange(exchange_Out);
charItemEx_InOut.SetTempInven(tempInven_Out);
}
return bChanged ? CONVERT_FORCE_WRITE : CONVERT_DO_NOT_WRITE;
}
ConvertResult CDBRenumberingItemUID::operator()(RylDBCommand::CUnifiedStore1& unifiedStore1_InOut)
{
bool bChanged = false;
const STORE& store_In = unifiedStore1_InOut.GetStore();
STORE store_Out;
memset(&store_Out, 0, sizeof(STORE));
if (RenumberingItemUID(unifiedStore1_InOut.GetUID(), 0, store_In.Data,
store_In.dwSize, store_Out.Data, store_Out.dwSize, "UnifiedStore1"))
{
bChanged = true;
unifiedStore1_InOut.SetStore(store_Out);
}
return bChanged ? CONVERT_FORCE_WRITE : CONVERT_DO_NOT_WRITE;
}
ConvertResult CDBRenumberingItemUID::operator()(RylDBCommand::CUnifiedStore2& unifiedStore2_InOut)
{
bool bChanged = false;
const STORE& store_In = unifiedStore2_InOut.GetStore();
STORE store_Out;
memset(&store_Out, 0, sizeof(STORE));
if (RenumberingItemUID(unifiedStore2_InOut.GetUID(), 0, store_In.Data,
store_In.dwSize, store_Out.Data, store_Out.dwSize, "UnifiedStore2"))
{
bChanged = true;
unifiedStore2_InOut.SetStore(store_Out);
}
return bChanged ? CONVERT_FORCE_WRITE : CONVERT_DO_NOT_WRITE;
}
bool CDBRenumberingItemUID::RenumberingItemUID(unsigned long dwUID, unsigned long dwCID,
const char* szOriginalData, unsigned long dwOriginalSize,
char* szChangedData, unsigned long& dwChangedSize_InOut,
const char* szContainerName)
{
dwChangedSize_InOut = dwOriginalSize;
if(0 != dwOriginalSize)
{
memcpy(szChangedData, szOriginalData, dwOriginalSize);
char* szDataPos = szChangedData;
const char* szDataEnd = szChangedData + dwChangedSize_InOut;
unsigned __int64 dwNewUID = 0LL;
for(; szDataPos < szDataEnd; )
{
Item::ItemData* lpItemData = reinterpret_cast<Item::ItemData*>(szDataPos);
dwNewUID = m_DBItemSerialMgr.GetNewItemSerial();
INFLOG5(g_ItemLog, "[%s]/ UID:%10u / CID:%10u / OldItemSerial:0x%016I64X / "
"NewItemSerial:0x%016I64X / Changed item serial",
szContainerName, dwUID, dwCID, lpItemData->m_dwUID, dwNewUID);
lpItemData->m_dwUID = dwNewUID;
szDataPos += lpItemData->m_cItemSize;
if(0 == lpItemData->m_cItemSize)
{
// 데이터가 이상합니다.
INFLOG4(g_Log, "[%s]/ UID:%10u / CID:%10u / Invaild data size : %10u",
szContainerName, dwUID, dwCID, dwOriginalSize);
break;
}
}
return true;
}
return false;
}