Files
Client/Server/RylServerProject/RylDBAgentServer/Network/SendPacket/SendAdminTool.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

244 lines
9.3 KiB
C++

#include "stdafx.h"
#include "SendAdminTool.h"
#include <Network/Packet/PacketStruct/CharAdminPacket.h>
#include <Network/Packet/PacketStruct/GameEventPacket.h>
#include <Network/Packet/PacketStruct/CharLoginOutPacketStruct.h>
#include <Network/Dispatch/AdminToolDispatch.h>
#include <Network/Packet/WrapPacket.h>
#include <Network/Packet/PacketCommand.h>
#include <Utility/Setup/ServerSetup.h>
#include <DataStorage/StoreData.h>
#include <DataStorage/CharacterData.h>
#include <Log/ServerLog.h>
namespace DBAgent
{
namespace SendPacket
{
bool ItemQtyCheck(unsigned long dwItemTypeID, unsigned long dwItemQty,
unsigned long dwCurrentItemQty, time_t tStartTime, time_t tEndTime,
unsigned char cType, unsigned short usError)
{
PktItemQtyControl pktItemQtyControl;
memset(&pktItemQtyControl, 0, sizeof(PktItemQtyControl));
pktItemQtyControl.m_dwItemTypeID = dwItemTypeID;
pktItemQtyControl.m_dwItemQty = dwItemQty;
pktItemQtyControl.m_dwCurrentItemQty = dwCurrentItemQty;
pktItemQtyControl.m_tStartTime = tStartTime;
pktItemQtyControl.m_tEndTime = tEndTime;
pktItemQtyControl.m_cType = cType;
pktItemQtyControl.m_cGroup = CServerSetup::GetInstance().GetServerGroup();
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktItemQtyControl),
sizeof(PktItemQtyControl), CmdItemQtyCheck, 0, usError))
{
DBAgent::CAdminToolDispatch::GetDispatchTable().Process(
CSendPacketAllServer(reinterpret_cast<char*>(&pktItemQtyControl),
sizeof(PktItemQtyControl), CmdItemQtyCheck));
return true;
}
return false;
}
bool AdminToolGetDataAck(CSendStream& SendStream, PktAdminToolGetData::GetDataType dataType,
unsigned long dwRequestKey, unsigned long dwUID, unsigned long dwCID,
const char* lpData, unsigned long dwDataSize, unsigned short usError,
unsigned char cOldServerGroupID)
{
// ÃÖ´ë ÆÐŶ Å©±âº¸´Ù Å©¸é ¿¡·¯
if(sizeof(PktAdminToolGetDataAck) + dwDataSize <= MAX_PACKET_LEN)
{
char szPacket[PktMaxLen];
PktAdminToolGetDataAck* lpPktAdminToolGetDataAck =
reinterpret_cast<PktAdminToolGetDataAck*>(szPacket);
lpPktAdminToolGetDataAck->m_dwRequestKey = dwRequestKey;
lpPktAdminToolGetDataAck->m_dwUID = dwUID;
lpPktAdminToolGetDataAck->m_dwCID = dwCID;
lpPktAdminToolGetDataAck->m_cType = dataType;
lpPktAdminToolGetDataAck->m_cOldServerGroupID = cOldServerGroupID; // Part2Selectable ŸÀÔ¿¡¼­ ÇÊ¿ä.
if(0 != lpData && 0 < dwDataSize)
{
memcpy(lpPktAdminToolGetDataAck + 1, lpData, dwDataSize);
}
else
{
dwDataSize = 0;
}
return SendStream.WrapCompress(szPacket,
static_cast<unsigned short>(sizeof(PktAdminToolGetDataAck) + dwDataSize),
CmdAdminToolGetData, 0, usError);
}
ERRLOG4(g_Log, "UID:%10u / CID:%10u / dwSize:%u / DataType:%d "
"¿î¿µÅø¿¡ µ¥ÀÌÅÍ Àü¼Û ½ÇÆÐ : µ¥ÀÌÅÍ + Çì´õ Å©±â°¡ ÃÖ´ë ÆÐŶ Å©±â ÀÌ»óÀÔ´Ï´Ù",
dwUID, dwCID, dwDataSize, dataType);
return false;
}
bool AdminToolSetDataAck(CSendStream& SendStream, unsigned long dwRequestKey,
unsigned long dwUID, unsigned long dwCID,
unsigned char cType, unsigned short eErrorCode)
{
PktNewAdminToolSetDataAck* lpSetDataAck = reinterpret_cast<PktNewAdminToolSetDataAck*>(
SendStream.GetBuffer(sizeof(PktNewAdminToolSetDataAck)));
if(0 != lpSetDataAck)
{
lpSetDataAck->m_dwRequestKey = dwRequestKey;
lpSetDataAck->m_dwUID = dwUID;
lpSetDataAck->m_dwCID = dwCID;
lpSetDataAck->m_cType = cType;
return SendStream.WrapHeader(sizeof(PktNewAdminToolSetDataAck),
CmdAdminToolSetData, 0, eErrorCode);
}
return false;
}
inline void CopyAndAdvanceDst(char*& lpWritePos, const void* lpData, unsigned long dwSize)
{
memcpy(lpWritePos, lpData, dwSize);
lpWritePos += dwSize;
}
// ij¸¯ÅÍ µ¥ÀÌÅ͸¦ ¿î¿µÅø·Î Àü¼ÛÇÑ´Ù.
bool TotalDataToAdminTool(CSendStream& SendStream, unsigned long dwRequestKey, IN_ADDR peerAddr,
DataStorage::CStoreData& storeData, DataStorage::CCharacterData& characterData)
{
unsigned long dwUID = storeData.GetUID();
unsigned long dwCID = characterData.GetCID();
const unsigned long MAX_CHAR_DATA_SIZE = DBUpdateData::MAX_DBUPDATE_SIZE +
sizeof(unsigned short) * DBUpdateData::MAX_UPDATE_DB;
const unsigned long MAX_CHAR_EXTRA_DATA_SIZE = sizeof(CHAR_INFOEX) +
sizeof(QUEST) + sizeof(HISTORY) + sizeof(CONFIG) + sizeof(STORE_INFO);
const unsigned long MAX_FRIEND_BAN_DATA_SIZE =
std::max(CFriendList::MAX_FRIENDS_NUM * sizeof(FriendInfo),
CBanList::MAX_BAN_NUM * sizeof(BanInfo));
const unsigned long MAX_ADMIN_TOOL_DATA_SIZE = std::max(
std::max(MAX_CHAR_DATA_SIZE, MAX_CHAR_EXTRA_DATA_SIZE), MAX_FRIEND_BAN_DATA_SIZE);
char* szDataBuffer = new char[MAX_ADMIN_TOOL_DATA_SIZE];
if(0 == szDataBuffer)
{
return false;
}
const int MAX_ADDR_LEN = 32;
char szAdminToolAddr[MAX_ADDR_LEN];
_snprintf(szAdminToolAddr, MAX_ADDR_LEN - 1, "%s", inet_ntoa(peerAddr));
szAdminToolAddr[MAX_ADDR_LEN - 1] = 0;
// ------------------------------------------------------------------------------------------
// CHAR_BASIC_DATA Àü¼Û
unsigned long dwCharDataWritten = MAX_ADMIN_TOOL_DATA_SIZE -
sizeof(unsigned short) * DBUpdateData::MAX_UPDATE_DB;
char* szCharData = szDataBuffer + sizeof(unsigned short) * DBUpdateData::MAX_UPDATE_DB;
unsigned short* usSizeArray = reinterpret_cast<unsigned short*>(szDataBuffer);
if(characterData.SerializeOut(szCharData, usSizeArray,
dwCharDataWritten, DBUpdateData::MAX_UPDATE_DB))
{
dwCharDataWritten += sizeof(unsigned short) * DBUpdateData::MAX_UPDATE_DB;
if(SendPacket::AdminToolGetDataAck(SendStream, PktAdminToolGetData::CHAR_BASIC_DATA,
dwRequestKey, dwUID, dwCID, szDataBuffer, dwCharDataWritten, 0))
{
INFLOG3(g_Log, "UID:%10u / CID:%10u / IP:%15s / ¿î¿µÅø·Î CHAR_BASIC_DATA Àü¼Û ¼º°ø", dwUID, dwCID, szAdminToolAddr);
}
}
// ------------------------------------------------------------------------------------------
// CHAR_EXTRA_DATA Àü¼Û
char* szExtraDataPos = szDataBuffer;
CopyAndAdvanceDst(szExtraDataPos, &characterData.GetInfoEx(), sizeof(CHAR_INFOEX));
CopyAndAdvanceDst(szExtraDataPos, &characterData.GetQuest(), sizeof(QUEST));
CopyAndAdvanceDst(szExtraDataPos, &characterData.GetHistory(), sizeof(HISTORY));
CopyAndAdvanceDst(szExtraDataPos, &characterData.GetConfig(), sizeof(CONFIG));
CopyAndAdvanceDst(szExtraDataPos, &storeData.GetStoreInfo(), sizeof(STORE_INFO));
if(SendPacket::AdminToolGetDataAck(SendStream,
PktAdminToolGetData::CHAR_EXTRA_DATA, dwRequestKey, dwUID, dwCID, szDataBuffer,
static_cast<unsigned long>(szExtraDataPos - szDataBuffer), 0))
{
INFLOG3(g_Log, "UID:%10u / CID:%10u / IP:%15s / ¿î¿µÅø·Î CHAR_EXTRA_DATA Àü¼Û ¼º°ø", dwUID, dwCID, szAdminToolAddr);
}
// ---------------------------------------------------------------------------------------------
// CHAR_FRIEND_DATA
// CHAR_BAN_DATA
unsigned long dwFriendBanWritten = MAX_FRIEND_BAN_DATA_SIZE;
if(characterData.GetFriendList().SerializeOut(szDataBuffer, dwFriendBanWritten))
{
if(SendPacket::AdminToolGetDataAck(SendStream, PktAdminToolGetData::CHAR_FRIEND_DATA,
dwRequestKey, dwUID, dwCID, szDataBuffer, dwFriendBanWritten, 0))
{
INFLOG3(g_Log, "UID:%10u / CID:%10u / IP:%15s / ¿î¿µÅø·Î CHAR_FRIEND_DATA Àü¼Û ¼º°ø", dwUID, dwCID, szAdminToolAddr);
}
}
dwFriendBanWritten = MAX_FRIEND_BAN_DATA_SIZE;
if(characterData.GetBanList().SerializeOut(szDataBuffer, dwFriendBanWritten))
{
if(SendPacket::AdminToolGetDataAck(SendStream, PktAdminToolGetData::CHAR_BAN_DATA,
dwRequestKey, dwUID, dwCID, szDataBuffer, dwFriendBanWritten, 0))
{
INFLOG3(g_Log, "UID:%10u / CID:%10u / IP:%15s / ¿î¿µÅø·Î CHAR_BAN_DATA Àü¼Û ¼º°ø", dwUID, dwCID, szAdminToolAddr);
}
}
// ---------------------------------------------------------------------------------------------
// STORE_12_DATA
if(SendPacket::AdminToolGetDataAck(SendStream, PktAdminToolGetData::STORE_12_DATA,
dwRequestKey, dwUID, dwCID, reinterpret_cast<const char*>(&storeData.GetStore1()), sizeof(STORE), 0))
{
INFLOG3(g_Log, "UID:%10u / CID:%10u / IP:%15s / ¿î¿µÅø·Î STORE_12_DATA Àü¼Û ¼º°ø", dwUID, dwCID, szAdminToolAddr);
}
// ---------------------------------------------------------------------------------------------
// STORE_34_DATA
if(SendPacket::AdminToolGetDataAck(SendStream, PktAdminToolGetData::STORE_34_DATA,
dwRequestKey, dwUID, dwCID, reinterpret_cast<const char*>(&storeData.GetStore2()), sizeof(STORE), 0))
{
INFLOG3(g_Log, "UID:%10u / CID:%10u / IP:%15s / ¿î¿µÅø·Î STORE_34_DATA Àü¼Û ¼º°ø", dwUID, dwCID, szAdminToolAddr);
}
delete [] szDataBuffer;
return true;
}
}
}