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,439 @@
#include "stdafx.h"
#include "GameEventDBMgr.h"
#include <DB/DBComponent.h>
#include <DB/GameDBComponent.h>
#include <Utility/Math/Math.h>
#include <Utility/Setup/ServerSetup.h>
#include <Network/Dispatch/GameDispatch.h>
#include <Network/Stream/SendStream.h>
#include <Network/Packet/PacketCommand.h>
#include <Network/Packet/PacketStruct/ServerInfo.h>
#include <Network/Packet/PacketStruct/GameEventPacket.h>
#include <Network/SendPacket/SendAdminTool.h>
#include <Log/ServerLog.h>
#pragma pack(1)
struct LimitDropItemDB
{
unsigned long m_dwItemIndex; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD>
unsigned long m_dwItemAmount; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
unsigned long m_dwMaxAmount; // <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
TIME m_StartTime; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD>
TIME m_EndTime; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD>
};
#pragma pack()
CGameEventDBMgr::LimitDropItem::LimitDropItem()
: m_wItemID(0), m_wNowNum(0), m_wMaxNum(0)
{
ZeroMemory(&m_StartTime, sizeof(tm));
ZeroMemory(&m_EndTime, sizeof(tm));
ZeroMemory(&m_NextDropTime, sizeof(tm));
}
CGameEventDBMgr::LimitDropItem::LimitDropItem(unsigned short wItemID, unsigned short wNowNum,
unsigned short wMaxNum, tm StartTime, tm EndTime)
: m_wItemID(wItemID), m_wNowNum(wNowNum), m_wMaxNum(wMaxNum),
m_StartTime(StartTime), m_EndTime(EndTime), m_NextDropTime(StartTime)
{
}
CGameEventDBMgr& CGameEventDBMgr::GetInstance()
{
static CGameEventDBMgr gameEventMgr;
return gameEventMgr;
}
CGameEventDBMgr::CGameEventDBMgr()
: m_lpDBComponent(0)
{
}
CGameEventDBMgr::~CGameEventDBMgr()
{
}
bool CGameEventDBMgr::Initialize(CDBComponent& DBComponent)
{
m_lpDBComponent = &DBComponent;
const int MAX_ROWS = 1024;
int nGetRows = 0;
if (!DBComponent.ExecuteQuery(
"SELECT nItemIndex, nItemAmount, nMaxAmount, StartTime, EndTime FROM TblEventItem"))
{
ERRLOG0(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>");
return false;
}
LimitDropItemDB* dropItemDB = new LimitDropItemDB[MAX_ROWS];
memset(dropItemDB, 0, sizeof(LimitDropItemDB) * MAX_ROWS);
while (DBComponent.GetData((void**)dropItemDB, sizeof(LimitDropItemDB), MAX_ROWS, &nGetRows))
{
if (0 == nGetRows)
{
break;
}
for (LimitDropItemDB* lpDropItemDB = dropItemDB; nGetRows > 0; --nGetRows, ++lpDropItemDB)
{
tm StartTime, EndTime;
memset(&StartTime, 0, sizeof(tm));
memset(&EndTime, 0, sizeof(tm));
StartTime.tm_year = lpDropItemDB->m_StartTime.Year - 1900;
StartTime.tm_mon = lpDropItemDB->m_StartTime.Month - 1;
StartTime.tm_mday = lpDropItemDB->m_StartTime.Day;
StartTime.tm_hour = lpDropItemDB->m_StartTime.Hour;
StartTime.tm_min = lpDropItemDB->m_StartTime.Minute;
StartTime.tm_sec = lpDropItemDB->m_StartTime.Second;
EndTime.tm_year = lpDropItemDB->m_EndTime.Year - 1900;
EndTime.tm_mon = lpDropItemDB->m_EndTime.Month - 1;
EndTime.tm_mday = lpDropItemDB->m_EndTime.Day;
EndTime.tm_hour = lpDropItemDB->m_EndTime.Hour;
EndTime.tm_min = lpDropItemDB->m_EndTime.Minute;
EndTime.tm_sec = lpDropItemDB->m_EndTime.Second;
LimitDropItem dropItem(static_cast<unsigned short>(lpDropItemDB->m_dwItemIndex),
static_cast<unsigned short>(lpDropItemDB->m_dwItemAmount),
static_cast<unsigned short>(lpDropItemDB->m_dwMaxAmount),
StartTime, EndTime);
m_lstItem.push_back(dropItem);
}
memset(dropItemDB, 0, sizeof(LimitDropItemDB) * MAX_ROWS);
}
delete [] dropItemDB;
return true;
}
void CGameEventDBMgr::CheckGameEvent()
{
if (0 != m_lpDBComponent && !m_lstItem.empty())
{
LimitDropItemList::iterator pos = m_lstItem.begin();
LimitDropItemList::iterator end = m_lstItem.end();
for (; pos != end; ++pos)
{
LimitDropItem& dropItem = *pos;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (dropItem.m_wNowNum >= dropItem.m_wMaxNum)
{
continue;
}
time_t localTime;
time(&localTime);
// <20>̺<EFBFBD>Ʈ <20><EFBFBD><E2B0A3> <20>ƴ<EFBFBD> <20><><EFBFBD><EFBFBD>
if (0 >= difftime(localTime, mktime(&dropItem.m_StartTime)) ||
0 <= difftime(localTime, mktime(&dropItem.m_EndTime)))
{
continue;
}
if (0 <= difftime(localTime, mktime(&dropItem.m_NextDropTime)))
{
// <20><>ȸ <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if (dropItem.m_NextDropTime.tm_year != dropItem.m_StartTime.tm_year ||
dropItem.m_NextDropTime.tm_mon != dropItem.m_StartTime.tm_mon ||
dropItem.m_NextDropTime.tm_mday != dropItem.m_StartTime.tm_mday ||
dropItem.m_NextDropTime.tm_hour != dropItem.m_StartTime.tm_hour ||
dropItem.m_NextDropTime.tm_min != dropItem.m_StartTime.tm_min ||
dropItem.m_NextDropTime.tm_sec != dropItem.m_StartTime.tm_sec)
{
if (SendDropItemEvent(dropItem.m_wItemID))
{
++dropItem.m_wNowNum;
DETLOG4(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : ID:%d/Qty:%d/StartTime:%d/EndTime:%d",
dropItem.m_wItemID, dropItem.m_wNowNum,
mktime(&dropItem.m_StartTime), mktime(&dropItem.m_EndTime));
if(!DBComponent::GameDB::UpdateEventItem(
*m_lpDBComponent, dropItem.m_wItemID, dropItem.m_wNowNum))
{
ERRLOG2(g_Log, "ItemID:%6u / NowNum:%u / <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> DB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>",
dropItem.m_wItemID, dropItem.m_wNowNum);
}
else if(DBAgent::SendPacket::ItemQtyCheck(dropItem.m_wItemID,
dropItem.m_wMaxNum, dropItem.m_wNowNum,
mktime(&dropItem.m_StartTime), mktime(&dropItem.m_EndTime),
PktItemQtyControl::STATUS_ACK))
{
DETLOG4(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : ID:%d/Qty:%d/StartTime:%d/EndTime:%d",
dropItem.m_wItemID, dropItem.m_wNowNum,
mktime(&dropItem.m_StartTime), mktime(&dropItem.m_EndTime));
}
}
}
dropItem.m_NextDropTime = *localtime(&localTime);
UpdateTimeDropItemEvent(dropItem);
}
}
}
}
bool CGameEventDBMgr::InsertDropItem(unsigned short wItemID, unsigned short wMaxNum, tm StartTime, tm EndTime)
{
if(0 != m_lpDBComponent)
{
LimitDropItemList::iterator pos = m_lstItem.begin();
LimitDropItemList::iterator end = m_lstItem.end();
for (; pos != end; ++pos)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
LimitDropItem& dropItem = *pos;
if (dropItem.m_wItemID == wItemID)
{
dropItem.m_wMaxNum = wMaxNum;
dropItem.m_StartTime = StartTime;
dropItem.m_EndTime = EndTime;
dropItem.m_NextDropTime = StartTime;
return DBComponent::GameDB::UpdateEventItem(
*m_lpDBComponent, wItemID, wMaxNum, StartTime, EndTime);
}
}
// <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD>
m_lstItem.push_back(LimitDropItem(wItemID, 0, wMaxNum, StartTime, EndTime));
return DBComponent::GameDB::InsertEventItem(
*m_lpDBComponent, wItemID, wMaxNum, StartTime, EndTime);
}
return false;
}
bool CGameEventDBMgr::EraseDropItem(unsigned short wItemID)
{
if(0 != m_lpDBComponent)
{
LimitDropItemList::iterator pos = m_lstItem.begin();
LimitDropItemList::iterator end = m_lstItem.end();
for (; pos != end; ++pos)
{
if (pos->m_wItemID == wItemID)
{
m_lstItem.erase(pos);
return DBComponent::GameDB::DeleteEventItem(
*m_lpDBComponent, wItemID);
}
}
}
return false;
}
void CGameEventDBMgr::UpdateTimeDropItemEvent(LimitDropItem& ItemInfo)
{
tm startTime, endTime;
// <20><>¥ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><> <20><><EFBFBD><EFBFBD>)
ZeroMemory(&startTime, sizeof(tm));
ZeroMemory(&endTime, sizeof(tm));
startTime.tm_year = ItemInfo.m_NextDropTime.tm_year;
startTime.tm_mon = ItemInfo.m_NextDropTime.tm_mon;
startTime.tm_mday = ItemInfo.m_NextDropTime.tm_mday;
endTime.tm_year = ItemInfo.m_EndTime.tm_year;
endTime.tm_mon = ItemInfo.m_EndTime.tm_mon;
endTime.tm_mday = ItemInfo.m_EndTime.tm_mday;
double dateDuration = difftime(mktime(&endTime), mktime(&startTime));
int nDay = static_cast<int>(dateDuration) / 60 / 60 / 24 + 1;
// <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><> <20><><EFBFBD><EFBFBD>)
ZeroMemory(&startTime, sizeof(tm));
ZeroMemory(&endTime, sizeof(tm));
// mktime() <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
{
// day of the month - [1,31]
startTime.tm_mday = 1;
endTime.tm_mday = 1;
// time_t <20><> 1970<37><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ǥ<><C7A5><EFBFBD>Ѵ<EFBFBD>.
startTime.tm_year = 70;
endTime.tm_year = 70;
}
startTime.tm_hour = ItemInfo.m_NextDropTime.tm_hour;
startTime.tm_min = ItemInfo.m_NextDropTime.tm_min;
startTime.tm_sec = ItemInfo.m_NextDropTime.tm_sec;
endTime.tm_hour = ItemInfo.m_EndTime.tm_hour;
endTime.tm_min = ItemInfo.m_EndTime.tm_min;
endTime.tm_sec = ItemInfo.m_EndTime.tm_sec;
double timeDuration = difftime(mktime(&endTime), mktime(&startTime));
int nTime = static_cast<int>(timeDuration) / 60;
if (nTime <= 0)
{
ERRLOG1(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈ <20>ð<EFBFBD><C3B0><EFBFBD> <20>̻<EFBFBD><CCBB>մϴ<D5B4>. <20>ð<EFBFBD><C3B0><EFBFBD>:%d", nTime);
return;
}
// Rodin : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <20>Ѵ<EFBFBD>.
// m_NextDropTime<6D><65> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD>...
// <09><>¥<EFBFBD><C2A5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݾ<EFBFBD>~
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EAB7AF><EFBFBD><EFBFBD> <20><> <20>ð<EFBFBD>
if (ItemInfo.m_wMaxNum <= ItemInfo.m_wNowNum) { return; }
int nTotalDuration = nDay * nTime / (ItemInfo.m_wMaxNum - ItemInfo.m_wNowNum);
int nNextTotal = Math::Random::ComplexRandom(nTotalDuration);
int nNextDate = nNextTotal / nTime;
int nNextTime = nNextTotal % nTime;
time_t nextDropTime = mktime(&ItemInfo.m_NextDropTime);
nextDropTime = nextDropTime + nNextDate * 24 * 60 * 60 + nNextTime * 60;
ItemInfo.m_NextDropTime = *localtime(&nextDropTime);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>¥<EFBFBD><C2A5> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD> (<28><> <20>ð<EFBFBD><C3B0><EFBFBD> <20>ѱ<EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.)
tm DropDateLastTime = ItemInfo.m_NextDropTime;
DropDateLastTime.tm_hour = ItemInfo.m_EndTime.tm_hour;
DropDateLastTime.tm_min = ItemInfo.m_EndTime.tm_min;
DropDateLastTime.tm_sec = ItemInfo.m_EndTime.tm_sec;
if (0 < difftime(mktime(&DropDateLastTime), nextDropTime))
{
nextDropTime = static_cast<time_t>(nextDropTime + 24 * 60 * 60 - timeDuration);
ItemInfo.m_NextDropTime = *localtime(&nextDropTime);
}
}
class CGetGameServerDispatch
{
public:
typedef std::vector<DBAgent::CGameDispatch*> GameDispatchList;
CGetGameServerDispatch(GameDispatchList& list) : m_list(list) { m_list.reserve(30); }
bool operator () (unsigned long, CPacketDispatch& packetDispatch)
{
DBAgent::CGameDispatch& GameDispatch = static_cast<DBAgent::CGameDispatch&>(packetDispatch);
SERVER_ID serverID;
serverID.dwID = GameDispatch.GetServerID();
switch(serverID.GetZone())
{
case SERVER_ID::ZONE1:
case SERVER_ID::ZONE2:
case SERVER_ID::ZONE3:
case SERVER_ID::ZONE4:
case SERVER_ID::ZONE5:
case SERVER_ID::CAPITAL:
case SERVER_ID::ZONE9:
case SERVER_ID::ZONE12:
m_list.push_back(&GameDispatch);
break;
default:
// if(( (SERVER_ID::STONE_WAR1 == serverID.GetZone() || SERVER_ID::STONE_WAR2 == serverID.GetZone() || SERVER_ID::STONE_WAR3 == serverID.GetZone()) && true == CServerSetup::GetInstance().UseContents(GameRYL::STONE_BATTLE)) ||
// (SERVER_ID::ZONE9 == serverID.GetZone() && true == CServerSetup::GetInstance().UseContents(GameRYL::NEWZONE_ZONE9)))
if(( (SERVER_ID::STONE_WAR1 == serverID.GetZone() || SERVER_ID::STONE_WAR2 == serverID.GetZone() || SERVER_ID::STONE_WAR3 == serverID.GetZone()) && true == CServerSetup::GetInstance().UseContents(GameRYL::STONE_BATTLE) ))
{
m_list.push_back(&GameDispatch);
}
break;
}
return true;
}
private:
GameDispatchList& m_list;
};
bool CGameEventDBMgr::SendDropItemEvent(unsigned short wItemID)
{
CGetGameServerDispatch::GameDispatchList gameDispatchList;
// <20><><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
DBAgent::CGameDispatch::GetDispatchTable().Process(
CGetGameServerDispatch(gameDispatchList));
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if (!gameDispatchList.empty())
{
std::random_shuffle(gameDispatchList.begin(), gameDispatchList.end());
DBAgent::CGameDispatch* lpGameDispatch = *(gameDispatchList.begin());
if (0 != lpGameDispatch)
{
CSendStream& SendStream = lpGameDispatch->GetSendStream();
char* lpBuffer = SendStream.GetBuffer(sizeof(PktEventDropItem));
if(0 != lpBuffer)
{
PktEventDropItem* lpPktEventDropItem =
reinterpret_cast<PktEventDropItem*>(lpBuffer);
lpPktEventDropItem->m_usItemID = wItemID;
if(SendStream.WrapHeader(sizeof(PktEventDropItem), CmdEventDropItem, 0, 0))
{
DETLOG2(g_Log, "ServerID:0x%08X / ItemID:%6u / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
lpGameDispatch->GetServerID(), wItemID);
return true;
}
}
}
}
return false;
}
void CGameEventDBMgr::SendDropItemInfo()
{
LimitDropItemList::iterator pos = m_lstItem.begin();
LimitDropItemList::iterator end = m_lstItem.end();
for (; pos != end; ++pos)
{
LimitDropItem& dropItem = *pos;
DBAgent::SendPacket::ItemQtyCheck(dropItem.m_wItemID, dropItem.m_wMaxNum, dropItem.m_wNowNum,
mktime(&dropItem.m_StartTime), mktime(&dropItem.m_EndTime), PktItemQtyControl::STATUS_ACK);
}
DBAgent::SendPacket::ItemQtyCheck(0, 0, 0, 0, 0, PktItemQtyControl::STATUS_ACK_END);
}

View File

@@ -0,0 +1,63 @@
#ifndef _RYL_DBAGENT_GAME_EVENT_MGR_H_
#define _RYL_DBAGENT_GAME_EVENT_MGR_H_
#include <list>
#include <ctime>
#include <boost/pool/pool_alloc.hpp>
// forward decl.
class CDBComponent;
class CGameEventDBMgr
{
public:
struct LimitDropItem
{
unsigned short m_wItemID;
unsigned short m_wNowNum;
unsigned short m_wMaxNum;
// <20><><EFBFBD><EFBFBD> : <20><>¥<EFBFBD><C2A5> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
// <09>־<EFBFBD><D6BE><EFBFBD> <20><>¥ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD> <20><> <20>־<EFBFBD><D6BE><EFBFBD> <20>ð<EFBFBD> <20><><EFBFBD>̿<EFBFBD><CCBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
//
// ex) 2004/03/12 20:03 ~ 2004/03/15 21:10<31><30> <20><> <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ƴ϶<C6B4>,
// 12<31><32> ~ 15<31><35><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD>(12, 13, 14, 15<31><35>)<29><> 20:03 ~ 21:10 <20><><EFBFBD>̿<EFBFBD><CCBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
// <09><>, 2004/03/13 21:00<30><30> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2004/03/13 19:00<30><30> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ұ<EFBFBD><D2B0><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0>Դϴ<D4B4>.
tm m_StartTime;
tm m_EndTime;
tm m_NextDropTime;
LimitDropItem();
LimitDropItem(unsigned short wItemID, unsigned short wNowNum,
unsigned short wMaxNum, tm StartTime, tm EndTime);
};
typedef std::list<LimitDropItem, boost::fast_pool_allocator<LimitDropItem> > LimitDropItemList;
static CGameEventDBMgr& GetInstance();
bool Initialize(CDBComponent& DBComponent);
void CheckGameEvent();
bool InsertDropItem(unsigned short wItemID, unsigned short wMaxNum, tm StartTime, tm EndTime);
bool EraseDropItem(unsigned short wItemID);
// <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
void SendDropItemInfo();
private:
CGameEventDBMgr();
~CGameEventDBMgr();
void UpdateTimeDropItemEvent(LimitDropItem& ItemInfo);
bool SendDropItemEvent(unsigned short wItemID);
LimitDropItemList m_lstItem;
CDBComponent* m_lpDBComponent;
};
#endif

View File

@@ -0,0 +1,388 @@
#include "stdafx.h"
#include "GiveItemMgr.h"
#include <DB/DBComponent.h>
#include <Log/ServerLog.h>
#include <Item/ItemMgr.h>
#include <Item/ItemFactory.h>
#include <DataStorage/SessionDataMgr.h>
#include <DataStorage/CharacterDataMgr.h>
#include <DataStorage/DBItemSerialMgr.h>
#include <Network/Dispatch/GameDispatch.h>
#include <Network/Packet/PacketCommand.h>
#include <Network/Packet/WrapPacket.h>
#include <Network/Packet/PacketStruct/CharItemPacket.h>
CGiveItemMgr& CGiveItemMgr::GetInstance()
{
static CGiveItemMgr giveItemMgr;
return giveItemMgr;
}
CGiveItemMgr::CGiveItemMgr()
: m_lpDBComponent(0)
{
memset(&m_UpdateParamInfo, 0, sizeof(OleDB::PARAM_INFO));
m_UpdateParamInfo.ColNum = 2;
m_UpdateParamInfo.eParamIO[0] = DBPARAMIO_INPUT;
m_UpdateParamInfo.ColType[0] = DBTYPE_I8;
m_UpdateParamInfo.ColSize[0] = sizeof(unsigned __int64);
m_UpdateParamInfo.eParamIO[1] = DBPARAMIO_INPUT;
m_UpdateParamInfo.ColType[1] = DBTYPE_I4;
m_UpdateParamInfo.ColSize[1] = sizeof(unsigned long);
}
CGiveItemMgr::~CGiveItemMgr()
{
}
void CGiveItemMgr::SetDBComponent(CDBComponent& DBComponent)
{
m_lpDBComponent = &DBComponent;
}
void CGiveItemMgr::CheckGiveItem()
{
using namespace DBAgent::DataStorage;
// <20><>Ʈ<EFBFBD><C6AE>ũ<EFBFBD><C5A9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>, 30<33><30> <20>Ŀ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>õ<EFBFBD><C3B5><EFBFBD> <20>Ѵ<EFBFBD>.
const int MAX_WAIT_MSEC = 30 * 1000;
if (!m_GiveItemMap.empty())
{
unsigned long dwCurrentTime = timeGetTime();
if (0 == dwCurrentTime) { ++dwCurrentTime; }
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ŀ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
CSessionDataMgr& sessionDataMgr = CSessionDataMgr::GetInstance();
CCharacterDataMgr& characterDataMgr = CCharacterDataMgr::GetInstance();
CSessionData* lpSessionData = NULL;
CCharacterData* lpCharacterData = NULL;
PktGiveItemToTempInven giveItemToTempInven;
memset(&giveItemToTempInven, 0, sizeof(PktGiveItemToTempInven));
GiveItemMap::iterator pos = m_GiveItemMap.begin();
GiveItemMap::iterator end = m_GiveItemMap.end();
GiveItemMap::iterator nextPos;
unsigned __int64 dwItemUID = 0LL;
unsigned char cGiveItemCount = 0;
unsigned char cNetworkGiveItemCount = 0;
TEMPINVEN tempInven;
memset(&tempInven, 0, sizeof(TEMPINVEN));
for (; cGiveItemCount < PktGiveItemToTempInven::MAX_GIVE_ITEM && pos != end; ++cGiveItemCount)
{
GiveItem& giveItem = pos->second;
if (0 == giveItem.second)
{
lpCharacterData = characterDataMgr.GetLogoutData(giveItem.first.m_dwCID);
if (NULL != lpCharacterData)
{
// LogoutDB<44><42><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<><C3A3><EFBFBD><EFBFBD>. <20>׳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ѵ<EFBFBD>.
tempInven = lpCharacterData->GetTempInven();
if (true == SetItem(tempInven.Data, tempInven.dwSize, TEMPINVEN::MAX_TEMPINVEN_SIZE,
giveItem.first, Item::MAX_TEMP_INVEN_ITEM_NUM, dwItemUID))
{
if (true == UpdateItemSerial(pos, nextPos, dwItemUID))
{
lpCharacterData->SetTempInven(tempInven.Data, tempInven.dwSize);
}
}
else
{
UpdateItemSerial(pos, nextPos, Item::GiveItem::PENDING_ITEM_UID);
}
pos = nextPos;
continue;
}
else
{
if (NULL != (lpSessionData = sessionDataMgr.GetCharLoadedSession(giveItem.first.m_dwCID)) &&
NULL != (lpCharacterData = lpSessionData->GetCharacterData()) &&
giveItem.first.m_dwCID == lpCharacterData->GetCID())
{
// LogoutDB<44><42><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ã<EFBFBD><C3A3><EFBFBD><EFBFBD>. <20>α<EFBFBD><CEB1><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> ã<>ƺ<EFBFBD><C6BA><EFBFBD>.
if (CSessionData::SE_CHAR_ENABLED == lpSessionData->GetSessionState())
{
// <20><>Ʈ<EFBFBD><C6AE>ũ<EFBFBD><C5A9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
giveItemToTempInven.m_GiveItemInfo[cNetworkGiveItemCount] = giveItem.first;
giveItem.second = dwCurrentTime;
++cNetworkGiveItemCount;
INFLOG3(g_Log, "UID:%10u / CID:%10u / CreateID:%10u / <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>",
giveItem.first.m_dwUID, giveItem.first.m_dwCID, giveItem.first.m_dwCreateID);
}
else
{
// <20>ƿ<EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20>α׾ƿ<D7BE><C6BF><EFBFBD> <20><><EFBFBD>¿<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
tempInven = lpCharacterData->GetTempInven();
if (true == SetItem(tempInven.Data, tempInven.dwSize, TEMPINVEN::MAX_TEMPINVEN_SIZE,
giveItem.first, Item::MAX_TEMP_INVEN_ITEM_NUM, dwItemUID))
{
if (true == UpdateItemSerial(pos, nextPos, dwItemUID))
{
lpCharacterData->SetTempInven(tempInven.Data, tempInven.dwSize);
}
}
else
{
UpdateItemSerial(pos, nextPos, Item::GiveItem::PENDING_ITEM_UID);
}
pos = nextPos;
continue;
}
}
}
}
else if (MAX_WAIT_MSEC < dwCurrentTime - giveItem.second)
{
// <20>ִ<EFBFBD> MAX_WAIT_MSEC <20><>ŭ <20><><EFBFBD>ٷȴٰ<C8B4>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>غ<EFBFBD><D8BA><EFBFBD> <20>Ѵ<EFBFBD>.
giveItem.second = 0;
}
++pos;
}
if (0 < cNetworkGiveItemCount)
{
giveItemToTempInven.m_cGiveItemNum = cNetworkGiveItemCount;
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if (PacketWrap::WrapHeader(reinterpret_cast<char*>(&giveItemToTempInven),
sizeof(PktGiveItemToTempInven), CmdGiveItemToTempInven, 0, 0))
{
DBAgent::CGameDispatch::GetDispatchTable().Process(
CSendPacketAllServer(reinterpret_cast<char*>(&giveItemToTempInven),
sizeof(PktGiveItemToTempInven), CmdGiveItemToTempInven));
}
}
}
}
void CGiveItemMgr::ReadGiveInfo()
{
const int MAX_READ_INFO = 1024;
GiveItemInfo giveItemInfo[MAX_READ_INFO];
if (true == m_GiveItemMap.empty())
{
if (NULL == m_lpDBComponent)
{
ERRLOG0(g_Log, "DBComponent is NULL");
return;
}
if (false == m_lpDBComponent->ExecuteQuery(
"SELECT TOP 1024 CreateID, UID, CID, ItemPrototypeID, Amount, "
"MIN_DAMAGE, MAX_DAMAGE, ARMOR, HIT_RATE, EVADE, MAX_HP, HP_REGEN, MAX_MP, "
"MP_REGEN, CRITICAL, BLOCK, SPEED, MAGIC_POWER, MAGIC_RESIST, ItemUID "
"FROM TblWebItemInfo WHERE ItemUID = 0"))
{
ERRLOG1(g_Log, "DB<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. : %s",
m_lpDBComponent->GetErrorString());
}
else
{
int nGetRows = 0;
while (m_lpDBComponent->GetData((void**)giveItemInfo, sizeof(GiveItemInfo), MAX_READ_INFO, &nGetRows))
{
if (0 == nGetRows)
{
break;
}
GiveItemInfo* lpPos = giveItemInfo;
GiveItemInfo* lpEnd = giveItemInfo + nGetRows;
#ifdef AUTH_MY
NFITEMINFO info;
#endif
for (; lpPos != lpEnd; ++lpPos)
{
m_GiveItemMap.insert(GiveItemMap::value_type(lpPos->m_dwCreateID, GiveItem(*lpPos, 0)));
#ifdef AUTH_MY
// edith 2009.09.14 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ų<EFBFBD><C5B3><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ߴٰ<DFB4> NFAuthServer<65><72> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD>
info.CreateID = lpPos->m_dwCreateID;
info.UID = lpPos->m_dwUID;
info.CID = lpPos->m_dwCID;
info.ItemPrototypeID = lpPos->m_usPrototypeID;
info.Amount = lpPos->m_cAmount;
m_NFItemInfo.push_back(info);
#endif
}
}
// <20><> <20>̻<EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD> <20>͵<EFBFBD><CDB5><EFBFBD> Ǯ<><C7AE><EFBFBD>ش<EFBFBD>.
if (true == m_GiveItemMap.empty())
{
char szQuery[1024] = { 0, };
sprintf(szQuery, "UPDATE TblWebItemInfo SET ItemUID = 0 WHERE ItemUID = %d", (unsigned __int64)Item::GiveItem::PENDING_ITEM_UID);
if (false == m_lpDBComponent->ExecuteQuery(szQuery))
{
ERRLOG1(g_Log, "DB<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ų <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. : %s",
m_lpDBComponent->GetErrorString());
}
}
}
}
}
bool CGiveItemMgr::UpdateItemSerial(GiveItemMap::iterator pos,
GiveItemMap::iterator& NextPos,
unsigned __int64 dwItemSerial)
{
GiveItem& giveItem = pos->second;
GiveItemInfo& giveItemInfo = giveItem.first;
UpdateItemUID updateItemUID;
giveItemInfo.m_dwItemUID = dwItemSerial;
updateItemUID.m_dwItemUID = dwItemSerial;
updateItemUID.m_dwCreateID = giveItemInfo.m_dwCreateID;
if (0 == m_lpDBComponent ||
!m_lpDBComponent->ExecuteQueryWithParams(
"UPDATE TblWebItemInfo SET ItemUID=? WHERE CreateID=?",
reinterpret_cast<char*>(&updateItemUID), m_UpdateParamInfo))
{
ERRLOG5(g_Log, "UID:%10u / CID:%10u / CreateID:%d/ ItemSerial:0x%016I64X / "
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>. <20><><EFBFBD><EFBFBD> <20><>ȸ<EFBFBD><C8B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>մϴ<D5B4>. : %s",
giveItemInfo.m_dwUID, giveItemInfo.m_dwCID, giveItemInfo.m_dwCreateID, dwItemSerial,
0 == m_lpDBComponent ? "DBComponent is NULL" : m_lpDBComponent->GetErrorString());
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
INFLOG4(g_Log, "UID:%10u / CID:%10u / CreateID:%10u / ItemSerial:%016I64X / <20>ӽ<EFBFBD><D3BD>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>޿<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>",
giveItemInfo.m_dwUID, giveItemInfo.m_dwCID, giveItemInfo.m_dwCreateID, dwItemSerial);
NextPos = m_GiveItemMap.erase(pos);
return true;
}
return false;
}
bool CGiveItemMgr::UpdateItemSerial(unsigned long dwCreateID, unsigned __int64 dwItemSerial)
{
// <20>ϴ<EFBFBD> Ack<63><6B> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
GiveItemMap::iterator pos;
GiveItemMap::iterator nextPos;
GiveItemMap::iterator end = m_GiveItemMap.end();
if (0 != dwCreateID && 0 != dwItemSerial &&
end != (pos = m_GiveItemMap.find(dwCreateID)))
{
if (UpdateItemSerial(pos, nextPos, dwItemSerial))
{
return true;
}
}
else
{
ERRLOG2(g_Log, "CreateID:%d/ ItemSerial:0x%016I64X / <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> CreateID<49><44>, <20>̻<EFBFBD><CCBB><EFBFBD> ItemSerial<61>Դϴ<D4B4>.",
dwCreateID, dwItemSerial);
}
return false;
}
#ifdef AUTH_MY
bool CGiveItemMgr::UpdateBuyItemInfo()
{
if(m_NFItemInfo.empty())
return false;
SHORT Count = (SHORT)m_NFItemInfo.size();
std::list<NFITEMINFO>::iterator obj;
// <20>ѹ<EFBFBD><D1B9><EFBFBD> 50<35><30><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if(Count >= 50)
Count = 50;
SHORT Len = 0;
char szBuff[1000];
LPNFITEMINFO item;
for(SHORT i = 0; i < Count; ++i)
{
obj = m_NFItemInfo.begin();
// NFITEMINFO <20><>ŭ <20><><EFBFBD><EFBFBD>
item = &(*obj);
memcpy(&szBuff[Len], item, sizeof(NFITEMINFO) );
Len += sizeof(NFITEMINFO);
m_NFItemInfo.pop_front();
}
g_NetAuth.Send_BUYITEMINFO(Count, szBuff, Len);
return true;
}
#endif
bool CGiveItemMgr::SetItem(char* szData, unsigned long& dwDataSize_InOut,
unsigned long dwMaxDataSize, GiveItemInfo& giveItemInfo,
unsigned long dwMaxItemNum, unsigned __int64& dwItemUID)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>鼭, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѿ<EFBFBD> <20>ɸ<EFBFBD> <20><> <20>ƴ<EFBFBD><C6B4><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ǰ<EFBFBD>,
// <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
char* szDataPos = szData;
char* szDataEnd = szData + dwDataSize_InOut;
unsigned char cIndex = 0;
for (; szDataPos < szDataEnd; )
{
Item::ItemData* lpItemData = reinterpret_cast<Item::ItemData*>(szDataPos);
lpItemData->m_ItemPos.m_cIndex = cIndex;
szDataPos += lpItemData->m_cItemSize;
++cIndex;
}
if (cIndex < Item::MAX_TEMP_INVEN_ITEM_NUM)
{
Item::ItemPos itemPos(TakeType::TS_TEMPINVEN, cIndex);
unsigned long dwRemainSize = dwMaxDataSize - dwDataSize_InOut;
dwItemUID = DBAgent::DataStorage::CDBAgentItemSerialMgr::GetInstance().GetNewItemSerial();
if (Item::CreateItemDataFromGiveInfo(Item::CItemMgr::GetInstance(), giveItemInfo,
szData + dwDataSize_InOut, dwRemainSize, dwItemUID, itemPos))
{
dwDataSize_InOut += dwRemainSize;
return true;
}
}
return false;
}

