Files
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

945 lines
32 KiB
C++

#include "stdafx.h"
#include <Creature/Character/Character.h>
#include <Item/Container/ExchangeContainer.h>
#include <Network/Packet/PacketStruct/CharCommunityPacket.h>
#include "ItemLog.h"
#include "GameLog.h"
#include "LogStruct.h"
#include "LogCommands.h"
void GAMELOG::LogMoveItem(const CCharacter& character, const TakeType takeType,
const sMinItemInfo& minItemInfo, const unsigned short eError)
{
CGameLog& gameLog = CGameLog::GetInstance();
// MoveItem Log
sMoveItemLog* lpMoveItemLog = reinterpret_cast<sMoveItemLog*>(gameLog.ReserveBuffer(
static_cast<unsigned short>(sizeof(sMoveItemLog) + MAX_ITEM_DUMP_SIZE)));
if (NULL != lpMoveItemLog)
{
unsigned short nUsage = static_cast<unsigned short>(sizeof(sMoveItemLog));
lpMoveItemLog->InitLogBase(character.GetUID(), character.GetCID(), character.GetCurrentPos(),
gameLog.GetLogTime(), CMD::MOVE_ITEM, static_cast<ERRType>(eError));
lpMoveItemLog->InitMoveItemLog(takeType, minItemInfo);
if (0 != eError)
{
// edith 2009.08.31 아이템 덤프를 남기지 않게 수정.
int nBufferSize = sizeof(GAMELOG::sItemDump);
char* pBuffer = reinterpret_cast<char*>(lpMoveItemLog+1);
GAMELOG::sItemDump* lpItemDump = reinterpret_cast<GAMELOG::sItemDump*>(pBuffer);
std::fill_n(lpItemDump->m_usDataSize, int(GAMELOG::sItemDump::MAX_DUMP), 0);
nUsage += nBufferSize;
// int nBufferSize = MAX_ITEM_DUMP_SIZE;
// character.ItemDump(reinterpret_cast<char*>(lpMoveItemLog+1), &nBufferSize);
// nUsage += nBufferSize;
}
gameLog.UseComplete(nUsage);
}
else
{
ERRLOG1(g_Log, "CID:%10u 의 아이템 이동 로그를 남길 수 없습니다. : 버퍼를 할당할 수 없습니다.",
character.GetCID());
}
}
void GAMELOG::LogSwapItem(const CCharacter& character, const TakeType srcTake, const TakeType dstTake,
Item::CItem* lpSrcItem, Item::CItem* lpDstItem, const unsigned short eError)
{
CGameLog& gameLog = CGameLog::GetInstance();
// SwapItem Log
sSwapItemLog* lpSwapItemLog = reinterpret_cast<sSwapItemLog*>(gameLog.ReserveBuffer(
static_cast<unsigned short>(sizeof(sSwapItemLog) + MAX_ITEM_DUMP_SIZE)));
if (NULL != lpSwapItemLog)
{
unsigned short nUsage = static_cast<unsigned short>(sizeof(sSwapItemLog));
lpSwapItemLog->InitLogBase(character.GetUID(), character.GetCID(), character.GetCurrentPos(),
gameLog.GetLogTime(), CMD::SWAP_ITEM, static_cast<ERRType>(eError));
lpSwapItemLog->InitSwapItemLog(srcTake, dstTake, lpSrcItem, lpDstItem);
if (0 != eError)
{
int nBufferSize = MAX_ITEM_DUMP_SIZE;
character.ItemDump(reinterpret_cast<char*>(lpSwapItemLog+1), &nBufferSize);
nUsage += nBufferSize;
}
gameLog.UseComplete(nUsage);
}
else
{
ERRLOG1(g_Log, "CID:%10u 의 아이템 스왑 로그를 남길 수 없습니다. : 버퍼를 할당할 수 없습니다.",
character.GetCID());
}
}
void GAMELOG::LogUseItem(const CCharacter& character, const Item::ItemPos usePos,
Item::CItem* lpUseItem, const unsigned short eError)
{
CGameLog& gameLog = CGameLog::GetInstance();
// UseItem Log
sUseItemLog* lpUseItemLog = reinterpret_cast<sUseItemLog*>(gameLog.ReserveBuffer(
static_cast<unsigned short>(sizeof(sUseItemLog) + MAX_ITEM_DUMP_SIZE)));
if (NULL != lpUseItemLog)
{
unsigned short nUsage = static_cast<unsigned short>(sizeof(sUseItemLog));
lpUseItemLog->InitLogBase(character.GetUID(), character.GetCID(), character.GetCurrentPos(),
gameLog.GetLogTime(), CMD::USE_ITEM, static_cast<ERRType>(eError));
lpUseItemLog->InitUseItemLog(usePos, lpUseItem);
if (0 != eError)
{
int nBufferSize = MAX_ITEM_DUMP_SIZE;
character.ItemDump(reinterpret_cast<char*>(lpUseItemLog+1), &nBufferSize);
nUsage += nBufferSize;
}
gameLog.UseComplete(nUsage);
}
else
{
ERRLOG1(g_Log, "CID:%10u 의 아이템 사용 로그를 남길 수 없습니다. : 버퍼를 할당할 수 없습니다.",
character.GetCID());
}
}
void GAMELOG::LogUseLottery(const CCharacter& character, Item::CItem* lpGetItem, const unsigned short eError)
{
CGameLog& gameLog = CGameLog::GetInstance();
// UseLottery Log
sUseLotteryLog* lpUseLotteryLog = reinterpret_cast<sUseLotteryLog*>(gameLog.ReserveBuffer(
static_cast<unsigned short>(sizeof(sUseLotteryLog) + MAX_ITEM_DUMP_SIZE)));
if (NULL != lpUseLotteryLog)
{
unsigned short nUsage = static_cast<unsigned short>(sizeof(sUseLotteryLog));
lpUseLotteryLog->InitLogBase(character.GetUID(), character.GetCID(), character.GetCurrentPos(),
gameLog.GetLogTime(), CMD::USE_LOTTERY, static_cast<ERRType>(eError));
lpUseLotteryLog->InitUseLotteryLog(lpGetItem);
if (0 != eError)
{
int nBufferSize = MAX_ITEM_DUMP_SIZE;
character.ItemDump(reinterpret_cast<char*>(lpUseLotteryLog+1), &nBufferSize);
nUsage += nBufferSize;
}
gameLog.UseComplete(nUsage);
}
else
{
ERRLOG1(g_Log, "CID:%10u 의 아이템 사용 로그를 남길 수 없습니다. : 버퍼를 할당할 수 없습니다.",
character.GetCID());
}
}
void GAMELOG::LogSplitItem(const CCharacter& character, const TakeType splitTake,
Item::CItem* lpPrevItem, Item::CItem* lpSplitItem, const unsigned short eError)
{
CGameLog& gameLog = CGameLog::GetInstance();
// SplitItem Log
sSplitItemLog* lpSplitItemLog = reinterpret_cast<sSplitItemLog*>(gameLog.ReserveBuffer(
static_cast<unsigned short>(sizeof(sSplitItemLog) + MAX_ITEM_DUMP_SIZE)));
if (NULL != lpSplitItemLog)
{
unsigned short nUsage = static_cast<unsigned short>(sizeof(sSplitItemLog));
lpSplitItemLog->InitLogBase(character.GetUID(), character.GetCID(), character.GetCurrentPos(),
gameLog.GetLogTime(), CMD::SPLIT_ITEM, static_cast<GAMELOG::ERRType>(eError));
lpSplitItemLog->InitSplitItemLog(splitTake, lpPrevItem, lpSplitItem);
if (0 != eError)
{
int nBufferSize = MAX_ITEM_DUMP_SIZE;
character.ItemDump(reinterpret_cast<char*>(lpSplitItemLog+1), &nBufferSize);
nUsage += nBufferSize;
}
gameLog.UseComplete(nUsage);
}
else
{
ERRLOG1(g_Log, "CID:%10u 의 아이템 스플릿 로그를 남길 수 없습니다. : 버퍼를 할당할 수 없습니다.",
character.GetCID());
}
}
void GAMELOG::LogPickupItem(const CCharacter& character, const Item::ItemPos pickupPos,
Item::CItem* lpItem, const unsigned long dwGold, const unsigned short eError)
{
CGameLog& gameLog = CGameLog::GetInstance();
// PickupItem Log
sPickupItemLog* lpPickupItemLog = reinterpret_cast<sPickupItemLog*>(gameLog.ReserveBuffer(
static_cast<unsigned short>(sizeof(sPickupItemLog) + Item::MAX_ITEM_SIZE + MAX_ITEM_DUMP_SIZE)));
if (NULL != lpPickupItemLog)
{
unsigned short nUsage = static_cast<unsigned short>(sizeof(sPickupItemLog));
lpPickupItemLog->InitLogBase(character.GetUID(), character.GetCID(), character.GetCurrentPos(),
gameLog.GetLogTime(), CMD::PICKUP_ITEM, static_cast<GAMELOG::ERRType>(eError));
size_t nItemSize = Item::MAX_ITEM_SIZE;
if (0 == eError && 0 == dwGold && NULL != lpItem)
{
if (!lpItem->SerializeOut(reinterpret_cast<char*>(lpPickupItemLog+1), nItemSize))
{
ERRLOG1(g_Log, "CID:%10u 아이템 SerializeOut에 실패했습니다.", character.GetCID());
}
nUsage += static_cast<unsigned short>(nItemSize);
}
else
{
nItemSize = 0;
}
lpPickupItemLog->InitPickupItemLog(dwGold, pickupPos);
if (0 != eError)
{
int nBufferSize = MAX_ITEM_DUMP_SIZE;
character.ItemDump(reinterpret_cast<char*>(lpPickupItemLog+1) + nItemSize, &nBufferSize);
nUsage += nBufferSize;
}
gameLog.UseComplete(nUsage);
}
else
{
ERRLOG1(g_Log, "CID:%10u 의 아이템 집기 로그를 남길 수 없습니다. : 버퍼를 할당할 수 없습니다.",
character.GetCID());
}
}
// DROP_ITEM
void GAMELOG::LogDropItem(const CCharacter& character, const Item::ItemPos dropFrom,
Item::CItem* lpItem, const unsigned long dwGold, const unsigned short eError)
{
CGameLog& gameLog = CGameLog::GetInstance();
// DropItem Log
sDropItemLog* lpDropItemLog = reinterpret_cast<sDropItemLog*>(gameLog.ReserveBuffer(
static_cast<unsigned short>(sizeof(sDropItemLog) + Item::MAX_ITEM_SIZE + MAX_ITEM_DUMP_SIZE)));
if (NULL != lpDropItemLog)
{
unsigned short nUsage = static_cast<unsigned short>(sizeof(sDropItemLog));
lpDropItemLog->InitLogBase(character.GetUID(), character.GetCID(), character.GetCurrentPos(),
gameLog.GetLogTime(), CMD::DROP_ITEM, static_cast<GAMELOG::ERRType>(eError));
size_t nItemSize = Item::MAX_ITEM_SIZE;
if (0 == eError && 0 == dwGold && NULL != lpItem)
{
if (!lpItem->SerializeOut(reinterpret_cast<char*>(lpDropItemLog+1), nItemSize))
{
ERRLOG1(g_Log, "CID:%10u 아이템 SerializeOut에 실패했습니다.", character.GetCID());
}
nUsage += static_cast<unsigned short>(nItemSize);
}
else
{
nItemSize = 0;
}
// 나중에 돈 Drop할 경우, 네번째 인자에 돈 값을 넣을 것.
lpDropItemLog->InitDropItemLog(dwGold, dropFrom);
if (0 != eError)
{
int nBufferSize = MAX_ITEM_DUMP_SIZE;
character.ItemDump(reinterpret_cast<char*>(lpDropItemLog+1) + nItemSize, &nBufferSize);
nUsage += nBufferSize;
}
gameLog.UseComplete(nUsage);
}
else
{
ERRLOG1(g_Log, "CID:%10u 의 아이템 버리기 로그를 남길 수 없습니다. : 버퍼를 할당할 수 없습니다.",
character.GetCID());
}
}
void GAMELOG::LogTradeItem(const CAggresiveCreature& creature, const unsigned long dwTraderCID,
const unsigned long dwGold, Item::CItem* lpItem, const Item::ItemPos itemPos,
const unsigned char cCmd, const unsigned short eError)
{
CGameLog& gameLog = CGameLog::GetInstance();
// TradeItem Log
sTradeItemLog* lpTradeItemLog = reinterpret_cast<sTradeItemLog*>(gameLog.ReserveBuffer(
static_cast<unsigned short>(sizeof(sTradeItemLog) + Item::MAX_ITEM_SIZE + MAX_ITEM_DUMP_SIZE)));
if (NULL != lpTradeItemLog)
{
size_t nItemSize = Item::MAX_ITEM_SIZE;
unsigned short nUsage = static_cast<unsigned short>(sizeof(sTradeItemLog));
CMDType LogCmd;
switch (cCmd)
{
case PktTr::TRC_BUY_WITH_GOLD: LogCmd = CMD::BUY_ITEM; break;
case PktTr::TRC_BUY_WITH_MILEAGE: LogCmd = CMD::MEDAL_BUY_ITEM; break;
case PktTr::TRC_SELL: LogCmd = CMD::SELL_ITEM; break;
case PktTr::TRC_BUY_WITH_SKILL_COUPON: LogCmd = CMD::TICKET_BUY_SKILLBOOK; break;
default:
// 로그 기록하지 않는다.
gameLog.UseComplete(0);
return;
}
lpTradeItemLog->InitLogBase(creature.GetUID(), creature.GetCID(),
creature.GetCurrentPos(), gameLog.GetLogTime(), LogCmd, static_cast<GAMELOG::ERRType>(eError));
if (0 == eError && 0 != lpItem)
{
if (!lpItem->SerializeOut(reinterpret_cast<char*>(lpTradeItemLog+1), nItemSize))
{
ERRLOG1(g_Log, "CID:%10u 아이템 SerializeOut에 실패했습니다.", creature.GetCID());
}
nUsage += static_cast<unsigned short>(nItemSize);
}
else
{
nItemSize = 0;
}
lpTradeItemLog->InitTradeItemLog(dwTraderCID, dwGold, itemPos);
if (0 != eError)
{
int nBufferSize = MAX_ITEM_DUMP_SIZE;
creature.ItemDump(reinterpret_cast<char*>(lpTradeItemLog+1) + nItemSize, &nBufferSize);
nUsage += nBufferSize;
}
gameLog.UseComplete(nUsage);
}
else
{
ERRLOG1(g_Log, "CID:%10u 의 아이템 트레이트 로그를 남길 수 없습니다. : 버퍼를 할당할 수 없습니다.",
creature.GetCID());
}
}
void GAMELOG::LogExchangeItem(const CCharacter& character, const unsigned long dwDstCID,
const Item::CExchangeContainer& Exchange, const GAMELOG::CMDType cLogCMD)
{
CGameLog& gameLog = CGameLog::GetInstance();
unsigned short usReserveSize = sizeof(sExchangeItemLog) + EXCHANGE::MAX_EXCHANGE_SIZE;
sExchangeItemLog* pExchangeItemLog = reinterpret_cast<sExchangeItemLog*>(
gameLog.ReserveBuffer(usReserveSize));
if (NULL != pExchangeItemLog)
{
ERRType cErr = 0;
unsigned long dwItemSize = EXCHANGE::MAX_EXCHANGE_SIZE;
if (!Exchange.SerializeOut(reinterpret_cast<char*>(pExchangeItemLog+1), dwItemSize))
{
cErr = 1;
dwItemSize = 0;
}
pExchangeItemLog->InitLogBase(character.GetUID(), character.GetCID(),
character.GetCurrentPos(), gameLog.GetLogTime(), cLogCMD, cErr);
pExchangeItemLog->InitExchangeItemLog(Exchange.GetGold(), dwDstCID,
static_cast<unsigned short>(dwItemSize));
gameLog.UseComplete(sizeof(sExchangeItemLog) + static_cast<unsigned short>(dwItemSize));
}
else
{
ERRLOG1(g_Log, "CID:%10u 교환 로그를 남길 수 없습니다. 버퍼를 얻어올 수 없습니다.",
character.GetCID());
}
}
void GAMELOG::LogInstallSocket(const CCharacter& character, const TakeType GemAndEquip,
Item::CItem* lpGemItem, Item::CItem* lpEquipItem, const unsigned short eError)
{
CGameLog& gameLog = CGameLog::GetInstance();
// InstallSocket Log
sInstallSocketLog* lpInstallSocketLog =
reinterpret_cast<sInstallSocketLog*>(gameLog.ReserveBuffer(
static_cast<unsigned short>(sizeof(sInstallSocketLog) + Item::MAX_ITEM_SIZE * 2 + MAX_ITEM_DUMP_SIZE)));
if (NULL != lpInstallSocketLog)
{
unsigned short nUsage = static_cast<unsigned short>(sizeof(sInstallSocketLog));
lpInstallSocketLog->InitLogBase(character.GetUID(), character.GetCID(),
character.GetCurrentPos(), gameLog.GetLogTime(), CMD::INSTALL_SOCKET_ITEM, static_cast<GAMELOG::ERRType>(eError));
size_t nGemItemSize = 0;
size_t nEquipItemSize = 0;
char* pItemBuffer = reinterpret_cast<char*>(lpInstallSocketLog+1);
if (0 == eError)
{
if (0 != lpGemItem)
{
nGemItemSize = Item::MAX_ITEM_SIZE;
if (!lpGemItem->SerializeOut(pItemBuffer, nGemItemSize))
{
ERRLOG1(g_Log, "CID:%10u 아이템 SerializeOut에 실패했습니다.", character.GetCID());
}
nUsage += static_cast<unsigned short>(nGemItemSize);
pItemBuffer += nGemItemSize;
}
if (0 != lpEquipItem)
{
nEquipItemSize = Item::MAX_ITEM_SIZE;
if (!lpEquipItem->SerializeOut(pItemBuffer, nEquipItemSize))
{
ERRLOG1(g_Log, "CID:%10u 아이템 SerializeOut에 실패했습니다.", character.GetCID());
}
nUsage += static_cast<unsigned short>(nEquipItemSize);
pItemBuffer += nEquipItemSize;
}
}
else
{
int nBufferSize = MAX_ITEM_DUMP_SIZE;
character.ItemDump(pItemBuffer, &nBufferSize);
nUsage += nBufferSize;
}
lpInstallSocketLog->InitInstallSocketLog(GemAndEquip,
static_cast<unsigned char>(nGemItemSize), static_cast<unsigned char>(nEquipItemSize));
gameLog.UseComplete(nUsage);
}
else
{
ERRLOG1(g_Log, "CID:%10u 의 아이템 소켓 박기 로그를 남길 수 없습니다. : 버퍼를 할당할 수 없습니다.",
character.GetCID());
}
}
void GAMELOG::LogUpgradeItem(const CCharacter& character, unsigned long dwCurrentGold,
unsigned long dwUsedGold, const unsigned char cLastUpgradeLevel,
Item::CItem* lpResult, Item::CItem* lpMineral, const unsigned char cValue, unsigned short eError)
{
CGameLog& gameLog = CGameLog::GetInstance();
sUpgradeItemLogV2* lpUpgradeItemLogV2 = reinterpret_cast<sUpgradeItemLogV2*>(
gameLog.ReserveBuffer(sizeof(sUpgradeItemLogV2) + Item::MAX_ITEM_SIZE * 2));
if (NULL != lpUpgradeItemLogV2)
{
unsigned short nUsage = static_cast<unsigned short>(sizeof(sUpgradeItemLogV2));
lpUpgradeItemLogV2->InitLogBase(character.GetUID(), character.GetCID(),
character.GetCurrentPos(), gameLog.GetLogTime(),
CMD::UPGRADE_ITEM_V2, static_cast<GAMELOG::ERRType>(eError));
size_t nResultSize = 0;
size_t nMineralSize = 0;
char* lpItemBuffer = reinterpret_cast<char*>(lpUpgradeItemLogV2 + 1);
if (0 == eError)
{
if (NULL != lpMineral)
{
nMineralSize = Item::MAX_ITEM_SIZE;
if (!lpMineral->SerializeOut(lpItemBuffer, nMineralSize))
{
ERRLOG1(g_Log, "CID:%10u 아이템 SerializeOut에 실패했습니다.", character.GetCID());
}
nUsage += static_cast<unsigned short>(nMineralSize);
lpItemBuffer += nMineralSize;
}
if (NULL != lpResult)
{
nResultSize = Item::MAX_ITEM_SIZE;
if (!lpResult->SerializeOut(lpItemBuffer, nResultSize))
{
ERRLOG1(g_Log, "CID:%10u 아이템 SerializeOut에 실패했습니다.", character.GetCID());
}
nUsage += static_cast<unsigned short>(nResultSize);
lpItemBuffer += nResultSize;
}
}
else
{
int nBufferSize = MAX_ITEM_DUMP_SIZE;
character.ItemDump(lpItemBuffer, &nBufferSize);
nUsage += nBufferSize;
}
lpUpgradeItemLogV2->InitUpgradeItemLog(dwCurrentGold, dwUsedGold, cLastUpgradeLevel,
static_cast<unsigned char>(nMineralSize), static_cast<unsigned char>(nResultSize));
gameLog.UseComplete(nUsage);
}
else
{
ERRLOG1(g_Log, "CID:%10u 의 아이템 업그레이드 로그를 남길 수 없습니다. : 버퍼를 할당할 수 없스니다.",
character.GetCID());
}
}
// REPAIR_ITEM
void GAMELOG::LogRepairItem(const CCharacter& character, Item::CItem* lpRepairedItem,
const unsigned long dwRepairPrice, const unsigned char cPreRepairDurability, const unsigned short eError)
{
CGameLog& gameLog = CGameLog::GetInstance();
sRepairItemLog* lpRepairItemLog = reinterpret_cast<sRepairItemLog*>(
gameLog.ReserveBuffer(sizeof(sRepairItemLog)));
if (NULL != lpRepairItemLog)
{
lpRepairItemLog->InitLogBase(character.GetUID(), character.GetCID(),
character.GetCurrentPos(), gameLog.GetLogTime(), CMD::REPAIR_ITEM, static_cast<GAMELOG::ERRType>(eError));
lpRepairItemLog->InitRepairItemLog(dwRepairPrice, lpRepairedItem, cPreRepairDurability);
gameLog.UseComplete(sizeof(sRepairItemLog));
}
else
{
ERRLOG1(g_Log, "CID:%10u 의 아이템 수리 로그를 남길 수 없습니다. : 버퍼를 할당할 수 없습니다.",
character.GetCID());
}
}
void GAMELOG::LogChangeWeapon(const CCharacter& character, const unsigned char cCurrentHand)
{
CGameLog& gameLog = CGameLog::GetInstance();
sChangeWeaponLog* lpChangeWeaponLog = reinterpret_cast<sChangeWeaponLog*>(
gameLog.ReserveBuffer(sizeof(sChangeWeaponLog)));
if (NULL != lpChangeWeaponLog)
{
lpChangeWeaponLog->InitLogBase(character.GetUID(), character.GetCID(),
character.GetCurrentPos(), gameLog.GetLogTime(), CMD::CHANGE_WEAPON, 0);
lpChangeWeaponLog->InitCurrentHand(cCurrentHand);
gameLog.UseComplete(sizeof(sChangeWeaponLog));
}
else
{
ERRLOG1(g_Log, "CID:%10u 의 무기 바꿈 로그를 남길 수 없습니다. : 버퍼를 할당할 수 없습니다.",
character.GetCID());
}
}
void GAMELOG::LogChangeRide(const CCharacter& character, const unsigned char cCurrentRide)
{
CGameLog& gameLog = CGameLog::GetInstance();
sChangeRideLog* lpChangeRideLog = reinterpret_cast<sChangeRideLog*>(
gameLog.ReserveBuffer(sizeof(sChangeRideLog)));
if (NULL != lpChangeRideLog)
{
lpChangeRideLog->InitLogBase(character.GetUID(), character.GetCID(),
character.GetCurrentPos(), gameLog.GetLogTime(), CMD::CHANGE_RIDE, 0);
lpChangeRideLog->InitCurrentRide(cCurrentRide);
gameLog.UseComplete(sizeof(sChangeRideLog));
}
else
{
ERRLOG1(g_Log, "CID:%10u 의 말 타기 로그를 남길 수 없습니다. : 버퍼를 할당할 수 없습니다.",
character.GetCID());
}
}
// TAKE_GOLD_V2
void GAMELOG::LogTakeGold(const CCharacter& character, unsigned long dwSrcGold, unsigned long dwDstGold,
unsigned long dwMoveGold, unsigned char cSrcPos, unsigned char cDstPos,
unsigned char cPurpose, unsigned short eError)
{
CGameLog& gameLog = CGameLog::GetInstance();
sTakeGoldLogV2* lpTakeGoldLogV2 = reinterpret_cast<sTakeGoldLogV2*>(gameLog.ReserveBuffer(sizeof(sTakeGoldLogV2)));
if (NULL != lpTakeGoldLogV2)
{
lpTakeGoldLogV2->InitLogBase(character.GetUID(), character.GetCID(),
character.GetCurrentPos(), gameLog.GetLogTime(), CMD::TAKE_GOLD_V2, static_cast<GAMELOG::ERRType>(eError));
lpTakeGoldLogV2->m_SrcGold = dwSrcGold;
lpTakeGoldLogV2->m_DstGold = dwDstGold;
lpTakeGoldLogV2->m_MoveGold = dwMoveGold;
lpTakeGoldLogV2->m_cSrcPos = cSrcPos;
lpTakeGoldLogV2->m_cDstPos = cDstPos;
lpTakeGoldLogV2->m_cPurpose = cPurpose;
gameLog.UseComplete(sizeof(sTakeGoldLogV2));
}
else
{
ERRLOG1(g_Log, "CID:%10u 의 돈 이동 로그를 남길 수 없습니다. : 버퍼를 할당할 수 없습니다.",
character.GetCID());
}
}
// STALL_OPEN_CLOSE
void GAMELOG::LogStallOpenClose(const CAggresiveCreature& creature, const char* szStallName, const bool bOpen)
{
CGameLog& gameLog = CGameLog::GetInstance();
sStallOpenCloseLog* lpStallOpenCloseLog =
reinterpret_cast<sStallOpenCloseLog*>(gameLog.ReserveBuffer(sizeof(sStallOpenCloseLog)));
if (NULL != lpStallOpenCloseLog)
{
lpStallOpenCloseLog->InitLogBase(creature.GetUID(), creature.GetCID(),
creature.GetCurrentPos(), gameLog.GetLogTime(), CMD::STALL_OPEN_CLOSE, 0);
lpStallOpenCloseLog->InitStallOpenCloseLog(bOpen ? sStallOpenCloseLog::STALL_OPEN : sStallOpenCloseLog::STALL_CLOSE,
szStallName);
gameLog.UseComplete(sizeof(sStallOpenCloseLog));
}
else
{
ERRLOG1(g_Log, "CID:%10u 의 노점상 열고 닫기 로그를 남길 수 없습니다. : 버퍼를 할당할 수 없습니다.",
creature.GetCID());
}
}
// STALL_ENTER_LEAVE
void GAMELOG::LogStallEnterLeave(const CAggresiveCreature& creature, const unsigned long dwCustomerCID, const bool bEnter)
{
CGameLog& gameLog = CGameLog::GetInstance();
sStallEnterLeaveLog* lpStallEnterLeaveLog =
reinterpret_cast<sStallEnterLeaveLog*>(gameLog.ReserveBuffer(sizeof(sStallEnterLeaveLog)));
if (NULL != lpStallEnterLeaveLog)
{
lpStallEnterLeaveLog->InitLogBase(creature.GetUID(), creature.GetCID(),
creature.GetCurrentPos(), gameLog.GetLogTime(), CMD::STALL_ENTER_LEAVE, 0);
lpStallEnterLeaveLog->InitStallEnterLeaveLog(dwCustomerCID,
bEnter ? sStallEnterLeaveLog::STALL_ENTER : sStallEnterLeaveLog::STALL_LEAVE);
gameLog.UseComplete(sizeof(sStallEnterLeaveLog));
}
else
{
ERRLOG1(g_Log, "CID:%10u 의 노점상 입장 퇴장 로그를 남길 수 없습니다. : 버퍼를 할당할 수 없습니다.",
creature.GetCID());
}
}
// STALL_ITEM_REGISTER_REMOVE
void GAMELOG::LogStallRegisterRemoveItem(const CCharacter& character, const Item::CItem* lpItem, const TakeType takeType,
const unsigned char cPktStRICMD, const unsigned short usError)
{
CGameLog& gameLog = CGameLog::GetInstance();
sStallRegisterRemoveItemLog* lpStallRegisterRemoveItemLog =
reinterpret_cast<sStallRegisterRemoveItemLog*>(gameLog.ReserveBuffer(sizeof(sStallRegisterRemoveItemLog)));
if (NULL != lpStallRegisterRemoveItemLog)
{
lpStallRegisterRemoveItemLog->InitLogBase(character.GetUID(), character.GetCID(),
character.GetCurrentPos(), gameLog.GetLogTime(), CMD::STALL_ITEM_REGISTER_REMOVE,
static_cast<const GAMELOG::ERRType>(usError));
sStallRegisterRemoveItemLog::StallMode eStallMode = sStallRegisterRemoveItemLog::STALL_UNKNOWN;
switch(cPktStRICMD)
{
case PktStRI::SC_REGISTER: eStallMode = sStallRegisterRemoveItemLog::STALL_REGISTERITEM; break;
case PktStRI::SC_CANCEL: eStallMode = sStallRegisterRemoveItemLog::STALL_REMOVEITEM; break;
case PktStRI::SC_CAMP_REGISTER: eStallMode = sStallRegisterRemoveItemLog::STALL_CAMP_REGISTER; break;
case PktStRI::SC_CAMP_CANCEL: eStallMode = sStallRegisterRemoveItemLog::STALL_CAMP_REMOVE; break;
}
lpStallRegisterRemoveItemLog->InitStallRegisterRemoveItemLog(eStallMode, lpItem, takeType);
gameLog.UseComplete(sizeof(sStallRegisterRemoveItemLog));
}
else
{
ERRLOG1(g_Log, "CID:%10u 의 노점상 아이템 등록 제거 로그를 남길 수 없습니다. : 버퍼를 할당할 수 없습니다.",
character.GetCID());
}
}
// ITEM_ATTACH_OPTION 아이템 옵션 이식
void GAMELOG::LogItemAttachOption(const CCharacter& character,
unsigned long dwOldInvenGold, unsigned char cSelectedOptionIndex,
const char* szSerializedOldItem, size_t nOldItemSize,
const char* szUseItemData, size_t nUseItemSize,
Item::CItem* lpNewItem, unsigned short usError)
{
CGameLog& gameLog = CGameLog::GetInstance();
sItemAttachOption* lpItemAttachOption = reinterpret_cast<sItemAttachOption*>(
gameLog.ReserveBuffer(sizeof(sItemAttachOption) + Item::MAX_ITEM_SIZE * 3));
if (NULL != lpItemAttachOption)
{
lpItemAttachOption->InitLogBase(character.GetUID(), character.GetCID(),
character.GetCurrentPos(), gameLog.GetLogTime(), CMD::ITEM_ATTACH_OPTION,
static_cast<const GAMELOG::ERRType>(usError));
lpItemAttachOption->m_dwOldInvenGold = dwOldInvenGold;
lpItemAttachOption->m_dwNewInvenGold = character.GetGold();
lpItemAttachOption->m_cSelectedOptionIndex = cSelectedOptionIndex;
lpItemAttachOption->m_cOldItemLen = 0;
lpItemAttachOption->m_cUseItemLen = 0;
lpItemAttachOption->m_cNewItemLen = 0;
char* szItemData = reinterpret_cast<char*>(lpItemAttachOption + 1);
size_t nItemLength = 0;
if(0 != szSerializedOldItem && 0 != nOldItemSize)
{
memcpy(szItemData, szSerializedOldItem, nOldItemSize);
lpItemAttachOption->m_cOldItemLen =
static_cast<unsigned char>(nOldItemSize);
szItemData += nOldItemSize;
}
if(0 != szUseItemData && 0 != nUseItemSize)
{
memcpy(szItemData, szUseItemData, nUseItemSize);
lpItemAttachOption->m_cUseItemLen =
static_cast<unsigned char>(nUseItemSize);
szItemData += nUseItemSize;
}
if(0 != lpNewItem)
{
nItemLength = Item::MAX_ITEM_SIZE;
if(lpNewItem->SerializeOut(szItemData, nItemLength))
{
lpItemAttachOption->m_cNewItemLen =
static_cast<unsigned char>(nItemLength);
szItemData += nItemLength;
}
else
{
ERRLOG1(g_Log, "CID:%10u 새 아이템 SerializeOut에 실패했습니다.", character.GetCID());
}
}
gameLog.UseComplete(static_cast<unsigned short>(
szItemData - reinterpret_cast<char*>(lpItemAttachOption)));
}
else
{
ERRLOG1(g_Log, "CID:%10u / 아이템 옵션 이식 로그 기록 실패 : 버퍼 할당 실패", character.GetCID());
}
}
// ITEM_COMPENSATION 아이템 보상
void GAMELOG::LogItemCompensation(const CCharacter& character, unsigned long dwOldInvenGold,
Item::CItem* lpOldItem, Item::CItem* lpNewItem,
unsigned short usError)
{
CGameLog& gameLog = CGameLog::GetInstance();
sItemCompensation* lpItemCompensation = reinterpret_cast<sItemCompensation*>(
gameLog.ReserveBuffer(sizeof(sItemCompensation) + Item::MAX_ITEM_SIZE * 2));
if (NULL != lpItemCompensation)
{
lpItemCompensation->InitLogBase(character.GetUID(), character.GetCID(),
character.GetCurrentPos(), gameLog.GetLogTime(), CMD::ITEM_COMPENSATION,
static_cast<const GAMELOG::ERRType>(usError));
lpItemCompensation->m_dwOldInvenGold = dwOldInvenGold;
lpItemCompensation->m_dwNewInvenGold = character.GetGold();
lpItemCompensation->m_cOldItemLen = 0;
lpItemCompensation->m_cNewItemLen = 0;
char* szItemData = reinterpret_cast<char*>(lpItemCompensation + 1);
size_t nItemLength = 0;
if(0 != lpOldItem)
{
nItemLength = Item::MAX_ITEM_SIZE;
if(lpOldItem->SerializeOut(szItemData, nItemLength))
{
lpItemCompensation->m_cOldItemLen =
static_cast<unsigned char>(nItemLength);
szItemData += nItemLength;
}
else
{
ERRLOG1(g_Log, "CID:%10u 예전 아이템 SerializeOut에 실패했습니다.", character.GetCID());
}
}
if(0 != lpNewItem)
{
nItemLength = Item::MAX_ITEM_SIZE;
if(lpNewItem->SerializeOut(szItemData, nItemLength))
{
lpItemCompensation->m_cNewItemLen =
static_cast<unsigned char>(nItemLength);
szItemData += nItemLength;
}
else
{
ERRLOG1(g_Log, "CID:%10u 보상 아이템 SerializeOut에 실패했습니다.", character.GetCID());
}
}
gameLog.UseComplete(static_cast<unsigned short>(
szItemData - reinterpret_cast<char*>(lpItemCompensation)));
}
else
{
ERRLOG1(g_Log, "CID:%10u 아이템 보상 로그 기록 실패 : 버퍼 할당 실패", character.GetCID());
}
}
// ILLEGAL_ITEM
void GAMELOG::LogIllegalItem(const unsigned long dwCID, const Item::ItemPos usePos, const Item::CItem* lpItem)
{
CGameLog& gameLog = CGameLog::GetInstance();
// Illegal Log
sIllegalItemLog* lpIllegalItemLog = reinterpret_cast<sIllegalItemLog*>(gameLog.ReserveBuffer(
static_cast<unsigned short>(sizeof(sIllegalItemLog))));
if (NULL != lpIllegalItemLog)
{
Position pos = Position(0,0,0);
unsigned short nUsage = static_cast<unsigned short>(sizeof(sIllegalItemLog));
lpIllegalItemLog->InitLogBase(0, dwCID, pos, gameLog.GetLogTime(), CMD::ILLEGAL_ITEM, static_cast<ERRType>(0));
lpIllegalItemLog->InitIllegalItemLog(usePos, lpItem);
gameLog.UseComplete(nUsage);
}
else
{
ERRLOG1(g_Log, "CID:%10u 의 비인증 아이템 로그를 남길 수 없습니다. : 버퍼를 할당할 수 없습니다.", dwCID);
}
}
// ILLEGAL_WARPPOS
void GAMELOG::LogIllegalWarpPos(const CCharacter& character, const Position &oldPos, const Position &Pos)
{
CGameLog& gameLog = CGameLog::GetInstance();
// CharWarpPos Log
sIllegalWarpPosLog* lpCharWarpPosLog = reinterpret_cast<sIllegalWarpPosLog*>(gameLog.ReserveBuffer(
static_cast<unsigned short>(sizeof(sIllegalWarpPosLog))));
if (NULL != lpCharWarpPosLog)
{
unsigned short nUsage = static_cast<unsigned short>(sizeof(sIllegalWarpPosLog));
lpCharWarpPosLog->InitLogBase(character.GetUID(), character.GetCID(), oldPos, gameLog.GetLogTime(), CMD::ILLEGAL_WARPPOS, static_cast<ERRType>(0));
unsigned long dis = Pos.GetDistance(oldPos);
lpCharWarpPosLog->InitCharWarpPosLog(Pos, dis);
gameLog.UseComplete(nUsage);
}
else
{
ERRLOG1(g_Log, "CID:%10u 의 비인증 워프 사용 로그를 남길 수 없습니다. : 버퍼를 할당할 수 없습니다.", character.GetCID());
}
}
// HACK_DOUBT
void GAMELOG::LogHackBoubt(const CCharacter& character, unsigned short wHackID, unsigned short wKindItem, Item::CItem* lpItem, unsigned short usError)
{
CGameLog& gameLog = CGameLog::GetInstance();
// sHockDoubt Log
sHockDoubtLog* lpHockDoubtLog = reinterpret_cast<sHockDoubtLog*>(gameLog.ReserveBuffer(
static_cast<unsigned short>(sizeof(sHockDoubtLog) + Item::MAX_ITEM_SIZE)));
if (NULL != lpHockDoubtLog)
{
unsigned short nUsage = static_cast<unsigned short>(sizeof(sHockDoubtLog));
lpHockDoubtLog->InitLogBase(character.GetUID(), character.GetCID(), character.GetCurrentPos(), gameLog.GetLogTime(), CMD::HACK_DOUBT, static_cast<ERRType>(usError));
size_t nItemSize = Item::MAX_ITEM_SIZE;
if (NULL != lpItem)
{
if (!lpItem->SerializeOut(reinterpret_cast<char*>(lpHockDoubtLog+1), nItemSize))
{
ERRLOG1(g_Log, "CID:%10u 아이템 SerializeOut에 실패했습니다.", character.GetCID());
}
nUsage += static_cast<unsigned short>(nItemSize);
}
else
nItemSize = 0;
lpHockDoubtLog->InitHackDoubt(wHackID, wKindItem, nItemSize);
gameLog.UseComplete(nUsage);
}
else
{
ERRLOG1(g_Log, "CID:%10u 의 핵의심 메시지 로그를 남길 수 없습니다. : 버퍼를 할당할 수 없습니다.", character.GetCID());
}
}