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