View File

@@ -0,0 +1,66 @@
#ifndef _RYL_DBAGENT_GIVE_ITEM_MGR_H_
#define _RYL_DBAGENT_GIVE_ITEM_MGR_H_
#include <list>
#include <ctime>
#include <boost/pool/pool_alloc.hpp>
#include <DB/OleDB.h>
#include <Network/Packet/PacketStruct/CharAdminPacket.h>
#ifdef AUTH_MY
#include "NFAuthClient/AuthClient.h"
#endif
// forward decl.
class CDBComponent;
// Ư<><C6AF> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ӽ<EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>־<EFBFBD> <20>ִ<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
class CGiveItemMgr
{
public:
static CGiveItemMgr& GetInstance();
void SetDBComponent(CDBComponent& DBComponent);
void CheckGiveItem();
void ReadGiveInfo();
bool UpdateItemSerial(unsigned long dwCreateID, unsigned __int64 dwItemSerial);
#ifdef AUTH_MY
bool UpdateBuyItemInfo();
#endif
private:
// first : <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// second : <20><>Ʈ<EFBFBD><C6AE>ũ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. 0<≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD>)
typedef std::pair<GiveItemInfo, unsigned long> GiveItem;
typedef std::map<unsigned long, GiveItem, std::less<unsigned long>,
boost::fast_pool_allocator< std::pair<unsigned long, GiveItem> > > GiveItemMap;
CGiveItemMgr();
~CGiveItemMgr();
bool UpdateItemSerial(GiveItemMap::iterator pos,
GiveItemMap::iterator& NextPos, unsigned __int64 dwItemSerial);
bool SetItem(char* szData, unsigned long& dwDataSize_InOut,
unsigned long dwMaxDataSize, GiveItemInfo& giveItemInfo,
unsigned long dwMaxItemNum, unsigned __int64& dwItemUID);
CDBComponent* m_lpDBComponent;
GiveItemMap m_GiveItemMap;
OleDB::PARAM_INFO m_UpdateParamInfo;
#ifdef AUTH_MY
std::list<NFITEMINFO> m_NFItemInfo;
#endif
};
#endif