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:
597
Server/RylServerProject/RylDBAgentServer/Castle/CastleDB.cpp
Normal file
597
Server/RylServerProject/RylDBAgentServer/Castle/CastleDB.cpp
Normal file
@@ -0,0 +1,597 @@
|
||||
#include "stdafx.h"
|
||||
#include "CastleDB.h"
|
||||
|
||||
#include <Creature/Siege/SiegeObjectDB.h>
|
||||
#include <Creature/Siege/CastleGateDB.h>
|
||||
|
||||
#include <Community/Guild/GuildDB.h>
|
||||
#include <Community/Guild/GuildDBMgr.h>
|
||||
|
||||
#include <DB/DBComponent.h>
|
||||
#include <Castle/CastleDBComponent.h>
|
||||
#include <Castle/CastleDBMgr.h>
|
||||
#include <GameTime/GameTimeDBMgr.h>
|
||||
|
||||
#include <Network/Packet/WrapPacket.h>
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
#include <Network/Packet/PacketStruct/ServerInfo.h>
|
||||
#include <Network/Dispatch/GameDispatch.h>
|
||||
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
#include <Log/ServerLog.h>
|
||||
|
||||
|
||||
CCastleDB::CCastleDB(CDBComponent& DBComponent, const CastleInfoDB& CastleInfo)
|
||||
: m_dwCastleID(Castle::CASTLE_BIT | CastleInfo.m_dwCastleID),
|
||||
m_cNation(CastleInfo.m_cNation),
|
||||
m_cZone(CastleInfo.m_cZone),
|
||||
m_cChannel(CastleInfo.m_cChannel),
|
||||
m_cNameID(CastleInfo.m_cNameID),
|
||||
m_cSiegeCount(CastleInfo.m_cSiegeCount),
|
||||
m_cInvincibleCount(CastleInfo.m_cInvincibleCount),
|
||||
m_wTotalSiegeCount(CastleInfo.m_wTotalSiegeCount),
|
||||
m_dwTotalTaxMoney(CastleInfo.m_dwTotalTaxMoney),
|
||||
m_wItemID(CastleInfo.m_wItemID),
|
||||
m_cItemNum(CastleInfo.m_cItemNum),
|
||||
m_bEnableSiege(false),
|
||||
m_DBComponent(DBComponent)
|
||||
{
|
||||
::memcpy(&m_CastleRight, CastleInfo.m_szRight, sizeof(CastleRight));
|
||||
|
||||
m_BackDoorPos[0] = CastleInfo.m_InPos;
|
||||
m_BackDoorPos[1] = CastleInfo.m_OutPos;
|
||||
|
||||
::memset(&m_CastleTax, 0, sizeof(CastleTaxInfo) * Castle::MAX_TAX_TYPE);
|
||||
|
||||
CheckEnableSiege( CGameTimeDBMgr::GetInstance().IsSiegeWarTime() );
|
||||
}
|
||||
|
||||
CCastleDB::~CCastleDB()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
bool CCastleDB::ChangeCastleMaster(unsigned char cNation)
|
||||
{
|
||||
m_cNation = cNation;
|
||||
m_cSiegeCount = 0;
|
||||
m_cInvincibleCount = Castle::INVINCIBLE_COUNT;
|
||||
m_wTotalSiegeCount = 0;
|
||||
m_dwTotalTaxMoney = 0;
|
||||
m_wItemID = 0;
|
||||
m_cItemNum = 0;
|
||||
|
||||
m_bEnableSiege = (m_cInvincibleCount > 0) ? false : true;
|
||||
|
||||
m_CastleRight = CastleRight();
|
||||
::memset(&m_CastleTax, 0, sizeof(CastleTaxInfo) * Castle::MAX_TAX_TYPE);
|
||||
m_AccumulatedMineralMap.clear();
|
||||
m_TemporaryMineralMap.clear();
|
||||
|
||||
// DB <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
DBComponent::CastleDB::UpdateCastleInfo(m_DBComponent, m_dwCastleID, m_cNation, m_cSiegeCount, m_cInvincibleCount,
|
||||
m_wTotalSiegeCount, m_dwTotalTaxMoney, m_wItemID, m_cItemNum);
|
||||
DBComponent::CastleDB::DeleteCastleTaxInfo(m_DBComponent, m_dwCastleID);
|
||||
DBComponent::CastleDB::DeleteCastleMineralInfo(m_DBComponent, m_dwCastleID);
|
||||
DBComponent::CastleDB::UpdateCastleRight(m_DBComponent, m_dwCastleID, reinterpret_cast<char *>(&m_CastleRight), sizeof(CastleRight));
|
||||
|
||||
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
ChangeCastleObjectNation(cNation);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>⸦ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> NPC <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
|
||||
DestroyAllCastleArms();
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
CGameTimeDBMgr::GetInstance().SendGameTimeInfo( GetCastleID() );
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CCastleDB::InsertCastleObject(CSiegeObjectDB* lpCastleObject)
|
||||
{
|
||||
if (lpCastleObject)
|
||||
{
|
||||
lpCastleObject->SetNation(m_cNation);
|
||||
lpCastleObject->SetZoneChannel(m_cZone, m_cChannel);
|
||||
|
||||
return m_CastleObjectMap.insert(std::make_pair(lpCastleObject->GetCID(), lpCastleObject)).second;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool CCastleDB::DeleteCastleObject(unsigned long dwCID)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CCastleDB::DeleteCastleObject(CSiegeObjectDB* lpSiegeObject)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
void CCastleDB::LoseOwnership()
|
||||
{
|
||||
m_cNation = 0;
|
||||
m_cSiegeCount = 0;
|
||||
m_cInvincibleCount = 0;
|
||||
m_wTotalSiegeCount = 0;
|
||||
m_dwTotalTaxMoney = 0;
|
||||
m_wItemID = 0;
|
||||
m_cItemNum = 0;
|
||||
m_bEnableSiege = true;
|
||||
|
||||
m_CastleRight = CastleRight();
|
||||
::memset(&m_CastleTax, 0, sizeof(CastleTaxInfo) * Castle::MAX_TAX_TYPE);
|
||||
m_AccumulatedMineralMap.clear();
|
||||
m_TemporaryMineralMap.clear();
|
||||
|
||||
// DB <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ..
|
||||
DBComponent::CastleDB::UpdateCastleInfo(m_DBComponent, m_dwCastleID, m_cNation, m_cSiegeCount, m_cInvincibleCount,
|
||||
m_wTotalSiegeCount, m_dwTotalTaxMoney, m_wItemID, m_cItemNum);
|
||||
DBComponent::CastleDB::DeleteCastleTaxInfo(m_DBComponent, m_dwCastleID);
|
||||
DBComponent::CastleDB::DeleteCastleMineralInfo(m_DBComponent, m_dwCastleID);
|
||||
DBComponent::CastleDB::UpdateCastleRight(m_DBComponent, m_dwCastleID, reinterpret_cast<char *>(&m_CastleRight), sizeof(CastleRight));
|
||||
|
||||
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>߸<EFBFBD>ȭ
|
||||
ChangeCastleObjectNation(0);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>⸦ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> NPC <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
|
||||
DestroyAllCastleArms();
|
||||
|
||||
// <20><> <20><><EFBFBD><EFBFBD> <20>߸<EFBFBD>ȭ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
CSiegeObjectDB* lpEmblem = GetCastleEmblem();
|
||||
if (lpEmblem)
|
||||
{
|
||||
lpEmblem->SendCastleCmd(0, PktCastleCmd::CASTLE_LOSE_OWNERSHIP);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
CGameTimeDBMgr::GetInstance().SendGameTimeInfo( GetCastleID() );
|
||||
}
|
||||
|
||||
void CCastleDB::CloseCastleGate()
|
||||
{
|
||||
CSiegeObjectDB* lpGate = GetCastleGate();
|
||||
if (lpGate)
|
||||
{
|
||||
// HP <20><> Full <20><> <20>ϴ°<CFB4><C2B0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD> ä<><C3A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
|
||||
static_cast<CCastleGateDB* >(lpGate)->ForceClose();
|
||||
}
|
||||
}
|
||||
|
||||
void CCastleDB::OpenCastleGate()
|
||||
{
|
||||
CSiegeObjectDB* lpGate = GetCastleGate();
|
||||
if (lpGate)
|
||||
{
|
||||
// HP <20><> Full <20><> <20>ϴ°<CFB4><C2B0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD> ä<><C3A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
|
||||
static_cast<CCastleGateDB* >(lpGate)->ForceOpen();
|
||||
}
|
||||
}
|
||||
|
||||
void CCastleDB::ChangeCastleObjectNation(unsigned char cNation)
|
||||
{
|
||||
CastleObjectMap::iterator itr = m_CastleObjectMap.begin();
|
||||
CastleObjectMap::iterator end = m_CastleObjectMap.end();
|
||||
|
||||
CSiegeObjectDB* lpCastleObject = NULL;
|
||||
while (itr != end)
|
||||
{
|
||||
lpCastleObject = itr->second;
|
||||
if (lpCastleObject)
|
||||
{
|
||||
lpCastleObject->SetNation(cNation);
|
||||
}
|
||||
|
||||
++itr;
|
||||
}
|
||||
}
|
||||
|
||||
void CCastleDB::DestroyAllCastleArms()
|
||||
{
|
||||
CastleObjectMap::iterator itr = m_CastleObjectMap.begin();
|
||||
CastleObjectMap::iterator end = m_CastleObjectMap.end();
|
||||
|
||||
CSiegeObjectDB* lpCastleObject = NULL;
|
||||
while (itr != end)
|
||||
{
|
||||
lpCastleObject = itr->second;
|
||||
if (lpCastleObject && lpCastleObject->IsCastleArms())
|
||||
{
|
||||
lpCastleObject->Destroy(); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> NPC <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
|
||||
|
||||
// <20>߰輭<DFB0><E8BCAD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ı<EFBFBD><C4B1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʰ<EFBFBD>,
|
||||
// <20>߰輭<DFB0><E8BCAD><EFBFBD><EFBFBD> <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20>س<EFBFBD><D8B3><EFBFBD><EFBFBD><EFBFBD>..
|
||||
//lpCastleObject->SendCastleCmd(0, PktCastleCmd::CASTLE_DESTROY_ARMS);
|
||||
}
|
||||
|
||||
++itr;
|
||||
}
|
||||
}
|
||||
|
||||
CSiegeObjectDB* CCastleDB::GetCastleEmblem()
|
||||
{
|
||||
CastleObjectMap::iterator itr = m_CastleObjectMap.begin();
|
||||
CSiegeObjectDB* lpCastleObject = NULL;
|
||||
|
||||
while (itr != m_CastleObjectMap.end())
|
||||
{
|
||||
lpCastleObject = itr->second;
|
||||
if (lpCastleObject && lpCastleObject->IsEmblem())
|
||||
{
|
||||
return lpCastleObject;
|
||||
}
|
||||
|
||||
++itr;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
CSiegeObjectDB* CCastleDB::GetCastleGate()
|
||||
{
|
||||
CastleObjectMap::iterator itr = m_CastleObjectMap.begin();
|
||||
CSiegeObjectDB* lpCastleObject = NULL;
|
||||
|
||||
while (itr != m_CastleObjectMap.end())
|
||||
{
|
||||
lpCastleObject = itr->second;
|
||||
if (lpCastleObject && lpCastleObject->IsGate())
|
||||
{
|
||||
return lpCastleObject;
|
||||
}
|
||||
|
||||
++itr;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
CSiegeObjectDB* CCastleDB::GetCastleObject(unsigned long dwCastleObjectID)
|
||||
{
|
||||
CastleObjectMap::iterator itr = m_CastleObjectMap.find(dwCastleObjectID);
|
||||
if (itr != m_CastleObjectMap.end()) return itr->second;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void CCastleDB::CheckEnableSiege(bool bIsSiegeTime)
|
||||
{
|
||||
if (bIsSiegeTime == m_bEnableSiege)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
m_bEnableSiege = false;
|
||||
if (bIsSiegeTime && 0 == m_cInvincibleCount)
|
||||
{
|
||||
m_bEnableSiege = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CCastleDB::UpdateSiegeCount()
|
||||
{
|
||||
SERVER_ID serverID;
|
||||
serverID.sID.Type = CServerSetup::GameServer;
|
||||
serverID.sID.Group = CServerSetup::GetInstance().GetServerGroup();
|
||||
serverID.sID.Channel = m_cChannel;
|
||||
serverID.sID.ID = m_cZone;
|
||||
|
||||
GET_MULTI_DISPATCH(lpGameDispatch, serverID.dwID,
|
||||
DBAgent::CGameDispatch, DBAgent::CGameDispatch::GetDispatchTable());
|
||||
|
||||
if (m_bEnableSiege)
|
||||
{
|
||||
++m_wTotalSiegeCount;
|
||||
}
|
||||
|
||||
if (m_cInvincibleCount)
|
||||
{
|
||||
--m_cInvincibleCount;
|
||||
}
|
||||
|
||||
++m_cSiegeCount;
|
||||
if (m_cSiegeCount >= Castle::TEMP_TAX_GAIN_COUNT)
|
||||
{
|
||||
m_cSiegeCount = 0;
|
||||
unsigned long dwMoveTempMoney[ Castle::MAX_TAX_TYPE ] = { 0, };
|
||||
|
||||
for (int i=0; i<Castle::MAX_TAX_TYPE; ++i)
|
||||
{
|
||||
dwMoveTempMoney[ i ] = m_CastleTax[ i ].m_dwTempTaxMoney;
|
||||
m_CastleTax[ i ].m_dwTaxMoney += m_CastleTax[ i ].m_dwTempTaxMoney;
|
||||
m_CastleTax[ i ].m_dwTempTaxMoney = 0;
|
||||
|
||||
// DB <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
DBComponent::CastleDB::UpdateCastleTaxMoney(m_DBComponent, m_dwCastleID, i, m_CastleTax[ i ].m_dwTempTaxMoney, m_CastleTax[ i ].m_dwTaxMoney);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
if (NULL != lpGameDispatch)
|
||||
{
|
||||
CSendStream& SendStream = lpGameDispatch->GetSendStream();
|
||||
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktCastleTaxMove));
|
||||
if (NULL != lpBuffer)
|
||||
{
|
||||
PktCastleTaxMove* lpPktCastleTaxMove = reinterpret_cast<PktCastleTaxMove*>(lpBuffer);
|
||||
|
||||
lpPktCastleTaxMove->m_dwCastleID = m_dwCastleID;
|
||||
for (int j=0; j<Castle::MAX_TAX_TYPE; ++j)
|
||||
{
|
||||
lpPktCastleTaxMove->m_dwMoveTempMoney[ j ] = dwMoveTempMoney[ j ];
|
||||
lpPktCastleTaxMove->m_dwResultTaxMoney[ j ] = m_CastleTax[ j ].m_dwTaxMoney;
|
||||
}
|
||||
|
||||
SendStream.WrapHeader(sizeof(PktCastleTaxMove), CmdCastleTaxMove, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// DB <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
DBComponent::CastleDB::UpdateCastleSiegeCount(m_DBComponent, m_dwCastleID, m_cSiegeCount, m_cInvincibleCount, m_wTotalSiegeCount);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> Ƚ<><C8BD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
if (NULL != lpGameDispatch)
|
||||
{
|
||||
CSendStream& SendStream = lpGameDispatch->GetSendStream();
|
||||
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktCastleSiegeCount));
|
||||
if (NULL != lpBuffer)
|
||||
{
|
||||
PktCastleSiegeCount* lpPktCastleSiegeCount = reinterpret_cast<PktCastleSiegeCount*>(lpBuffer);
|
||||
|
||||
lpPktCastleSiegeCount->m_dwCastleID = m_dwCastleID;
|
||||
lpPktCastleSiegeCount->m_cSiegeCount = m_cSiegeCount;
|
||||
lpPktCastleSiegeCount->m_cInvincibleCount = m_cInvincibleCount;
|
||||
lpPktCastleSiegeCount->m_wTotalSiegeCount = m_wTotalSiegeCount;
|
||||
|
||||
SendStream.WrapHeader(sizeof(PktCastleSiegeCount), CmdCastleSiegeCount, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
|
||||
for (int i=0; i<Castle::MAX_TAX_TYPE; ++i)
|
||||
{
|
||||
m_CastleTax[ i ].m_cTaxChangable = Castle::TAX_ENABLE;
|
||||
|
||||
// DB <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
DBComponent::CastleDB::UpdateCastleTaxChangable(m_DBComponent, m_dwCastleID, i, Castle::TAX_ENABLE);
|
||||
}
|
||||
}
|
||||
|
||||
// <20>ŵξ<C5B5> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ݰ<EFBFBD><DDB0><EFBFBD>
|
||||
void CCastleDB::TakeTaxMoney(unsigned char cType, unsigned long dwTakeTaxMoney)
|
||||
{
|
||||
// CASTLE_TODO : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴϹǷ<CFB9> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD> <20>ּ<EFBFBD> ó<><C3B3> <20>صд<D8B5>.
|
||||
/*
|
||||
// edith <20><><EFBFBD><EFBFBD> <20>κ<EFBFBD> <20>߰<EFBFBD> (<28>ּ<EFBFBD>ó<EFBFBD><C3B3> <20><><EFBFBD><EFBFBD>)
|
||||
Guild::CGuildDB* lpGuild = static_cast<Guild::CGuildDB*>(
|
||||
Guild::CGuildDBMgr::GetInstance().GetGuild(m_dwGID));
|
||||
|
||||
if (lpGuild)
|
||||
{
|
||||
if (Castle::CAMP_MINERAL_TAX == cType)
|
||||
{
|
||||
m_dwTotalTaxMoney += dwTakeTaxMoney;
|
||||
|
||||
// DB <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
DBComponent::CastleDB::UpdateCastleTotalTaxMoney(m_DBComponent, m_dwCastleID, m_dwTotalTaxMoney);
|
||||
}
|
||||
else
|
||||
{
|
||||
lpGuild->AddGold(dwTakeTaxMoney);
|
||||
m_CastleTax[ cType ].m_dwTaxMoney -= dwTakeTaxMoney;
|
||||
m_dwTotalTaxMoney += dwTakeTaxMoney;
|
||||
|
||||
// DB <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
DBComponent::CastleDB::UpdateCastleTaxMoney(m_DBComponent, m_dwCastleID, cType,
|
||||
m_CastleTax[cType].m_dwTempTaxMoney, m_CastleTax[cType].m_dwTaxMoney);
|
||||
|
||||
DBComponent::CastleDB::UpdateCastleTotalTaxMoney(m_DBComponent, m_dwCastleID, m_dwTotalTaxMoney);
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ȸ<><C8B8>
|
||||
bool CCastleDB::GainMineral(unsigned short wMineralID, unsigned short wAmount)
|
||||
{
|
||||
MineralInfoMap::iterator itr = m_AccumulatedMineralMap.find(wMineralID);
|
||||
|
||||
if (itr != m_AccumulatedMineralMap.end())
|
||||
{
|
||||
if (itr->second < wAmount)
|
||||
{
|
||||
ERRLOG4(g_Log, "ȹ<EFBFBD><EFBFBD><EFBFBD>ҷ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.( CastleID : 0x%08x, MineralID : %d, CurrentAmount : %d, GainAmount : %d )",
|
||||
m_dwCastleID, wMineralID, itr->second, wAmount);
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (itr->second == wAmount)
|
||||
{
|
||||
DBComponent::CastleDB::DeleteCastleMineralInfo(m_DBComponent, m_dwCastleID, Siege::ACCUMULATED_MINERAL, wMineralID);
|
||||
m_AccumulatedMineralMap.erase(itr);
|
||||
}
|
||||
else
|
||||
{
|
||||
itr->second -= wAmount;
|
||||
DBComponent::CastleDB::UpdateCastleMineralInfo(m_DBComponent, m_dwCastleID, Siege::ACCUMULATED_MINERAL, wMineralID, itr->second);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD> <20>ӽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
bool CCastleDB::SetTempTaxMoney(unsigned long* dwTempTaxMoney, unsigned long* dwTaxMoney)
|
||||
{
|
||||
if (NULL == dwTempTaxMoney || NULL == dwTaxMoney)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
for (int i=0; i<Castle::MAX_TAX_TYPE; ++i)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ѵ<EFBFBD>.!!
|
||||
// (GS -> DBA : <20>ӽ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD>, DBA -> GS : <20>ӽ<EFBFBD> <20><><EFBFBD><EFBFBD> -> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD>)
|
||||
if (m_CastleTax[ i ].m_dwTaxMoney == dwTaxMoney[ i ])
|
||||
{
|
||||
m_CastleTax[ i ].m_dwTempTaxMoney = dwTempTaxMoney[ i ];
|
||||
|
||||
// DB <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
DBComponent::CastleDB::UpdateCastleTaxMoney(m_DBComponent, m_dwCastleID, i,
|
||||
m_CastleTax[i].m_dwTempTaxMoney, m_CastleTax[i].m_dwTaxMoney);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
bool CCastleDB::SetMineralInfo(unsigned char cMineralType, unsigned char cNum, CastleMineral* lpMineralInfo)
|
||||
{
|
||||
switch (cMineralType)
|
||||
{
|
||||
case Siege::TEMPORARY_MINERAL :
|
||||
{
|
||||
DBComponent::CastleDB::DeleteCastleMineralInfo(m_DBComponent, m_dwCastleID, cMineralType);
|
||||
m_TemporaryMineralMap.clear();
|
||||
|
||||
for (int i=0; i<cNum; ++i)
|
||||
{
|
||||
DBComponent::CastleDB::InsertCastleMineralInfo(m_DBComponent, m_dwCastleID, cMineralType,
|
||||
lpMineralInfo->m_wMineralID, lpMineralInfo->m_wAmount);
|
||||
|
||||
InsertMineralInfo(cMineralType, *lpMineralInfo);
|
||||
++lpMineralInfo;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case Siege::ACCUMULATED_MINERAL :
|
||||
{
|
||||
DBComponent::CastleDB::DeleteCastleMineralInfo(m_DBComponent, m_dwCastleID, cMineralType);
|
||||
m_AccumulatedMineralMap.clear();
|
||||
|
||||
for (int i=0; i<cNum; ++i)
|
||||
{
|
||||
DBComponent::CastleDB::InsertCastleMineralInfo(m_DBComponent, m_dwCastleID, cMineralType,
|
||||
lpMineralInfo->m_wMineralID, lpMineralInfo->m_wAmount);
|
||||
|
||||
InsertMineralInfo(cMineralType, *lpMineralInfo);
|
||||
++lpMineralInfo;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default: return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void CCastleDB::SetTax(unsigned char cType, unsigned char cTax) // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
{
|
||||
if (cType < Castle::MAX_TAX_TYPE)
|
||||
{
|
||||
m_CastleTax[ cType ].m_cTax = cTax;
|
||||
m_CastleTax[ cType ].m_cTaxChangable = Castle::TAX_DISABLE;
|
||||
|
||||
DBComponent::CastleDB::UpdateCastleTax(m_DBComponent, m_dwCastleID, cType, cTax);
|
||||
DBComponent::CastleDB::UpdateCastleTaxChangable(m_DBComponent, m_dwCastleID, cType, Castle::TAX_DISABLE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool CCastleDB::SetTaxInfo(const CastleTaxInfoDB& taxInfo)
|
||||
{
|
||||
if (taxInfo.m_cTaxType < Castle::MAX_TAX_TYPE)
|
||||
{
|
||||
m_CastleTax[ taxInfo.m_cTaxType ].m_cTaxType = taxInfo.m_cTaxType;
|
||||
m_CastleTax[ taxInfo.m_cTaxType ].m_cTax = taxInfo.m_cTax;
|
||||
m_CastleTax[ taxInfo.m_cTaxType ].m_dwTempTaxMoney = taxInfo.m_dwTempTaxMoney;
|
||||
m_CastleTax[ taxInfo.m_cTaxType ].m_dwTaxMoney = taxInfo.m_dwTaxMoney;
|
||||
m_CastleTax[ taxInfo.m_cTaxType ].m_cTaxChangable = taxInfo.m_cTaxChangable;
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// TODO : Log
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CCastleDB::SetMineralInfo(const CastleMineralInfoDB& mineralInfo)
|
||||
{
|
||||
if (mineralInfo.m_wAmount > 0)
|
||||
{
|
||||
switch (mineralInfo.m_cFlag)
|
||||
{
|
||||
case Siege::ACCUMULATED_MINERAL :
|
||||
{
|
||||
m_AccumulatedMineralMap.insert( std::make_pair(mineralInfo.m_wMineralID, mineralInfo.m_wAmount) ).second;
|
||||
}
|
||||
break;
|
||||
|
||||
case Siege::TEMPORARY_MINERAL :
|
||||
{
|
||||
m_TemporaryMineralMap.insert( std::make_pair(mineralInfo.m_wMineralID, mineralInfo.m_wAmount) ).second;
|
||||
}
|
||||
break;
|
||||
|
||||
default: return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CCastleDB::InsertMineralInfo(unsigned char cMineralType, const CastleMineral& mineralInfo)
|
||||
{
|
||||
if (mineralInfo.m_wAmount > 0)
|
||||
{
|
||||
switch (cMineralType)
|
||||
{
|
||||
case Siege::ACCUMULATED_MINERAL :
|
||||
{
|
||||
m_AccumulatedMineralMap.insert( std::make_pair(mineralInfo.m_wMineralID, mineralInfo.m_wAmount) ).second;
|
||||
}
|
||||
break;
|
||||
|
||||
case Siege::TEMPORARY_MINERAL :
|
||||
{
|
||||
m_TemporaryMineralMap.insert( std::make_pair(mineralInfo.m_wMineralID, mineralInfo.m_wAmount) ).second;
|
||||
}
|
||||
break;
|
||||
|
||||
default: return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CCastleDB::SetRight(CastleRight castleRight) // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
{
|
||||
m_CastleRight = castleRight;
|
||||
|
||||
DBComponent::CastleDB::UpdateCastleRight(m_DBComponent, m_dwCastleID, reinterpret_cast<char*>(&m_CastleRight), sizeof(CastleRight));
|
||||
}
|
||||
|
||||
void CCastleDB::SetUpgradeItemInfo(unsigned short wItemID, unsigned char cItemNum)
|
||||
{
|
||||
m_wItemID = wItemID;
|
||||
m_cItemNum = cItemNum;
|
||||
|
||||
DBComponent::CastleDB::UpdateCastleUpgradeItemInfo(m_DBComponent, m_dwCastleID, m_wItemID, m_cItemNum);
|
||||
}
|
||||
108
Server/RylServerProject/RylDBAgentServer/Castle/CastleDB.h
Normal file
108
Server/RylServerProject/RylDBAgentServer/Castle/CastleDB.h
Normal file
@@ -0,0 +1,108 @@
|
||||
#ifndef _RYL_DBAGENT_CASTLE_DB_H_
|
||||
#define _RYL_DBAGENT_CASTLE_DB_H_
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <map>
|
||||
#include <Castle/CastleConstants.h>
|
||||
#include <Creature/CreatureStructure.h>
|
||||
#include <Network/Packet/PacketStruct/CastlePacket.h>
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
class CSiegeObjectDB;
|
||||
class CDBComponent;
|
||||
|
||||
namespace Castle
|
||||
{
|
||||
class CCastleDB
|
||||
{
|
||||
public:
|
||||
|
||||
~CCastleDB();
|
||||
|
||||
// Ÿ<><C5B8> <20><><EFBFBD><EFBFBD>
|
||||
typedef std::map<unsigned short, unsigned short> MineralInfoMap; // <wMineralID, wAmount>
|
||||
typedef std::map<unsigned long, CSiegeObjectDB*> CastleObjectMap; // <ObjectCID, lpCastleObject>
|
||||
|
||||
bool ChangeCastleMaster(unsigned char cNation); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
void LoseOwnership(); // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߸<EFBFBD>ȭ
|
||||
|
||||
void CloseCastleGate(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ݴ´<DDB4>.
|
||||
void OpenCastleGate(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. (<28>μ<EFBFBD><CEBC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
|
||||
|
||||
void ChangeCastleObjectNation(unsigned char cNation); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
void DestroyAllCastleArms(); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> NPC <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
|
||||
bool InsertCastleObject(CSiegeObjectDB* lpCastleObject); // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>߰<EFBFBD>
|
||||
bool DeleteCastleObject(unsigned long dwCID); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
bool DeleteCastleObject(CSiegeObjectDB* lpCastleObject); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
CSiegeObjectDB* GetCastleEmblem();
|
||||
CSiegeObjectDB* GetCastleGate();
|
||||
CSiegeObjectDB* GetCastleObject(unsigned long dwCastleObjectID);
|
||||
|
||||
void CheckEnableSiege(bool bIsSiegeTime);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>ŵ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
void UpdateSiegeCount();
|
||||
|
||||
void SetTax(unsigned char cType, unsigned char cTax); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
void TakeTaxMoney(unsigned char cType, unsigned long dwTakeTaxMoney); // <20><><EFBFBD><EFBFBD> ȸ<><C8B8>
|
||||
bool GainMineral(unsigned short wMineralID, unsigned short wAmount); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ȸ<><C8B8>
|
||||
bool SetTempTaxMoney(unsigned long* dwTempTaxMoney, unsigned long* dwTaxMoney); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD> <20>ӽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
bool SetMineralInfo(unsigned char cMineralType, unsigned char cNum, CastleMineral* lpMineralInfo); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
bool InsertMineralInfo(unsigned char cMineralType, const CastleMineral& mineralInfo); // Mineral <20>߰<EFBFBD>
|
||||
void SetRight(CastleRight castleRight); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
void SetUpgradeItemInfo(unsigned short wItemID, unsigned char cItemNum);
|
||||
|
||||
bool SetTaxInfo(const CastleTaxInfoDB& taxInfo); // DB <20><><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD> Tax <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
bool SetMineralInfo(const CastleMineralInfoDB& mineralInfo); // DB <20><><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD> Mineral <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
unsigned long GetCastleID() const { return m_dwCastleID; }
|
||||
unsigned long GetNation() const { return m_cNation; }
|
||||
unsigned char GetZone() const { return m_cZone; }
|
||||
unsigned char GetChannel() const { return m_cChannel; }
|
||||
|
||||
unsigned char GetTax(unsigned char cType) const { return m_CastleTax[cType].m_cTax; }
|
||||
unsigned long GetTaxMoney(unsigned char cType) const { return m_CastleTax[cType].m_dwTaxMoney; }
|
||||
unsigned char GetSiegeCount() const { return m_cSiegeCount; }
|
||||
unsigned char GetInvincibleCount() const { return m_cInvincibleCount; }
|
||||
unsigned short GetTotalSiegeCount() const { return m_wTotalSiegeCount; }
|
||||
unsigned long GetTotalTaxMoney() const { return m_dwTotalTaxMoney; }
|
||||
bool GetEnableSiege() const { return m_bEnableSiege; }
|
||||
|
||||
private:
|
||||
|
||||
CCastleDB(CDBComponent& DBComponent, const CastleInfoDB& CastleInfo);
|
||||
|
||||
CastleObjectMap m_CastleObjectMap; // <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
|
||||
|
||||
unsigned long m_dwCastleID; // <20><> Ȥ<><C8A4> <20><><EFBFBD><EFBFBD> ID
|
||||
unsigned char m_cNation; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
unsigned char m_cZone; // <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><> <20><>ȣ
|
||||
unsigned char m_cChannel; // <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> ä<><C3A4> <20><>ȣ
|
||||
unsigned char m_cNameID; // <20><><EFBFBD><EFBFBD> <20≯<EFBFBD> ID ( 1<><31><EFBFBD><EFBFBD>~~ )
|
||||
unsigned char m_cSiegeCount; // <20><><EFBFBD><EFBFBD> Ƚ<><C8BD>
|
||||
unsigned char m_cInvincibleCount; // <20><><EFBFBD><EFBFBD> Ƚ<><C8BD>
|
||||
unsigned short m_wTotalSiegeCount; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ƚ<><C8BD>
|
||||
unsigned long m_dwTotalTaxMoney; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ȸ<><C8B8><EFBFBD><EFBFBD>
|
||||
unsigned short m_wItemID; // <20><><EFBFBD><EFBFBD><D7B7>̵忡 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID
|
||||
unsigned char m_cItemNum; // <20><><EFBFBD><EFBFBD><D7B7>̵忡 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
CastleRight m_CastleRight; // <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
Position m_BackDoorPos[2]; // <20><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>/<2F><><EFBFBD><EFBFBD>ġ
|
||||
|
||||
CastleTaxInfo m_CastleTax[Castle::MAX_TAX_TYPE]; // <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
MineralInfoMap m_AccumulatedMineralMap; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
MineralInfoMap m_TemporaryMineralMap; // <20>ӽ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
bool m_bEnableSiege; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD>?
|
||||
|
||||
CDBComponent& m_DBComponent;
|
||||
|
||||
friend class CCastleDBMgr;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // _RYL_DBAGENT_CASTLE_DB_H_
|
||||
532
Server/RylServerProject/RylDBAgentServer/Castle/CastleDBMgr.cpp
Normal file
532
Server/RylServerProject/RylDBAgentServer/Castle/CastleDBMgr.cpp
Normal file
@@ -0,0 +1,532 @@
|
||||
#include "stdafx.h"
|
||||
|
||||
#include "CastleDB.h"
|
||||
#include "CastleDBMgr.h"
|
||||
|
||||
#include <DB/DBComponent.h>
|
||||
#include <Log/ServerLog.h>
|
||||
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
#include <Utility/TokenlizedFile.h>
|
||||
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
#include <Network/Packet/WrapPacket.h>
|
||||
#include <Network/Packet/PacketStruct/CastlePacket.h>
|
||||
#include <Network/Stream/SendStream.h>
|
||||
#include <Network/Dispatch/GameDispatch.h>
|
||||
|
||||
#include <Creature/Siege/SiegeConstants.h>
|
||||
#include <Creature/Siege/SiegeObjectDB.h>
|
||||
#include <Creature/Siege/SiegeObjectDBMgr.h>
|
||||
|
||||
#include <Castle/CastleConstants.h>
|
||||
#include <Castle/CastleDB.h>
|
||||
#include <Castle/CastleDBComponent.h>
|
||||
|
||||
#include <atltime.h>
|
||||
|
||||
using namespace Castle;
|
||||
using namespace Siege;
|
||||
|
||||
|
||||
CCastleDB* CCastleDBMgr::CreateCastleDB(const CastleInfoDB& CastleInfo)
|
||||
{
|
||||
return 0 != m_lpDBComponent ? new CCastleDB(*m_lpDBComponent, CastleInfo) : 0;
|
||||
}
|
||||
|
||||
void CCastleDBMgr::DeleteCastleDB(CCastleDB* lpCastleDB)
|
||||
{
|
||||
delete lpCastleDB;
|
||||
}
|
||||
|
||||
|
||||
CCastleDBMgr& CCastleDBMgr::GetInstance()
|
||||
{
|
||||
static CCastleDBMgr castleDBMgr;
|
||||
return castleDBMgr;
|
||||
}
|
||||
|
||||
|
||||
CCastleDBMgr::CCastleDBMgr()
|
||||
: m_lpDBComponent(0),
|
||||
m_CastlePool(sizeof(CCastleDB))
|
||||
{
|
||||
}
|
||||
|
||||
CCastleDBMgr::~CCastleDBMgr()
|
||||
{
|
||||
Destroy();
|
||||
}
|
||||
|
||||
bool CCastleDBMgr::Initialize(CDBComponent& DBComponent)
|
||||
{
|
||||
m_lpDBComponent = &DBComponent;
|
||||
|
||||
if (true == CServerSetup::GetInstance().UseContents(GameRYL::SIEGE))
|
||||
{
|
||||
if (false == ReadCastleInfoDB()) return false;
|
||||
if (false == ReadCastleTaxInfoDB()) return false;
|
||||
if (false == ReadCastleMineralInfoDB()) return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CCastleDBMgr::Destroy()
|
||||
{
|
||||
if (0 == m_CastleMap.size()) return;
|
||||
|
||||
CastleMap::iterator CastleItr = m_CastleMap.begin();
|
||||
CastleMap::iterator CastleEnd = m_CastleMap.end();
|
||||
|
||||
while (CastleItr != CastleEnd)
|
||||
{
|
||||
CCastleDB* lpCastleDB = CastleItr->second;
|
||||
|
||||
if (lpCastleDB)
|
||||
{
|
||||
DeleteCastleDB(lpCastleDB);
|
||||
}
|
||||
|
||||
++CastleItr;
|
||||
}
|
||||
|
||||
m_CastleMap.clear();
|
||||
}
|
||||
|
||||
|
||||
void CCastleDBMgr::CheckEnableSiegeForAllCastle(bool bIsSiegeTime)
|
||||
{
|
||||
CCastleDB* lpCastle;
|
||||
CastleMap::iterator itr = m_CastleMap.begin();
|
||||
while (itr != m_CastleMap.end())
|
||||
{
|
||||
lpCastle = itr->second;
|
||||
if (lpCastle)
|
||||
{
|
||||
lpCastle->CheckEnableSiege(bIsSiegeTime);
|
||||
}
|
||||
|
||||
++itr;
|
||||
}
|
||||
}
|
||||
|
||||
void CCastleDBMgr::UpdateSiegeCount()
|
||||
{
|
||||
CCastleDB* lpCastle;
|
||||
CastleMap::iterator itr = m_CastleMap.begin();
|
||||
while (itr != m_CastleMap.end())
|
||||
{
|
||||
lpCastle = itr->second;
|
||||
if (lpCastle)
|
||||
{
|
||||
lpCastle->UpdateSiegeCount();
|
||||
}
|
||||
|
||||
++itr;
|
||||
}
|
||||
}
|
||||
|
||||
void CCastleDBMgr::DestroyAllCastleArms()
|
||||
{
|
||||
CCastleDB* lpCastle;
|
||||
CastleMap::iterator itr = m_CastleMap.begin();
|
||||
while (itr != m_CastleMap.end())
|
||||
{
|
||||
lpCastle = itr->second;
|
||||
if (lpCastle)
|
||||
{
|
||||
lpCastle->DestroyAllCastleArms();
|
||||
}
|
||||
|
||||
++itr;
|
||||
}
|
||||
}
|
||||
|
||||
void CCastleDBMgr::CloseCastleGate()
|
||||
{
|
||||
CCastleDB* lpCastle;
|
||||
CastleMap::iterator itr = m_CastleMap.begin();
|
||||
while (itr != m_CastleMap.end())
|
||||
{
|
||||
lpCastle = itr->second;
|
||||
|
||||
if (lpCastle)
|
||||
{
|
||||
lpCastle->CloseCastleGate();
|
||||
}
|
||||
|
||||
++itr;
|
||||
}
|
||||
}
|
||||
|
||||
void CCastleDBMgr::OpenCastleGate()
|
||||
{
|
||||
CCastleDB* lpCastle;
|
||||
CastleMap::iterator itr = m_CastleMap.begin();
|
||||
while (itr != m_CastleMap.end())
|
||||
{
|
||||
lpCastle = itr->second;
|
||||
if (lpCastle && !lpCastle->GetEnableSiege())
|
||||
{
|
||||
lpCastle->OpenCastleGate();
|
||||
}
|
||||
|
||||
++itr;
|
||||
}
|
||||
}
|
||||
|
||||
bool CCastleDBMgr::ReadCastleInfoDB()
|
||||
{
|
||||
const int MAX_ROWS = 10;
|
||||
int nGetRows = 0;
|
||||
|
||||
char szBuffer[CDBComponent::QUERY_BUFFER_LEN];
|
||||
_snprintf(szBuffer, CDBComponent::QUERY_BUFFER_LEN - 1,
|
||||
"SELECT "
|
||||
"TblCastleInfo.nCastleID, "
|
||||
"TblCastleInfo.tnNation, "
|
||||
"TblCastleInfo.tnZone, "
|
||||
"TblCastleInfo.tnChannel, "
|
||||
"TblCastleInfo.tnName, "
|
||||
"TblCastleInfo.tnSiegeCount, "
|
||||
"TblCastleInfo.tnInvincibleCount, "
|
||||
"TblCastleInfo.snTotalSiegeCount, "
|
||||
"TblCastleInfo.nTotalTaxMoney, "
|
||||
"TblCastleInfo.bRight, "
|
||||
"TblCastleInfo.fPosInX, "
|
||||
"TblCastleInfo.fPosInY, "
|
||||
"TblCastleInfo.fPosInZ, "
|
||||
"TblCastleInfo.fPosOutX, "
|
||||
"TblCastleInfo.fPosOutY, "
|
||||
"TblCastleInfo.fPosOutZ, "
|
||||
"TblCastleInfo.snItemID, "
|
||||
"TblCastleInfo.tnItemNum "
|
||||
"FROM TblCastleInfo");
|
||||
|
||||
szBuffer[CDBComponent::QUERY_BUFFER_LEN - 1] = 0;
|
||||
|
||||
if (0 == m_lpDBComponent || !m_lpDBComponent->ExecuteQuery(szBuffer))
|
||||
{
|
||||
ERRLOG2(g_Log, "Castle DB <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : %s %s",
|
||||
m_lpDBComponent->GetErrorString(), m_lpDBComponent->GetQueryBuffer());
|
||||
return false;
|
||||
}
|
||||
|
||||
CastleInfoDB* castleInfo = new CastleInfoDB[MAX_ROWS];
|
||||
memset(castleInfo, 0, sizeof(CastleInfoDB) * MAX_ROWS);
|
||||
|
||||
while (m_lpDBComponent->GetData((void**)castleInfo, sizeof(CastleInfoDB), MAX_ROWS, &nGetRows))
|
||||
{
|
||||
if (0 == nGetRows) { break; }
|
||||
|
||||
for (CastleInfoDB* lpCastleInfo = castleInfo; nGetRows > 0; --nGetRows, ++lpCastleInfo)
|
||||
{
|
||||
CreateCastle(*lpCastleInfo);
|
||||
}
|
||||
|
||||
memset(castleInfo, 0, sizeof(CastleInfoDB) * MAX_ROWS);
|
||||
}
|
||||
|
||||
delete [] castleInfo;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CCastleDBMgr::ReadCastleTaxInfoDB()
|
||||
{
|
||||
const int MAX_ROWS = 1000;
|
||||
int nGetRows = 0;
|
||||
|
||||
char szBuffer[CDBComponent::QUERY_BUFFER_LEN];
|
||||
_snprintf(szBuffer, CDBComponent::QUERY_BUFFER_LEN - 1,
|
||||
"SELECT "
|
||||
"TblCastleTaxInfo.nCastleID, "
|
||||
"TblCastleTaxInfo.tnType, "
|
||||
"TblCastleTaxInfo.tnTax, "
|
||||
"TblCastleTaxInfo.nTempMoney, "
|
||||
"TblCastleTaxInfo.nTaxMoney, "
|
||||
"TblCastleTaxInfo.tnTaxChangable "
|
||||
"FROM TblCastleInfo, TblCastleTaxInfo WHERE "
|
||||
"TblCastleInfo.nCastleID = TblCastleTaxInfo.nCastleID");
|
||||
|
||||
szBuffer[CDBComponent::QUERY_BUFFER_LEN - 1] = 0;
|
||||
if (0 == m_lpDBComponent || !m_lpDBComponent->ExecuteQuery(szBuffer))
|
||||
{
|
||||
ERRLOG0(g_Log, "Castle Tax DB <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>");
|
||||
return false;
|
||||
}
|
||||
|
||||
CastleTaxInfoDB* castleTaxInfo = new CastleTaxInfoDB[MAX_ROWS];
|
||||
memset(castleTaxInfo, 0, sizeof(CastleTaxInfoDB) * MAX_ROWS);
|
||||
|
||||
while (m_lpDBComponent->GetData((void**)castleTaxInfo, sizeof(CastleTaxInfoDB), MAX_ROWS, &nGetRows))
|
||||
{
|
||||
if (0 == nGetRows) { break; }
|
||||
|
||||
for (CastleTaxInfoDB* lpCastleTaxInfo = castleTaxInfo; nGetRows > 0; --nGetRows, ++lpCastleTaxInfo)
|
||||
{
|
||||
unsigned long dwCastleID = Castle::CASTLE_BIT | lpCastleTaxInfo->m_dwCastleID;
|
||||
CCastleDB* lpCastle = GetCastle(dwCastleID);
|
||||
if (NULL != lpCastle)
|
||||
{
|
||||
lpCastle->SetTaxInfo(*lpCastleTaxInfo);
|
||||
}
|
||||
}
|
||||
|
||||
memset(castleTaxInfo, 0, sizeof(CastleTaxInfoDB) * MAX_ROWS);
|
||||
}
|
||||
|
||||
delete [] castleTaxInfo;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CCastleDBMgr::ReadCastleMineralInfoDB()
|
||||
{
|
||||
const int MAX_ROWS = 10240;
|
||||
int nGetRows = 0;
|
||||
|
||||
char szBuffer[CDBComponent::QUERY_BUFFER_LEN];
|
||||
_snprintf(szBuffer, CDBComponent::QUERY_BUFFER_LEN - 1,
|
||||
"SELECT "
|
||||
"TblCastleMineralInfo.nCastleID, "
|
||||
"TblCastleMineralInfo.snMineralID, "
|
||||
"TblCastleMineralInfo.snAmount, "
|
||||
"TblCastleMineralInfo.tnFlag "
|
||||
"FROM TblCastleInfo, TblCastleMineralInfo WHERE "
|
||||
"TblCastleInfo.nCastleID = TblCastleMineralInfo.nCastleID");
|
||||
|
||||
szBuffer[CDBComponent::QUERY_BUFFER_LEN - 1] = 0;
|
||||
if (0 == m_lpDBComponent || !m_lpDBComponent->ExecuteQuery(szBuffer))
|
||||
{
|
||||
ERRLOG0(g_Log, "Castle Mineral DB <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>");
|
||||
return false;
|
||||
}
|
||||
|
||||
CastleMineralInfoDB* mineralInfo = new CastleMineralInfoDB[MAX_ROWS];
|
||||
memset(mineralInfo, 0, sizeof(CastleMineralInfoDB) * MAX_ROWS);
|
||||
|
||||
while (m_lpDBComponent->GetData((void**)mineralInfo, sizeof(CastleMineralInfoDB), MAX_ROWS, &nGetRows))
|
||||
{
|
||||
if (0 == nGetRows) { break; }
|
||||
|
||||
for (CastleMineralInfoDB* lpMineralInfo = mineralInfo; nGetRows > 0; --nGetRows, ++lpMineralInfo)
|
||||
{
|
||||
unsigned long dwCastleID = Castle::CASTLE_BIT | lpMineralInfo->m_dwCastleID;
|
||||
CCastleDB* lpCastle = GetCastle(dwCastleID);
|
||||
if (NULL != lpCastle)
|
||||
{
|
||||
lpCastle->SetMineralInfo(*lpMineralInfo);
|
||||
}
|
||||
}
|
||||
|
||||
memset(mineralInfo, 0, sizeof(CastleMineralInfoDB) * MAX_ROWS);
|
||||
}
|
||||
|
||||
delete [] mineralInfo;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
CCastleDB* CCastleDBMgr::CreateCastle(const CastleInfoDB& CastleInfo)
|
||||
{
|
||||
CCastleDB* lpCastle = 0;
|
||||
|
||||
if (0 != m_lpDBComponent)
|
||||
{
|
||||
lpCastle = CreateCastleDB(CastleInfo);
|
||||
|
||||
if (0 != lpCastle)
|
||||
{
|
||||
if ( !m_CastleMap.insert(std::make_pair(lpCastle->GetCastleID(), lpCastle)).second )
|
||||
{
|
||||
DeleteCastleDB(lpCastle);
|
||||
lpCastle = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return lpCastle;
|
||||
}
|
||||
|
||||
|
||||
|
||||
CCastleDB* CCastleDBMgr::GetCastle(unsigned long dwCastleID)
|
||||
{
|
||||
CastleMap::iterator itr = m_CastleMap.find(dwCastleID);
|
||||
if (itr != m_CastleMap.end())
|
||||
{
|
||||
return itr->second;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void CCastleDBMgr::GetCastleSiegeInfo(CastleSiegeInfo* lpCastleSiegeInfo, unsigned char& cNum, unsigned short& wSize)
|
||||
{
|
||||
if (NULL == lpCastleSiegeInfo)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for (CastleMap::iterator itr = m_CastleMap.begin(); itr != m_CastleMap.end(); ++itr)
|
||||
{
|
||||
CCastleDB* lpCastle = itr->second;
|
||||
if (NULL == lpCastle)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
lpCastleSiegeInfo->m_dwCastleID = lpCastle->m_dwCastleID;
|
||||
lpCastleSiegeInfo->m_bEnableSiege = lpCastle->m_bEnableSiege;
|
||||
++lpCastleSiegeInfo;
|
||||
|
||||
++cNum;
|
||||
wSize += sizeof(CastleSiegeInfo);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CCastleDBMgr::SendCastleInfo(CSendStream& SendStream, unsigned char cZone, unsigned char cChannel)
|
||||
{
|
||||
const unsigned short MAX_CASTLE_SEND_BUFFER =
|
||||
sizeof(PktCastleInfo) + sizeof(CastleInfoDB) + sizeof(CastleTaxInfo) * MAX_TAX_TYPE +
|
||||
sizeof(CastleMineralInfo) + sizeof(CastleMineral) * MAX_CASTLE_MINERAL_NUM +
|
||||
sizeof(CastleObjectInfo) * MAX_CASTLE_OBJECT_NUM;
|
||||
|
||||
char szBuffer[MAX_CASTLE_SEND_BUFFER];
|
||||
unsigned short usBufferSize = 0;
|
||||
unsigned char cCastleObjectNum = 0; // <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><>
|
||||
bool bFirst = true;
|
||||
|
||||
for (CastleMap::iterator itr = m_CastleMap.begin(); itr != m_CastleMap.end(); ++itr)
|
||||
{
|
||||
CCastleDB* lpCastle = itr->second;
|
||||
if (NULL == lpCastle)
|
||||
{
|
||||
ERRLOG0(g_Log, "NULL <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ԵǾ<D4B5> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (lpCastle->GetZone() != cZone || lpCastle->GetChannel() != cChannel)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (SerializeOut(lpCastle, szBuffer + sizeof(PktCastleInfo), usBufferSize, cCastleObjectNum))
|
||||
{
|
||||
PktCastleInfo* lpPktCastleInfo = reinterpret_cast<PktCastleInfo*>(szBuffer);
|
||||
|
||||
lpPktCastleInfo->m_cCastleObjectNum = cCastleObjectNum;
|
||||
lpPktCastleInfo->m_wSize = usBufferSize;
|
||||
lpPktCastleInfo->m_bStartFlag = bFirst;
|
||||
|
||||
SendStream.WrapCompress(szBuffer,
|
||||
static_cast<unsigned short>(sizeof(PktCastleInfo) + usBufferSize), CmdCastleInfo, 0, 0);
|
||||
}
|
||||
|
||||
bFirst = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool CCastleDBMgr::SerializeOut(CCastleDB* lpCastle_In, char* lpBuffer_Out, unsigned short& wBufferSize_Out, unsigned char& cDefensiveArmsNum_Out)
|
||||
{
|
||||
if (NULL == lpCastle_In || NULL == lpBuffer_Out) return false;
|
||||
|
||||
wBufferSize_Out = 0;
|
||||
cDefensiveArmsNum_Out = 0;
|
||||
|
||||
// <20><> <20><><EFBFBD><EFBFBD>
|
||||
CastleInfoDB* lpCastleInfoDB = reinterpret_cast<CastleInfoDB*>(lpBuffer_Out);
|
||||
|
||||
lpCastleInfoDB->m_dwCastleID = lpCastle_In->m_dwCastleID;
|
||||
lpCastleInfoDB->m_cNation = lpCastle_In->m_cNation;
|
||||
lpCastleInfoDB->m_cZone = lpCastle_In->m_cZone;
|
||||
lpCastleInfoDB->m_cChannel = lpCastle_In->m_cChannel;
|
||||
lpCastleInfoDB->m_cNameID = lpCastle_In->m_cNameID;
|
||||
lpCastleInfoDB->m_cSiegeCount = lpCastle_In->m_cSiegeCount;
|
||||
lpCastleInfoDB->m_cInvincibleCount = lpCastle_In->m_cInvincibleCount;
|
||||
lpCastleInfoDB->m_wTotalSiegeCount = lpCastle_In->m_wTotalSiegeCount;
|
||||
lpCastleInfoDB->m_dwTotalTaxMoney = lpCastle_In->m_dwTotalTaxMoney;
|
||||
lpCastleInfoDB->m_InPos.fPointX = lpCastle_In->m_BackDoorPos[0].m_fPointX;
|
||||
lpCastleInfoDB->m_InPos.fPointY = lpCastle_In->m_BackDoorPos[0].m_fPointY;
|
||||
lpCastleInfoDB->m_InPos.fPointZ = lpCastle_In->m_BackDoorPos[0].m_fPointZ;
|
||||
lpCastleInfoDB->m_OutPos.fPointX = lpCastle_In->m_BackDoorPos[1].m_fPointX;
|
||||
lpCastleInfoDB->m_OutPos.fPointY = lpCastle_In->m_BackDoorPos[1].m_fPointY;
|
||||
lpCastleInfoDB->m_OutPos.fPointZ = lpCastle_In->m_BackDoorPos[1].m_fPointZ;
|
||||
lpCastleInfoDB->m_wItemID = lpCastle_In->m_wItemID;
|
||||
lpCastleInfoDB->m_cItemNum = lpCastle_In->m_cItemNum;
|
||||
::memcpy(&lpCastleInfoDB->m_szRight, &lpCastle_In->m_CastleRight, sizeof(CastleRight));
|
||||
|
||||
wBufferSize_Out += sizeof(CastleInfoDB);
|
||||
|
||||
// <20><> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
CastleTaxInfo* lpCastleTaxInfo = reinterpret_cast<CastleTaxInfo*>( lpCastleInfoDB + 1 );
|
||||
for (int i=0; i<MAX_TAX_TYPE; ++i)
|
||||
{
|
||||
*lpCastleTaxInfo = lpCastle_In->m_CastleTax[ i ];
|
||||
++lpCastleTaxInfo;
|
||||
}
|
||||
|
||||
wBufferSize_Out += sizeof(CastleTaxInfo) * MAX_TAX_TYPE;
|
||||
|
||||
// <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
CastleMineralInfo* lpCastleMineralInfo = reinterpret_cast<CastleMineralInfo*>( lpCastleTaxInfo );
|
||||
CastleMineral* lpCastleMineral = reinterpret_cast<CastleMineral*>( lpCastleMineralInfo + 1 );
|
||||
|
||||
lpCastleMineralInfo->m_cAccumulatedNum = static_cast<unsigned char>( lpCastle_In->m_AccumulatedMineralMap.size() );
|
||||
lpCastleMineralInfo->m_cTemporaryNum = static_cast<unsigned char>( lpCastle_In->m_TemporaryMineralMap.size() );
|
||||
unsigned short wSize = sizeof(CastleMineralInfo);
|
||||
|
||||
CCastleDB::MineralInfoMap::iterator MineralItr = lpCastle_In->m_AccumulatedMineralMap.begin();
|
||||
CCastleDB::MineralInfoMap::iterator MineralEnd = lpCastle_In->m_AccumulatedMineralMap.end();
|
||||
while (MineralItr != MineralEnd)
|
||||
{
|
||||
lpCastleMineral->m_wMineralID = MineralItr->first;
|
||||
lpCastleMineral->m_wAmount = MineralItr->second;
|
||||
|
||||
wSize += sizeof(CastleMineral);
|
||||
++lpCastleMineral;
|
||||
++MineralItr;
|
||||
}
|
||||
|
||||
MineralItr = lpCastle_In->m_TemporaryMineralMap.begin();
|
||||
MineralEnd = lpCastle_In->m_TemporaryMineralMap.end();
|
||||
while (MineralItr != MineralEnd)
|
||||
{
|
||||
lpCastleMineral->m_wMineralID = MineralItr->first;
|
||||
lpCastleMineral->m_wAmount = MineralItr->second;
|
||||
|
||||
wSize += sizeof(CastleMineral);
|
||||
++lpCastleMineral;
|
||||
++MineralItr;
|
||||
}
|
||||
|
||||
lpCastleMineralInfo->m_wSize = wSize;
|
||||
wBufferSize_Out += wSize;
|
||||
|
||||
// <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
|
||||
unsigned short wBufferSize;
|
||||
CastleObjectInfo* lpCastleObjectInfo = reinterpret_cast<CastleObjectInfo*>( lpCastleMineral );
|
||||
CCastleDB::CastleObjectMap::iterator ObjectItr = lpCastle_In->m_CastleObjectMap.begin();
|
||||
CCastleDB::CastleObjectMap::iterator ObjectEnd = lpCastle_In->m_CastleObjectMap.end();
|
||||
|
||||
while (ObjectItr != ObjectEnd)
|
||||
{
|
||||
CSiegeObjectDB* lpCastleObject = ObjectItr->second;
|
||||
if (lpCastleObject)
|
||||
{
|
||||
if (true == CSiegeObjectDBMgr::GetInstance().SerializeOutCastleObject(lpCastleObject,
|
||||
reinterpret_cast<char*>(lpCastleObjectInfo), wBufferSize))
|
||||
{
|
||||
++lpCastleObjectInfo;
|
||||
++cDefensiveArmsNum_Out;
|
||||
wBufferSize_Out += wBufferSize;
|
||||
}
|
||||
}
|
||||
|
||||
++ObjectItr;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
#ifndef _RYL_DBAGENT_CASTLE_DB_MANAGER_H_
|
||||
#define _RYL_DBAGENT_CASTLE_DB_MANAGER_H_
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <map>
|
||||
#include <Network/Packet/PacketStruct/CastlePacket.h>
|
||||
#include <Creature/CreatureStructure.h>
|
||||
|
||||
#include <boost/pool/pool.hpp>
|
||||
#include <boost/pool/pool_alloc.hpp>
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
class CDBComponent;
|
||||
class CSendStream;
|
||||
class CSiegeObjectDB;
|
||||
class CSiegeObjectDBMgr;
|
||||
|
||||
namespace Castle
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
class CCastleDB;
|
||||
|
||||
class CCastleDBMgr
|
||||
{
|
||||
public:
|
||||
|
||||
static CCastleDBMgr& GetInstance();
|
||||
|
||||
// <CastleID, lpCastle>
|
||||
typedef std::map<unsigned long, CCastleDB*, std::less<unsigned long>,
|
||||
boost::fast_pool_allocator<std::pair<unsigned long, CCastleDB*> > > CastleMap;
|
||||
|
||||
bool Initialize(CDBComponent& DBComponent);
|
||||
void Destroy();
|
||||
|
||||
void CheckEnableSiegeForAllCastle(bool bIsSiegeTime);
|
||||
void UpdateSiegeCount();
|
||||
void DestroyAllCastleArms();
|
||||
|
||||
void CloseCastleGate();
|
||||
void OpenCastleGate();
|
||||
|
||||
CCastleDB* GetCastle(unsigned long dwCastleID);
|
||||
void GetCastleSiegeInfo(CastleSiegeInfo* lpCastleSiegeInfo, unsigned char& cNum, unsigned short& wSize);
|
||||
|
||||
// GameServer <20><><EFBFBD><EFBFBD> Send <20>Լ<EFBFBD>
|
||||
void SendCastleInfo(CSendStream& SendStream, unsigned char cZone, unsigned char cChannel);
|
||||
|
||||
private:
|
||||
|
||||
CCastleDBMgr();
|
||||
~CCastleDBMgr();
|
||||
|
||||
bool ReadCastleInfoDB();
|
||||
bool ReadCastleTaxInfoDB();
|
||||
bool ReadCastleMineralInfoDB();
|
||||
|
||||
CCastleDB* CreateCastle(const CastleInfoDB& CastleInfo); // DB <20><><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE>ͼ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
bool SerializeOut(CCastleDB* lpCastle_In, char* lpBuffer_Out,
|
||||
unsigned short& wBufferSize_Out, unsigned char& cDefensiveArmsNum_Out);
|
||||
|
||||
CCastleDB* CreateCastleDB(const CastleInfoDB& CastleInfo);
|
||||
void DeleteCastleDB(CCastleDB* lpCastleDB);
|
||||
|
||||
CDBComponent* m_lpDBComponent;
|
||||
|
||||
boost::pool<> m_CastlePool;
|
||||
CastleMap m_CastleMap;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
#endif // _CASTLE_MANAGER_H_
|
||||
1431
Server/RylServerProject/RylDBAgentServer/Community/Guild/GuildDB.cpp
Normal file
1431
Server/RylServerProject/RylDBAgentServer/Community/Guild/GuildDB.cpp
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,71 @@
|
||||
|
||||
#ifndef _RYL_DBAGENT_GUILDDB_H_
|
||||
#define _RYL_DBAGENT_GUILDDB_H_
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <Network/Packet/PacketStruct/GuildPacket.h>
|
||||
#include <Community/Guild/Guild.h>
|
||||
|
||||
|
||||
// forward decl.
|
||||
class CDBComponent;
|
||||
class CSendStream;
|
||||
|
||||
namespace Guild
|
||||
{
|
||||
class CGuildDB : public CGuild
|
||||
{
|
||||
private:
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ŵ<EFBFBD><C5B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ƿ<EFBFBD><C6BF> <20>̿<EFBFBD><CCBF>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> public)
|
||||
CGuildDB(CDBComponent& DBComponent);
|
||||
CGuildDB(CDBComponent& DBComponent, unsigned long dwGID, unsigned char cNation, char* szName);
|
||||
CGuildDB(CDBComponent& DBComponent, GuildInfoDB& guildInfo);
|
||||
|
||||
friend class CGuildDBMgr;
|
||||
|
||||
CDBComponent& m_DBComponent;
|
||||
|
||||
public:
|
||||
|
||||
~CGuildDB(void);
|
||||
|
||||
bool SetMark(char* szMark);
|
||||
bool SetLevel(unsigned char cLevel);
|
||||
// bool SetInclination(unsigned char cInclination);
|
||||
bool SetRight(GuildRight guildRight);
|
||||
bool SetTitle(unsigned long dwCID, unsigned char cTitle);
|
||||
bool SetRelation(unsigned long dwTargetGID, unsigned char cRelationType, unsigned char cActorType=Guild::BY_MINE, unsigned char cInsert = 1);
|
||||
void DeleteRelation();
|
||||
void CancelAlertAndCounterHostility();
|
||||
void CancelAlertHostility(unsigned long dwTargetGID);
|
||||
|
||||
unsigned long ReleaseGold(unsigned long dwGold);
|
||||
unsigned long SetNewMaster(void);
|
||||
|
||||
int GetLoginedTotalMemberNum() const;
|
||||
int GetLoginedCurrentMemberNum() const;
|
||||
|
||||
void AddAllMemberFame(unsigned char cType, int nFame, Guild::CGuildDB* lpEnemyGuild = 0); // <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ġ <20><>ȭ ( <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>밡<EFBFBD><EBB0A1> )
|
||||
void AddLoginedMemberFame(unsigned char cType, int nFame, Guild::CGuildDB* lpEnemyGuild = 0); // <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ġ <20><>ȭ ( <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>밡<EFBFBD><EBB0A1> )
|
||||
void AddMemberFame(unsigned char cType, unsigned long dwCID, int nFame); // <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ġ <20><>ȭ ( <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>밡<EFBFBD><EBB0A1> )
|
||||
void AddGoldToMaster(unsigned long dwGold); // <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20>αƿ<D7BE><C6BF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
|
||||
|
||||
bool JoinMember(MemberInfo& memberInfo);
|
||||
bool LeaveMember(unsigned long dwCID);
|
||||
bool UpdateMemberInfo(unsigned long dwCID, MemberListInfo memberListInfo, MemberDetailInfo memberDetailInfo);
|
||||
void KickAllWaitMember() ;
|
||||
|
||||
void SendLoginOutMember(unsigned long dwCID, unsigned long dwServerID);
|
||||
void SendJoinMember(CSendStream* lpSendStream, unsigned long dwCID, unsigned char cTitle);
|
||||
|
||||
unsigned char GetTacticsMember(unsigned long dwCID);
|
||||
|
||||
void SetTacticsMember(unsigned long dwCID, unsigned char cTactics);
|
||||
|
||||
void SendJoinTacticsMember(CSendStream* lpSendStream, unsigned long dwCID, unsigned char cTitle, unsigned char CType);
|
||||
};
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,710 @@
|
||||
#include "stdafx.h"
|
||||
|
||||
#include <vector>
|
||||
#include <atltime.h>
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
|
||||
#include <Network/Packet/WrapPacket.h>
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
#include <Network/Packet/PacketStruct/GuildPacket.h>
|
||||
#include <Network/SendPacket/SendGuild.h>
|
||||
#include <Network/Dispatch/GameDispatch.h>
|
||||
|
||||
#include <DB/DBComponent.h>
|
||||
#include <DB/GuildDBComponent.h>
|
||||
|
||||
#include <DataStorage/SessionData.h>
|
||||
#include <DataStorage/SessionDataMgr.h>
|
||||
#include <DataStorage/CharacterData.h>
|
||||
#include <DataStorage/CharacterDataMgr.h>
|
||||
|
||||
#include <Creature/Siege/SiegeObjectDB.h>
|
||||
#include <Creature/Siege/SiegeObjectDBMgr.h>
|
||||
|
||||
#include <Castle/CastleDBMgr.h>
|
||||
#include <Community/Guild/GuildUtil.h>
|
||||
|
||||
#include "GuildDB.h"
|
||||
#include "GuildDBMgr.h"
|
||||
|
||||
#include <DB/DBComponent.h>
|
||||
#include <DB/GameDBComponent.h>
|
||||
|
||||
#include <GameTime/GameTimeConstants.h>
|
||||
|
||||
using namespace Guild;
|
||||
|
||||
CGuildDBMgr& CGuildDBMgr::GetInstance()
|
||||
{
|
||||
static CGuildDBMgr guildDBMgr;
|
||||
return guildDBMgr;
|
||||
}
|
||||
|
||||
CGuildDBMgr::CGuildDBMgr(void)
|
||||
: CGuildMgr(), m_lpDBComponent(0)
|
||||
{
|
||||
}
|
||||
|
||||
CGuildDBMgr::~CGuildDBMgr(void)
|
||||
{
|
||||
}
|
||||
|
||||
bool CGuildDBMgr::Initialize(CDBComponent& DBComponent)
|
||||
{
|
||||
m_lpDBComponent = &DBComponent;
|
||||
|
||||
if (false == ReadGuildInfoDB()) { return false; }
|
||||
if (false == ReadGuildMemberDB()) { return false; }
|
||||
if (false == ReadGuildRelationDB()) { return false; }
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
CGuildDB* CGuildDBMgr::CreateGuild(unsigned long dwMasterID, unsigned char cNation, char* szGuildName, unsigned short* wError)
|
||||
{
|
||||
unsigned long dwGID = 0;
|
||||
|
||||
GuildRight guildRight;
|
||||
if (0 == m_lpDBComponent || !DBComponent::GuildDB::InsertGuildInfo(*m_lpDBComponent, szGuildName, cNation,
|
||||
reinterpret_cast<char *>(&guildRight), sizeof(GuildRight), &dwGID, wError))
|
||||
{
|
||||
ERRLOG1(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD> : CID:%10u DB<44><42><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.", dwMasterID);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (0 == dwGID)
|
||||
{
|
||||
ERRLOG0(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
CGuildDB* lpGuild = new CGuildDB(*m_lpDBComponent, dwGID, cNation, szGuildName);
|
||||
|
||||
if (!m_GuildMap.insert(GuildMap::value_type(dwGID, lpGuild)).second)
|
||||
{
|
||||
delete lpGuild;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return lpGuild;
|
||||
}
|
||||
|
||||
GuildMap::iterator CGuildDBMgr::DissolveGuild(unsigned long dwGID, unsigned short usDissolveReason)
|
||||
{
|
||||
GuildMap::iterator it = m_GuildMap.find(dwGID);
|
||||
if (it == m_GuildMap.end())
|
||||
{
|
||||
ERRLOG1(g_Log, "GID:%10u / <20><><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʴ<EFBFBD> <20><><EFBFBD>带 <20><>ü<EFBFBD>Ϸ<EFBFBD><CFB7>մϴ<D5B4>.", dwGID);
|
||||
return it;
|
||||
}
|
||||
|
||||
CGuildDB* lpGuild = static_cast<CGuildDB*>(it->second);
|
||||
for (MemberList::iterator MemberIt = lpGuild->m_MemberList.begin(); MemberIt != lpGuild->m_MemberList.end(); ++MemberIt)
|
||||
{
|
||||
MemberInfo memberInfo = *MemberIt;
|
||||
|
||||
using namespace DBAgent::DataStorage;
|
||||
|
||||
CSessionData* lpSessionData =
|
||||
CSessionDataMgr::GetInstance().GetCharLoadedSession(memberInfo.m_dwCID);
|
||||
|
||||
CCharacterData* lpCharacterData = 0;
|
||||
|
||||
if (0 == lpSessionData || 0 == (lpCharacterData = lpSessionData->GetCharacterData()))
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ų<EFBFBD>, <20><><EFBFBD>ǿ<EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20>αƿ<D7BE> <20>¿<EFBFBD><C2BF><EFBFBD> ã<>ƺ<EFBFBD><C6BA><EFBFBD>.
|
||||
lpCharacterData =
|
||||
static_cast<CCharacterData*>(CCharacterDataMgr::GetInstance().GetLogoutData(memberInfo.m_dwCID));
|
||||
}
|
||||
|
||||
if (0 != lpCharacterData)
|
||||
{
|
||||
lpCharacterData->SetGID(0);
|
||||
}
|
||||
|
||||
// WORK_LIST 2.3 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD> <20>ı<EFBFBD><C4B1><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ż<><C5BB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
// lpGuild->AddMemberFame(Guild::TYPE_HALF, memberInfo.m_dwCID, 0);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>谡 <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
lpGuild->DeleteRelation();
|
||||
|
||||
PktCreateGuild pktCreateGuild;
|
||||
memset(&pktCreateGuild, 0, sizeof(PktCreateGuild));
|
||||
|
||||
pktCreateGuild.m_dwCID = 0;
|
||||
pktCreateGuild.m_dwGID = lpGuild->m_dwGID;
|
||||
pktCreateGuild.m_cInclination = lpGuild->m_cInclination;
|
||||
|
||||
strncpy(pktCreateGuild.m_szGuildName, lpGuild->GetName(), Guild::MAX_GUILD_NAME_LEN);
|
||||
|
||||
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktCreateGuild), sizeof(PktCreateGuild),
|
||||
CmdCreateGuild, usDissolveReason, PktCreateGuild::FAIL_DISSOLVE_GUILD))
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktCreateGuild), sizeof(PktCreateGuild), CmdCreateGuild));
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
DBComponent::GuildDB::DeleteGuildInfo(*m_lpDBComponent, lpGuild->GetGID());
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
DBComponent::GuildDB::DeleteGuildRelation(*m_lpDBComponent, lpGuild->GetGID());
|
||||
|
||||
delete it->second;
|
||||
it = m_GuildMap.erase(it);
|
||||
|
||||
// <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ı<EFBFBD><C4B1>մϴ<D5B4>.
|
||||
CSiegeObjectDBMgr::GetInstance().DestroyCamp(dwGID);
|
||||
|
||||
return it;
|
||||
}
|
||||
|
||||
|
||||
bool CGuildDBMgr::SetRelation(unsigned long dwGID, unsigned long dwTargetGID, unsigned char cRelationType)
|
||||
{
|
||||
CGuildDB* lpGuild = static_cast<CGuildDB*>(GetGuild(dwGID));
|
||||
CGuildDB* lpTargetGuild = static_cast<CGuildDB*>(GetGuild(dwTargetGID));
|
||||
|
||||
if (!lpGuild || !lpTargetGuild) { return false ; }
|
||||
|
||||
if(Guild::TARGET_NEUTRALITY == cRelationType)
|
||||
{
|
||||
if (!lpGuild->SetRelation(dwTargetGID, cRelationType, Guild::BY_TARGET))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ߴµ<DFB4> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>¸<EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>¸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><>Ų<EFBFBD><C5B2>.
|
||||
unsigned char tnRelation = lpTargetGuild->GetRelation(dwGID, Guild::BY_TARGET);
|
||||
|
||||
if( (Guild::HOSTILITY == cRelationType ||
|
||||
Guild::COUNTER_HOSTILITY == cRelationType ||
|
||||
Guild::ALERT_HOSTILITY == cRelationType) &&
|
||||
Guild::NEUTRALITY != tnRelation)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>¸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ѵ<EFBFBD>.
|
||||
if (!lpGuild->SetRelation(dwTargetGID, cRelationType, Guild::BY_MINE, 0))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̰<EFBFBD> <20>´<EFBFBD>.
|
||||
if (!lpTargetGuild->SetRelation(dwGID, cRelationType, Guild::BY_TARGET))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!lpGuild->SetRelation(dwTargetGID, cRelationType, Guild::BY_MINE))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!lpTargetGuild->SetRelation(dwGID, cRelationType, Guild::BY_TARGET))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CGuildDBMgr::CancelAlertAndCounterHostility()
|
||||
{
|
||||
for (GuildMap::iterator GuildIt = m_GuildMap.begin(); GuildIt != m_GuildMap.end(); ++GuildIt)
|
||||
{
|
||||
CGuildDB* lpGuild = static_cast<CGuildDB*>(GuildIt->second);
|
||||
|
||||
if (lpGuild->GetNumOfRelation(Guild::ALERT_HOSTILITY) > 0 ||
|
||||
lpGuild->GetNumOfRelation(Guild::COUNTER_HOSTILITY) > 0)
|
||||
{
|
||||
lpGuild->CancelAlertAndCounterHostility();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CGuildDBMgr::CancelAlertHostility(unsigned long dwTargetGID)
|
||||
{
|
||||
for (GuildMap::iterator GuildIt = m_GuildMap.begin(); GuildIt != m_GuildMap.end(); ++GuildIt)
|
||||
{
|
||||
CGuildDB* lpGuild = static_cast<CGuildDB*>(GuildIt->second);
|
||||
|
||||
if (lpGuild->GetRelationGID(Guild::ALERT_HOSTILITY) == dwTargetGID)
|
||||
{
|
||||
lpGuild->CancelAlertHostility(dwTargetGID);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CGuildDBMgr::ProcessGuild(void)
|
||||
{
|
||||
SYSTEMTIME sysTime;
|
||||
GetLocalTime(&sysTime);
|
||||
|
||||
CTime NowTime(sysTime.wYear, sysTime.wMonth, sysTime.wDay, sysTime.wHour, sysTime.wMinute, sysTime.wSecond);
|
||||
CTimeSpan timeSpan(0);
|
||||
|
||||
for (GuildMap::iterator GuildIt = m_GuildMap.begin(); GuildIt != m_GuildMap.end(); )
|
||||
{
|
||||
CGuildDB* lpGuild = static_cast<CGuildDB*>(GuildIt->second);
|
||||
|
||||
/*
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ü
|
||||
if (0 != lpGuild->m_tmLastLogout.Year)
|
||||
{
|
||||
CTime GuildTime(lpGuild->m_tmLastLogout.Year, lpGuild->m_tmLastLogout.Month, lpGuild->m_tmLastLogout.Day,
|
||||
lpGuild->m_tmLastLogout.Hour, lpGuild->m_tmLastLogout.Minute, lpGuild->m_tmLastLogout.Second);
|
||||
timeSpan = NowTime - GuildTime;
|
||||
if (timeSpan.GetTotalMinutes() > DELETE_GUILD_LOGOUT_TIME)
|
||||
{
|
||||
DETLOG1(g_Log, "GID:%10u / <20><><EFBFBD>尡 <20><>ü<EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>. - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƹ<EFBFBD><C6B9><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
lpGuild->GetGID());
|
||||
GuildIt = DissolveGuild(lpGuild->GetGID(), PktCreateGuild::NONE_LOGIN);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ּ<EFBFBD> <20>ο<EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><>ü
|
||||
if (0 != lpGuild->m_tmCheckMember.Year && DELETE_GUILD_MEMBER_NUM > lpGuild->GetCurrentMemberNum())
|
||||
{
|
||||
CTime GuildTime(lpGuild->m_tmCheckMember.Year, lpGuild->m_tmCheckMember.Month, lpGuild->m_tmCheckMember.Day,
|
||||
lpGuild->m_tmCheckMember.Hour, lpGuild->m_tmCheckMember.Minute, lpGuild->m_tmCheckMember.Second);
|
||||
timeSpan = NowTime - GuildTime;
|
||||
if (timeSpan.GetTotalMinutes() > MEMBER_NUM_DELETE_TIME)
|
||||
{
|
||||
DETLOG1(g_Log, "GID:%10u / <20><><EFBFBD>尡 <20><>ü<EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>. - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ּ<EFBFBD> <20>ο<EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> ä <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
lpGuild->GetGID());
|
||||
GuildIt = DissolveGuild(lpGuild->GetGID(), PktCreateGuild::MIN_MEMBER_TIMEOUT);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>絵
|
||||
MemberInfo memberInfo = lpGuild->GetMaster();
|
||||
if (0 != lpGuild->m_tmGMLastLogout.Year && 0 == memberInfo.m_dwServerID)
|
||||
{
|
||||
CTime GuildTime(lpGuild->m_tmGMLastLogout.Year, lpGuild->m_tmGMLastLogout.Month, lpGuild->m_tmGMLastLogout.Day,
|
||||
lpGuild->m_tmGMLastLogout.Hour, lpGuild->m_tmGMLastLogout.Minute, lpGuild->m_tmGMLastLogout.Second);
|
||||
timeSpan = NowTime - GuildTime;
|
||||
if (timeSpan.GetTotalMinutes() > TRANFER_MASTER_TIME)
|
||||
{
|
||||
// <20><><EFBFBD>尡 <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD>츦 <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
GuildMap::iterator TempGuildIt = GuildIt;
|
||||
++TempGuildIt;
|
||||
|
||||
unsigned long dwNewMaster = lpGuild->SetNewMaster();
|
||||
if (0 == dwNewMaster)
|
||||
{
|
||||
DETLOG1(g_Log, "GID:%10u / <20><><EFBFBD>尡 <20><>ü<EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>. - <20><><EFBFBD><EFBFBD> <20>Ⱓ<EFBFBD><E2B0A3><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>帶<EFBFBD><E5B8B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>絵", lpGuild->GetGID());
|
||||
CGuildDBMgr::GetInstance().DissolveGuild(lpGuild->GetGID(), PktCreateGuild::NONE_NEXT_GUILDMASTER_BY_NONE_LOGIN);
|
||||
GuildIt = TempGuildIt;
|
||||
continue;
|
||||
}
|
||||
|
||||
DBAgent::SendPacket::GuildCmd(NULL, lpGuild->GetGID(), dwNewMaster, MASTER,
|
||||
PktGuildCmd::GC_SETUP_TITLE, PktBase::NO_SERVER_ERR);
|
||||
|
||||
lpGuild->SetTitle(memberInfo.m_dwCID, COMMON);
|
||||
|
||||
DBAgent::SendPacket::GuildCmd(NULL, lpGuild->GetGID(), memberInfo.m_dwCID, COMMON,
|
||||
PktGuildCmd::GC_SETUP_TITLE, PktBase::NO_SERVER_ERR);
|
||||
|
||||
DETLOG3(g_Log, "GID:%10u / <20><><EFBFBD>帶<EFBFBD><E5B8B6><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>CID:%10u, <20><><EFBFBD><EFBFBD>CID:%10u)<29><> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>. "
|
||||
"- <20><><EFBFBD><EFBFBD> <20>Ⱓ<EFBFBD><E2B0A3><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>帶<EFBFBD><E5B8B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>絵",
|
||||
lpGuild->GetGID(), memberInfo.m_dwCID, dwNewMaster);
|
||||
}
|
||||
}
|
||||
*/
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD> üũ.
|
||||
if(lpGuild->GetGuildPointFlag())
|
||||
{
|
||||
// <20>ð<EFBFBD> <20>˻<EFBFBD> //
|
||||
TIME* pTime = lpGuild->GetGuildPointTime();
|
||||
|
||||
if(pTime)
|
||||
{
|
||||
CTime nowTime = CTime::GetCurrentTime();
|
||||
CTimeSpan timeSpan(0);
|
||||
|
||||
CTime GuildPointTime(pTime->Year, pTime->Month, pTime->Day, pTime->Hour, pTime->Minute, pTime->Second);
|
||||
|
||||
timeSpan = nowTime - GuildPointTime;
|
||||
|
||||
if(timeSpan.GetTotalMinutes() >= Guild::TIME_GUILD_POINT)
|
||||
{
|
||||
// <20><EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD> //
|
||||
lpGuild->SetGuildPointFlag(0);
|
||||
|
||||
PktCampMessage pktCampMessage;
|
||||
memset(&pktCampMessage, 0, sizeof(PktCampMessage));
|
||||
pktCampMessage.m_cMsgCmd = PktCampMessage::MSGCMD_GUILD_TIME_COMPLETE;
|
||||
pktCampMessage.m_bNotify = false;
|
||||
pktCampMessage.m_dwGID = lpGuild->GetGID();
|
||||
|
||||
if (PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage, 0, 0))
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Ż<><C5BB> <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD> <20><><EFBFBD><EFBFBD> Ż<><C5BB>
|
||||
std::list<unsigned long> deleteList;
|
||||
|
||||
for (MemberList::iterator MemberIt = lpGuild->m_MemberList.begin(); MemberIt != lpGuild->m_MemberList.end(); ++MemberIt)
|
||||
{
|
||||
MemberInfo memberInfo = *MemberIt;
|
||||
|
||||
if (Guild::LEAVE_WAIT != memberInfo.m_MemberListInfo.m_cTitle)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (0 != memberInfo.m_LeaveGuildTime.Year)
|
||||
{
|
||||
CTime GuildTime(memberInfo.m_LeaveGuildTime.Year, memberInfo.m_LeaveGuildTime.Month, memberInfo.m_LeaveGuildTime.Day,
|
||||
memberInfo.m_LeaveGuildTime.Hour, memberInfo.m_LeaveGuildTime.Minute, memberInfo.m_LeaveGuildTime.Second);
|
||||
timeSpan = NowTime - GuildTime;
|
||||
|
||||
unsigned long dwLeaveWaitTime = LEAVE_WAIT_TIME;
|
||||
|
||||
if (timeSpan.GetTotalMinutes() > dwLeaveWaitTime)
|
||||
{
|
||||
deleteList.push_back(memberInfo.m_dwCID);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (std::list<unsigned long>::iterator DeleteIt = deleteList.begin(); DeleteIt != deleteList.end(); ++DeleteIt)
|
||||
{
|
||||
using namespace DBAgent::DataStorage;
|
||||
|
||||
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(*DeleteIt);
|
||||
|
||||
if(lpSessionData)
|
||||
{
|
||||
CCharacterData* lpCharacterData = lpSessionData->GetCharacterData();
|
||||
|
||||
if(lpCharacterData)
|
||||
{
|
||||
unsigned short wError = PktBase::NO_SERVER_ERR;
|
||||
|
||||
lpCharacterData->SetGuildWarFlag(Creature::WAR_OFF);
|
||||
|
||||
PktWarOnOff pktWarOnOff;
|
||||
memset(&pktWarOnOff, 0, sizeof(PktWarOnOff));
|
||||
|
||||
pktWarOnOff.m_dwCID = *DeleteIt;
|
||||
pktWarOnOff.m_cType = GameTime::GUILD;
|
||||
pktWarOnOff.m_cFlag = Creature::WAR_OFF;
|
||||
|
||||
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktWarOnOff), sizeof(PktWarOnOff), CmdWarOnOff, 0, wError))
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktWarOnOff), sizeof(PktWarOnOff), CmdWarOnOff));
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DBComponent::GameDB::UpdateGuildWarFlag(CDBSingleObject::GetInstance(), *DeleteIt, Creature::WAR_OFF);
|
||||
}
|
||||
|
||||
lpGuild->LeaveMember(*DeleteIt);
|
||||
|
||||
DBAgent::SendPacket::GuildCmd(NULL, lpGuild->GetGID(),
|
||||
*DeleteIt, 0, PktGuildCmd::GC_KICK, NULL, NULL, PktBase::NO_SERVER_ERR);
|
||||
}
|
||||
|
||||
deleteList.clear();
|
||||
|
||||
++GuildIt;
|
||||
}
|
||||
}
|
||||
|
||||
bool CGuildDBMgr::ReadGuildInfoDB(void)
|
||||
{
|
||||
const int MAX_ROWS = 10240;
|
||||
int nGetRows = 0;
|
||||
|
||||
char szBuffer[CDBComponent::QUERY_BUFFER_LEN];
|
||||
_snprintf(szBuffer, CDBComponent::QUERY_BUFFER_LEN - 1,
|
||||
"SELECT nGuildID, strGuildName, tnGuildLevel, nGuildFame, nGuildGold, "
|
||||
"tLastLogout, tCheckMember, tGMLastLogout, bGuildMark, bRight, tnNationType, tChangeState "
|
||||
"FROM TblGuildInfo WHERE OldServerGroupID = %d", CServerSetup::GetInstance().GetAgentServerType());
|
||||
|
||||
szBuffer[CDBComponent::QUERY_BUFFER_LEN - 1] = 0;
|
||||
|
||||
if (0 == m_lpDBComponent ||
|
||||
!m_lpDBComponent->ExecuteQuery(szBuffer))
|
||||
{
|
||||
ERRLOG0(g_Log, "ReadGuildInfoDB <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> DB <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>");
|
||||
return false;
|
||||
}
|
||||
|
||||
GuildInfoDB* guildInfo = new GuildInfoDB[MAX_ROWS];
|
||||
memset(guildInfo, 0, sizeof(GuildInfoDB) * MAX_ROWS);
|
||||
|
||||
int nTotalGuildNum = 0;
|
||||
|
||||
while (m_lpDBComponent->GetData((void**)guildInfo, sizeof(GuildInfoDB), MAX_ROWS, &nGetRows))
|
||||
{
|
||||
if (0 == nGetRows) { break; }
|
||||
|
||||
nTotalGuildNum += nGetRows;
|
||||
|
||||
for (GuildInfoDB* lpGuildInfo = guildInfo; nGetRows > 0; --nGetRows, ++lpGuildInfo)
|
||||
{
|
||||
CGuildDB* lpGuild = new CGuildDB(*m_lpDBComponent, *lpGuildInfo);
|
||||
if (false == m_GuildMap.insert(GuildMap::value_type(lpGuild->GetGID(), lpGuild)).second)
|
||||
{
|
||||
delete lpGuild;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
memset(guildInfo, 0, sizeof(GuildInfoDB) * MAX_ROWS);
|
||||
}
|
||||
|
||||
INFLOG1(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> : %d <20><><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE>Խ<EFBFBD><D4BD>ϴ<EFBFBD>", nTotalGuildNum);
|
||||
|
||||
delete [] guildInfo;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CGuildDBMgr::ReadGuildMemberDB(void)
|
||||
{
|
||||
char szBuffer[CDBComponent::QUERY_BUFFER_LEN];
|
||||
_snprintf(szBuffer, CDBComponent::QUERY_BUFFER_LEN - 1,
|
||||
"SELECT TblGuildMember.nGuildID, TblGuildMember.nCID, "
|
||||
"TblGuildMember.nPositionInGuild, CharInfo.Name, "
|
||||
"TblGuildMember.nPosition, CharInfo.Level, CharInfo.Class, "
|
||||
"CharInfo.Fame, CharInfo.Gold, CharInfoEx.GuildWarFlag, TblGuildMember.tLeaveGuildTime, TblGuildMember.Tactics "
|
||||
"FROM TblGuildInfo, TblGuildMember, CharInfo, CharInfoEx WHERE "
|
||||
"TblGuildInfo.nGuildID = TblGuildMember.nGuildID AND "
|
||||
"TblGuildMember.nCID = CharInfo.CID AND "
|
||||
"TblGuildMember.nCID = CharInfoEx.CID AND "
|
||||
"TblGuildInfo.OldServerGroupID = %d", CServerSetup::GetInstance().GetAgentServerType());
|
||||
|
||||
szBuffer[CDBComponent::QUERY_BUFFER_LEN - 1] = 0;
|
||||
|
||||
if (0 == m_lpDBComponent || !m_lpDBComponent->ExecuteQuery(szBuffer))
|
||||
{
|
||||
ERRLOG0(g_Log, "ReadGuildMemberDB <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> DB <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>");
|
||||
return false;
|
||||
}
|
||||
|
||||
typedef std::pair<GuildMemberDB*, int> GuildMemberDBRows;
|
||||
typedef std::vector<GuildMemberDBRows> VecGuildMemberDB;
|
||||
|
||||
VecGuildMemberDB vecGuildMemberDB;
|
||||
|
||||
const int MAX_ROWS = 4096;
|
||||
int nGetRows = 0;
|
||||
int nTotalGuildMemberNum = 0;
|
||||
|
||||
GuildMemberDB* guildMember = new GuildMemberDB[MAX_ROWS];
|
||||
memset(guildMember, 0, sizeof(GuildMemberDB) * MAX_ROWS);
|
||||
|
||||
while (m_lpDBComponent->GetData((void**)guildMember, sizeof(GuildMemberDB), MAX_ROWS, &nGetRows))
|
||||
{
|
||||
if (0 == nGetRows) { break; }
|
||||
|
||||
nTotalGuildMemberNum += nGetRows;
|
||||
|
||||
vecGuildMemberDB.push_back(GuildMemberDBRows(guildMember, nGetRows));
|
||||
|
||||
guildMember = new GuildMemberDB[MAX_ROWS];
|
||||
memset(guildMember, 0, sizeof(GuildMemberDB) * MAX_ROWS);
|
||||
}
|
||||
|
||||
if (0 != guildMember)
|
||||
{
|
||||
delete [] guildMember;
|
||||
guildMember = 0;
|
||||
}
|
||||
|
||||
VecGuildMemberDB::iterator pos = vecGuildMemberDB.begin();
|
||||
VecGuildMemberDB::iterator end = vecGuildMemberDB.end();
|
||||
|
||||
CGuild* lpGuild = 0;
|
||||
|
||||
for(; pos != end; ++pos)
|
||||
{
|
||||
GuildMemberDB* lpGuildPos = pos->first;
|
||||
GuildMemberDB* lpGuildEnd = lpGuildPos + pos->second;
|
||||
|
||||
for(; lpGuildPos != lpGuildEnd; ++lpGuildPos)
|
||||
{
|
||||
if (NULL == lpGuild || lpGuild->GetGID() != lpGuildPos->m_dwGID)
|
||||
{
|
||||
lpGuild = static_cast<CGuildDB*>(GetGuild(lpGuildPos->m_dwGID));
|
||||
if (NULL == lpGuild)
|
||||
{
|
||||
ERRLOG2(g_Log, "GID:%10u / CID:%10u / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> DB<44>б<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʴ<EFBFBD> <20><><EFBFBD>忡 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>",
|
||||
lpGuildPos->m_dwGID, lpGuildPos->m_dwCID);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if(!lpGuild->JoinMemberDB(*lpGuildPos))
|
||||
{
|
||||
ERRLOG3(g_Log, "GID:%10u / CID:%10u / Name:%s / DB<44><42><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Join<69>ϴ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>߾<EFBFBD><DFBE>ϴ<EFBFBD>",
|
||||
lpGuildPos->m_dwGID, lpGuildPos->m_dwCID, lpGuildPos->m_strName);
|
||||
}
|
||||
}
|
||||
|
||||
delete [] pos->first;
|
||||
*pos = GuildMemberDBRows((GuildMemberDB*)0, 0);
|
||||
}
|
||||
|
||||
INFLOG1(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : %d <20><><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE>Խ<EFBFBD><D4BD>ϴ<EFBFBD>", nTotalGuildMemberNum);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CGuildDBMgr::ReadGuildRelationDB(void)
|
||||
{
|
||||
const int MAX_ROWS = 10240;
|
||||
int nGetRows = 0;
|
||||
|
||||
char szBuffer[CDBComponent::QUERY_BUFFER_LEN];
|
||||
_snprintf(szBuffer, CDBComponent::QUERY_BUFFER_LEN - 1,
|
||||
"SELECT TblGuildRelation.nGuildID, TblGuildRelation.nTargetGuildID, TblGuildRelation.tnRelation "
|
||||
"FROM TblGuildInfo, TblGuildRelation WHERE "
|
||||
"TblGuildInfo.nGuildID = TblGuildRelation.nGuildID AND TblGuildInfo.OldServerGroupID = %d",
|
||||
CServerSetup::GetInstance().GetAgentServerType());
|
||||
|
||||
szBuffer[CDBComponent::QUERY_BUFFER_LEN - 1] = 0;
|
||||
|
||||
if (0 == m_lpDBComponent || !m_lpDBComponent->ExecuteQuery(szBuffer))
|
||||
{
|
||||
ERRLOG0(g_Log, "ReadGuildRelationDB <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> DB <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>");
|
||||
return false;
|
||||
}
|
||||
|
||||
GuildRelationDB* guildRelation = new GuildRelationDB[MAX_ROWS];
|
||||
memset(guildRelation, 0, sizeof(GuildRelationDB) * MAX_ROWS);
|
||||
|
||||
int nTotalGuildRelationNum = 0;
|
||||
CGuildDB* lpGuild = NULL;
|
||||
CGuildDB* lpTargetGuild = NULL;
|
||||
|
||||
while (m_lpDBComponent->GetData((void**)guildRelation, sizeof(GuildRelationDB), MAX_ROWS, &nGetRows))
|
||||
{
|
||||
if (0 == nGetRows) { break; }
|
||||
|
||||
nTotalGuildRelationNum += nGetRows;
|
||||
|
||||
for (GuildRelationDB* lpGuildRelation = guildRelation; nGetRows > 0; --nGetRows, ++lpGuildRelation)
|
||||
{
|
||||
lpGuild = static_cast<CGuildDB*>(GetGuild(lpGuildRelation->m_dwGID));
|
||||
if (NULL == lpGuild)
|
||||
{
|
||||
ERRLOG2(g_Log, "GID:%10u / TargetGID:%10u / <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʴ<EFBFBD> <20><><EFBFBD>尡 <20><><EFBFBD>尣 <20><><EFBFBD>踦 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>մϴ<D5B4>. ",
|
||||
lpGuildRelation->m_dwGID, lpGuildRelation->m_dwTargetGID);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
lpTargetGuild = static_cast<CGuildDB*>(GetGuild(lpGuildRelation->m_dwTargetGID));
|
||||
if (NULL == lpTargetGuild)
|
||||
{
|
||||
ERRLOG2(g_Log, "GID:%10u / TargetGID:%10u / <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>尣 <20><><EFBFBD>踦 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>մϴ<D5B4>. ",
|
||||
lpGuildRelation->m_dwGID, lpGuildRelation->m_dwTargetGID);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
INFLOG3(g_Log, "GID:%10u / TargetGID:%10u / Relation:%d <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD>",
|
||||
lpGuildRelation->m_dwGID, lpGuildRelation->m_dwTargetGID, lpGuildRelation->m_cRelation);
|
||||
|
||||
// TARGET_NEUTRALITY Ÿ<><C5B8><EFBFBD≯<EFBFBD> TargetGuild<6C><64><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ؾ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>°<EFBFBD><C2B0>̱<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״<EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
|
||||
if(lpGuildRelation->m_cRelation != Guild::TARGET_NEUTRALITY)
|
||||
lpGuild->InsertRelation(lpGuildRelation->m_dwGID, lpGuildRelation->m_dwTargetGID, lpGuildRelation->m_cRelation);
|
||||
|
||||
lpTargetGuild->InsertRelation(lpGuildRelation->m_dwGID, lpGuildRelation->m_dwTargetGID, lpGuildRelation->m_cRelation);
|
||||
}
|
||||
|
||||
memset(guildRelation, 0, sizeof(GuildRelationDB) * MAX_ROWS);
|
||||
}
|
||||
|
||||
INFLOG1(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : %d <20><><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE>Խ<EFBFBD><D4BD>ϴ<EFBFBD>", nTotalGuildRelationNum);
|
||||
|
||||
delete [] guildRelation;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void CGuildDBMgr::SendGuildDBList(CSendStream& SendStream)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> DB <20><>Ŷ + <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> + <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD><EFBFBD>) + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28>ٸ<EFBFBD><D9B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD>)
|
||||
const unsigned short MAX_GUILD_BUFFER_SIZE = sizeof(PktGuildDB) + sizeof(GuildInfoDB) +
|
||||
sizeof(GuildMemberDB) * MAX_MEMBER_NUM +
|
||||
sizeof(GuildRelationDB) * MAX_RELATION_NUM * 2;
|
||||
|
||||
char szBuffer[MAX_GUILD_BUFFER_SIZE];
|
||||
unsigned short wBufferSize = 0;
|
||||
|
||||
unsigned char cTotalMemberNum = 0;
|
||||
unsigned char cRelationByMineNum = 0;
|
||||
unsigned char cRelationByTargetNum = 0;
|
||||
|
||||
for (GuildMap::iterator it = m_GuildMap.begin(); it != m_GuildMap.end(); ++it)
|
||||
{
|
||||
CGuild* lpGuild = it->second;
|
||||
if (NULL == lpGuild)
|
||||
{
|
||||
ERRLOG0(g_Log, "NULL <20><><EFBFBD>尡 <20><><EFBFBD>ԵǾ<D4B5> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>.");
|
||||
return;
|
||||
}
|
||||
|
||||
SerializeOut(lpGuild, szBuffer + sizeof(PktGuildDB),
|
||||
wBufferSize, cTotalMemberNum, cRelationByMineNum, cRelationByTargetNum);
|
||||
|
||||
PktGuildDB* lpGuildDB = reinterpret_cast<PktGuildDB*>(szBuffer);
|
||||
|
||||
lpGuildDB->m_bStartFlag = (it == m_GuildMap.begin()) ? true : false;
|
||||
|
||||
lpGuildDB->m_dwGID = lpGuild->GetGID();
|
||||
|
||||
lpGuildDB->m_cTotalMemberNum = cTotalMemberNum;
|
||||
lpGuildDB->m_cRelationByMineNum = cRelationByMineNum;
|
||||
lpGuildDB->m_cRelationByTargetNum = cRelationByTargetNum;
|
||||
|
||||
lpGuildDB->m_wSize = wBufferSize;
|
||||
|
||||
SendStream.WrapCompress(szBuffer, sizeof(PktGuildDB) + wBufferSize,
|
||||
CmdGuildDB, 0, PktBase::NO_SERVER_ERR);
|
||||
}
|
||||
}
|
||||
|
||||
void CGuildDBMgr::KickAllWaitMember()
|
||||
{
|
||||
GuildMap::iterator itr = m_GuildMap.begin() ;
|
||||
GuildMap::iterator end = m_GuildMap.end() ;
|
||||
CGuildDB* lpGuild = NULL ;
|
||||
|
||||
while ( itr != end )
|
||||
{
|
||||
lpGuild = static_cast<CGuildDB*>( itr->second ) ;
|
||||
if ( lpGuild )
|
||||
{
|
||||
lpGuild->KickAllWaitMember() ;
|
||||
}
|
||||
|
||||
++itr ;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
|
||||
#ifndef _GUILDDB_MGR_H_
|
||||
#define _GUILDDB_MGR_H_
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <Community/Guild/GuildMgr.h>
|
||||
|
||||
|
||||
// forward decl.
|
||||
class CSendStream;
|
||||
|
||||
|
||||
namespace Guild
|
||||
{
|
||||
class CGuildDB;
|
||||
|
||||
class CGuildDBMgr : public CGuildMgr
|
||||
{
|
||||
public:
|
||||
|
||||
static CGuildDBMgr& GetInstance();
|
||||
|
||||
CGuildDBMgr(void);
|
||||
~CGuildDBMgr(void);
|
||||
|
||||
bool Initialize(CDBComponent& DBComponent);
|
||||
|
||||
CGuildDB* CreateGuild(unsigned long dwMasterID, unsigned char cNation, char* szGuildName, unsigned short* wError);
|
||||
GuildMap::iterator DissolveGuild(unsigned long dwGID, unsigned short usDissolveReason);
|
||||
|
||||
bool SetRelation(unsigned long dwGID, unsigned long dwTargetGID, unsigned char cRelationType);
|
||||
void CancelAlertAndCounterHostility(); // <20>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> / ī<><C4AB><EFBFBD><EFBFBD> <20><><EFBFBD>븦 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>踦 <20><><EFBFBD><EFBFBD>
|
||||
void CancelAlertHostility(unsigned long dwTargetGID); // dwTargetGID <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>踦 <20><><EFBFBD><EFBFBD>
|
||||
|
||||
void ProcessGuild(void);
|
||||
void SendGuildDBList(CSendStream& SendStream);
|
||||
|
||||
void KickAllWaitMember() ;
|
||||
|
||||
private:
|
||||
|
||||
bool ReadGuildInfoDB(void);
|
||||
bool ReadGuildMemberDB(void);
|
||||
bool ReadGuildRelationDB(void);
|
||||
|
||||
CDBComponent* m_lpDBComponent;
|
||||
};
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,336 @@
|
||||
#include "stdafx.h"
|
||||
#include "PartyDBInfo.h"
|
||||
|
||||
#include <DataStorage/CharacterData.h>
|
||||
#include <DataStorage/CharacterDataMgr.h>
|
||||
|
||||
#include <DataStorage/SessionData.h>
|
||||
#include <DataStorage/SessionDataMgr.h>
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
|
||||
CPartyDBInfo::CPartyDBInfo(unsigned long PartyID_In)
|
||||
{
|
||||
memset(&m_Party, 0, sizeof(PARTY));
|
||||
m_Party.m_dwPartyID = PartyID_In;
|
||||
|
||||
std::fill_n(&m_Party.ServerID[0], int(PARTY::MAX_MEM), 0);
|
||||
std::fill_n(&m_bAutoRouting[0], int(PARTY::MAX_MEM), 1);
|
||||
|
||||
std::fill_n(&m_Party.m_cLevel[0], int(PARTY::MAX_MEM), 0);
|
||||
std::fill_n(&m_Party.m_wClass[0], int(PARTY::MAX_MEM), 0);
|
||||
std::fill_n(&m_Party.m_dwGID[0], int(PARTY::MAX_MEM), 0);
|
||||
}
|
||||
|
||||
bool CPartyDBInfo::SerializeIn(PARTY_INFO& PartyInfo_In, PARTY_USER_INFO& PartyUserInfo_In)
|
||||
{
|
||||
int Count = 0;
|
||||
for (; Count < PARTY::MAX_MEM; ++Count)
|
||||
{
|
||||
if (0 == PartyInfo_In.MemberCID[Count])
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
strncpy((char *)m_Party.Name[Count], (char *)PartyInfo_In.Name[Count], CHAR_INFOST::MAX_NAME_LEN);
|
||||
m_Party.MemberCID[Count] = PartyInfo_In.MemberCID[Count];
|
||||
m_Party.ServerID[Count] = 0;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //
|
||||
m_Party.m_cLevel[Count] = PartyUserInfo_In.m_cLevel[Count];
|
||||
m_Party.m_wClass[Count] = PartyUserInfo_In.m_wClass[Count];
|
||||
m_Party.m_dwGID[Count] = PartyUserInfo_In.m_dwGID[Count];
|
||||
}
|
||||
|
||||
m_Party.m_cMemberNum = Count;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CPartyDBInfo::SerializeOut(PARTY_INFO& PartyInfo_Out, PARTY_USER_INFO& PartyUserInfo_Out)
|
||||
{
|
||||
if (m_Party.m_cMemberNum > PARTY::MAX_MEM)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
for (int Count = 0; Count < m_Party.m_cMemberNum; ++Count)
|
||||
{
|
||||
PartyInfo_Out.MemberCID[Count] = m_Party.MemberCID[Count];
|
||||
strncpy((char *)PartyInfo_Out.Name[Count], (char *)m_Party.Name[Count], CHAR_INFOST::MAX_NAME_LEN);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //
|
||||
PartyUserInfo_Out.m_cLevel[Count] = m_Party.m_cLevel[Count];
|
||||
PartyUserInfo_Out.m_wClass[Count] = m_Party.m_wClass[Count];
|
||||
PartyUserInfo_Out.m_dwGID[Count] = m_Party.m_dwGID[Count];
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
unsigned long CPartyDBInfo::GetFirstMem(void)
|
||||
{
|
||||
for (int Count = 0; Count < m_Party.m_cMemberNum; ++Count)
|
||||
{
|
||||
if (0 != m_Party.ServerID[Count])
|
||||
{
|
||||
return m_Party.MemberCID[Count];
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool CPartyDBInfo::IsMember(unsigned long CharID_In)
|
||||
{
|
||||
for (int Count = 0; Count < m_Party.m_cMemberNum; ++Count)
|
||||
{
|
||||
if (m_Party.MemberCID[Count] == CharID_In)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CPartyDBInfo::PartyMemLogin(unsigned long dwCharID_In, unsigned long dwServerID_In)
|
||||
{
|
||||
for (int Count = 0; Count < m_Party.m_cMemberNum; ++Count)
|
||||
{
|
||||
if (m_Party.MemberCID[Count] == dwCharID_In)
|
||||
{
|
||||
m_Party.ServerID[Count] = dwServerID_In;
|
||||
if (0 == m_Party.m_dwLeaderID)
|
||||
{
|
||||
SetLeader(dwCharID_In);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CPartyDBInfo::PartyMemLogout(unsigned long CharID_In)
|
||||
{
|
||||
for (int Count = 0; Count < m_Party.m_cMemberNum; ++Count)
|
||||
{
|
||||
if (m_Party.MemberCID[Count] == CharID_In)
|
||||
{
|
||||
m_Party.ServerID[Count] = 0;
|
||||
if (m_Party.m_dwLeaderID == CharID_In)
|
||||
{
|
||||
SetLeader(GetFirstMem());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void CPartyDBInfo::PartyMemAllLogout(void)
|
||||
{
|
||||
std::fill_n(&m_Party.ServerID[0], int(PARTY::MAX_MEM), 0);
|
||||
}
|
||||
|
||||
bool CPartyDBInfo::IsLogined(unsigned long CharID_In)
|
||||
{
|
||||
for (int Count = 0; Count < m_Party.m_cMemberNum; ++Count)
|
||||
{
|
||||
if (m_Party.MemberCID[Count] == CharID_In)
|
||||
{
|
||||
if (m_Party.ServerID[Count] != 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CPartyDBInfo::TransferLeader(unsigned long OldLeaderID, unsigned long NewLeaderID)
|
||||
{
|
||||
if (OldLeaderID != GetLeader())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (false == IsLogined(OldLeaderID) || false == IsLogined(NewLeaderID))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
SetLeader(NewLeaderID);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CPartyDBInfo::InsertPartyMem(unsigned long ServerID_In, unsigned long CharID_In, unsigned short Class_In, char Level_In, unsigned long GID_In, const char* CharName_In)
|
||||
{
|
||||
if (PARTY::MAX_MEM <= m_Party.m_cMemberNum) // <20><>Ƽ<EFBFBD>ο<EFBFBD><CEBF><EFBFBD> 10<31><30> <20>̻<EFBFBD>
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
m_Party.ServerID[m_Party.m_cMemberNum] = ServerID_In;
|
||||
m_Party.MemberCID[m_Party.m_cMemberNum] = CharID_In;
|
||||
m_Party.m_cLevel[m_Party.m_cMemberNum] = Level_In;
|
||||
m_Party.m_wClass[m_Party.m_cMemberNum] = Class_In;
|
||||
m_Party.m_dwGID[m_Party.m_cMemberNum] = GID_In;
|
||||
|
||||
strncpy(m_Party.Name[m_Party.m_cMemberNum], CharName_In, CHAR_INFOST::MAX_NAME_LEN);
|
||||
|
||||
++m_Party.m_cMemberNum;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CPartyDBInfo::DeletePartyMem(unsigned long CharID_In, unsigned long& ServerID_Out)
|
||||
{
|
||||
using namespace DBAgent::DataStorage;
|
||||
|
||||
int nCount = 0;
|
||||
|
||||
for (; nCount < m_Party.m_cMemberNum; ++nCount)
|
||||
{
|
||||
if (m_Party.MemberCID[nCount] == CharID_In)
|
||||
{
|
||||
CSessionData* lpSessionData = 0;
|
||||
CCharacterData* lpCharacterData = 0;
|
||||
|
||||
if(0 == m_Party.ServerID[nCount])
|
||||
{
|
||||
lpCharacterData = static_cast<CCharacterData*>(
|
||||
CCharacterDataMgr::GetInstance().GetLogoutData(CharID_In));
|
||||
}
|
||||
else
|
||||
{
|
||||
lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(CharID_In);
|
||||
if(0 != lpSessionData)
|
||||
{
|
||||
lpCharacterData = lpSessionData->GetCharacterData();
|
||||
}
|
||||
}
|
||||
|
||||
if (0 != lpCharacterData && m_Party.m_dwPartyID == lpCharacterData->GetPID())
|
||||
{
|
||||
RULLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PID<49><44> 0<><30><EFBFBD><EFBFBD> <20><>",
|
||||
m_Party.m_dwPartyID, CharID_In);
|
||||
|
||||
lpCharacterData->SetPID(0);
|
||||
}
|
||||
|
||||
ServerID_Out = m_Party.ServerID[nCount];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (nCount == m_Party.m_cMemberNum)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
for (; nCount < m_Party.m_cMemberNum; ++nCount)
|
||||
{
|
||||
if ((nCount + 1) >= PARTY::MAX_MEM)
|
||||
{
|
||||
m_Party.ServerID[nCount] = 0;
|
||||
m_Party.MemberCID[nCount] = 0;
|
||||
m_Party.m_cLevel[nCount] = 0;
|
||||
m_Party.m_dwGID[nCount] = 0;
|
||||
m_Party.m_wClass[nCount] = 0;
|
||||
|
||||
std::fill_n(&m_Party.Name[nCount][0], int(CHAR_INFOST::MAX_NAME_LEN), 0);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
m_Party.ServerID[nCount] = m_Party.ServerID[nCount + 1];
|
||||
m_Party.MemberCID[nCount] = m_Party.MemberCID[nCount + 1];
|
||||
m_Party.m_cLevel[nCount] = m_Party.m_cLevel[nCount + 1];
|
||||
m_Party.m_dwGID[nCount] = m_Party.m_dwGID[nCount + 1];
|
||||
m_Party.m_wClass[nCount] = m_Party.m_wClass[nCount + 1];
|
||||
strncpy((char *)m_Party.Name[nCount], (char *)m_Party.Name[nCount + 1], CHAR_INFOST::MAX_NAME_LEN);
|
||||
}
|
||||
|
||||
if (m_Party.m_dwLeaderID == CharID_In)
|
||||
{
|
||||
SetLeader(GetFirstMem());
|
||||
}
|
||||
|
||||
--m_Party.m_cMemberNum;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CPartyDBInfo::SetUserInfoLevel(unsigned long dwCID, char cLevel)
|
||||
{
|
||||
for(unsigned char cIndex = 0; cIndex < m_Party.m_cMemberNum; ++cIndex)
|
||||
{
|
||||
if(m_Party.MemberCID[cIndex]==dwCID)
|
||||
{
|
||||
m_Party.m_cLevel[cIndex] = cLevel;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CPartyDBInfo::SetUserInfoClass(unsigned long dwCID, unsigned short wClass)
|
||||
{
|
||||
for(unsigned char cIndex = 0; cIndex < m_Party.m_cMemberNum; ++cIndex)
|
||||
{
|
||||
if(m_Party.MemberCID[cIndex]==dwCID)
|
||||
{
|
||||
m_Party.m_wClass[cIndex] = wClass;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CPartyDBInfo::SetUserInfoGID(unsigned long dwCID, unsigned long dwGID)
|
||||
{
|
||||
for(unsigned char cIndex = 0; cIndex < m_Party.m_cMemberNum; ++cIndex)
|
||||
{
|
||||
if(m_Party.MemberCID[cIndex]==dwCID)
|
||||
{
|
||||
m_Party.m_dwGID[cIndex] = dwGID;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CPartyDBInfo::AutoRouting(unsigned long CharID_In, bool bOn, bool bAll)
|
||||
{
|
||||
if (bAll == true)
|
||||
{
|
||||
int Count = 0;
|
||||
for (; Count < m_Party.m_cMemberNum; ++Count)
|
||||
{
|
||||
m_bAutoRouting[Count] = bOn;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int Count = 0;
|
||||
for (; Count < m_Party.m_cMemberNum; ++Count)
|
||||
{
|
||||
if (m_Party.MemberCID[Count] == CharID_In)
|
||||
{
|
||||
m_bAutoRouting[Count] = bOn;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
#ifndef _RYL_DBAGENT_PARTY_DB_INFO_H_
|
||||
#define _RYL_DBAGENT_PARTY_DB_INFO_H_
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <DB/DBdefine.h>
|
||||
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
|
||||
class CPartyDBInfo
|
||||
{
|
||||
public:
|
||||
|
||||
CPartyDBInfo(unsigned long PartyID_In);
|
||||
|
||||
bool SerializeIn(PARTY_INFO& PartyInfo_In, PARTY_USER_INFO& PartyUserInfo_In);
|
||||
bool SerializeOut(PARTY_INFO& PartyInfo_Out, PARTY_USER_INFO& PartyUserInfo_Out);
|
||||
|
||||
unsigned long GetFirstMem();
|
||||
bool IsMember(unsigned long CharID_In);
|
||||
|
||||
bool PartyMemLogin(unsigned long dwCharID_In, unsigned long dwServer_In);
|
||||
bool PartyMemLogout(unsigned long dwCharID_In);
|
||||
void PartyMemAllLogout();
|
||||
|
||||
bool IsLogined(unsigned long CharID_In);
|
||||
bool IsLoginedByIndex(unsigned long Index) { return m_Party.ServerID[Index]; }
|
||||
|
||||
bool TransferLeader(unsigned long OldLeaderID, unsigned long NewLeaderID);
|
||||
bool InsertPartyMem(unsigned long ServerID_In, unsigned long CharID_In, unsigned short Class_In, char Level_In, unsigned long GID_In, const char* CharName_In);
|
||||
bool DeletePartyMem(unsigned long CharID_In, unsigned long& ServerID_Out);
|
||||
|
||||
bool AutoRouting(unsigned long CharID_In, bool bOn, bool bAll = false);
|
||||
|
||||
const PARTY& GetParty() const { return m_Party; }
|
||||
|
||||
unsigned long GetPID() { return m_Party.m_dwPartyID; }
|
||||
unsigned long GetLeader() { return m_Party.m_dwLeaderID; }
|
||||
unsigned long GetPartyMemNum() { return m_Party.m_cMemberNum; }
|
||||
|
||||
unsigned long SetPID(unsigned long PID_In) { return m_Party.m_dwPartyID = PID_In; }
|
||||
unsigned long SetLeader(unsigned long ID_In) { return m_Party.m_dwLeaderID = ID_In; }
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //
|
||||
|
||||
const PARTY_USERINFO& GetPartyUserInfo() const { return m_PartyUserInfo; }
|
||||
|
||||
bool SetUserInfoLevel(unsigned long dwCID, char cLevel);
|
||||
bool SetUserInfoClass(unsigned long dwCID, unsigned short wClass);
|
||||
bool SetUserInfoGID(unsigned long dwCID, unsigned long dwGID);
|
||||
|
||||
private:
|
||||
|
||||
PARTY m_Party; // <20><>Ƽ<EFBFBD><C6BC> <20>⺻ <20><><EFBFBD><EFBFBD>.
|
||||
bool m_bAutoRouting[PARTY::MAX_MEM];
|
||||
|
||||
PARTY_USERINFO m_PartyUserInfo; // <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,709 @@
|
||||
#include "stdafx.h"
|
||||
#include "PartyDBMgr.h"
|
||||
#include "PartyDBInfo.h"
|
||||
|
||||
#include <Network/SendPacket/SendParty.h>
|
||||
#include <Network/Dispatch/GameDispatch.h>
|
||||
|
||||
#include <DataStorage/CharacterData.h>
|
||||
#include <DataStorage/CharacterDataMgr.h>
|
||||
|
||||
#include <DataStorage/SessionData.h>
|
||||
#include <DataStorage/SessionDataMgr.h>
|
||||
|
||||
#include <DB/DBComponent.h>
|
||||
#include <DB/GameDBComponent.h>
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
|
||||
#include <Network/Packet/PacketStruct/PartyPacket.h>
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
|
||||
#include <new>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
|
||||
CPartyDBMgr& CPartyDBMgr::GetInstance()
|
||||
{
|
||||
static CPartyDBMgr partyDBMgr;
|
||||
return partyDBMgr;
|
||||
}
|
||||
|
||||
CPartyDBMgr::CPartyDBMgr()
|
||||
: m_PartyDBPool(sizeof(CPartyDBInfo))
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
CPartyDBInfo* CPartyDBMgr::CreatePartyDBInfo(unsigned long dwPID)
|
||||
{
|
||||
return new CPartyDBInfo(dwPID);
|
||||
|
||||
// return new (m_PartyDBPool.malloc()) CPartyDBInfo(dwPID);
|
||||
}
|
||||
|
||||
void CPartyDBMgr::DeletePartyDBInfo(CPartyDBInfo* lpPartyDBInfo)
|
||||
{
|
||||
delete lpPartyDBInfo;
|
||||
|
||||
// lpPartyDBInfo->~CPartyDBInfo();
|
||||
// m_PartyDBPool.free(lpPartyDBInfo);
|
||||
}
|
||||
|
||||
|
||||
CPartyDBMgr::~CPartyDBMgr()
|
||||
{
|
||||
PartyMap::iterator pos = m_PartyMap.begin();
|
||||
PartyMap::iterator end = m_PartyMap.end();
|
||||
|
||||
for(; pos != end; ++pos)
|
||||
{
|
||||
DeletePartyDBInfo(pos->second);
|
||||
}
|
||||
|
||||
m_PartyMap.clear();
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool CPartyDBMgr::InsertPartyMap(unsigned long dwPartyID, CPartyDBInfo* lpParty)
|
||||
{
|
||||
m_PartyMap.insert(std::make_pair(dwPartyID, lpParty)).second;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CPartyDBMgr::DeletePartyMap(unsigned long dwPartyID)
|
||||
{
|
||||
PartyMap::iterator itr = m_PartyMap.find(dwPartyID);
|
||||
if (itr == m_PartyMap.end())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
itr->second->~CPartyDBInfo();
|
||||
DeletePartyDBInfo(itr->second);
|
||||
|
||||
m_PartyMap.erase(dwPartyID);
|
||||
return true;
|
||||
}
|
||||
|
||||
CPartyDBInfo* CPartyDBMgr::FindPartyMap(unsigned long dwPartyID_In)
|
||||
{
|
||||
PartyMap::iterator itr = m_PartyMap.find(dwPartyID_In);
|
||||
if (itr == m_PartyMap.end())
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return itr->second;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
CPartyDBInfo* CPartyDBMgr::OpenParty(CDBComponent& DBComponent, unsigned long dwPartyID)
|
||||
{
|
||||
CPartyDBInfo* lpParty = 0;
|
||||
|
||||
if (0 != dwPartyID)
|
||||
{
|
||||
lpParty = FindPartyMap(dwPartyID);
|
||||
|
||||
if (0 == lpParty)
|
||||
{
|
||||
// <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
PARTY_DB_INFO PartyDBInfo = {0,};
|
||||
|
||||
if (!DBComponent::GameDB::GetPartyInfo(DBComponent, dwPartyID, &PartyDBInfo))
|
||||
{
|
||||
ERRLOG1(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / <20><>Ƽ<EFBFBD><C6BC> GetPartyInfo<66><6F> ȣ<><C8A3><EFBFBD>ϴµ<CFB4> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.", dwPartyID);
|
||||
return 0;
|
||||
}
|
||||
|
||||
lpParty = CreatePartyDBInfo(dwPartyID);
|
||||
if (0 == lpParty)
|
||||
{
|
||||
ERRLOG1(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.", dwPartyID);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!lpParty->SerializeIn(PartyDBInfo.PartyInfo, PartyDBInfo.PartyUserInfo))
|
||||
{
|
||||
ERRLOG1(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> Serialize<7A><65> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.", dwPartyID);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// <20><>Ƽ <20>ʿ<EFBFBD> <20>߰<EFBFBD>
|
||||
InsertPartyMap(dwPartyID, lpParty);
|
||||
}
|
||||
}
|
||||
|
||||
return lpParty;
|
||||
}
|
||||
|
||||
bool CPartyDBMgr::CloseParty(CDBComponent& DBComponent, unsigned long dwPartyID)
|
||||
{
|
||||
CPartyDBInfo* lpParty = OpenParty(DBComponent, dwPartyID);
|
||||
if (0 == lpParty)
|
||||
{
|
||||
ERRLOG1(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", dwPartyID);
|
||||
return false;
|
||||
}
|
||||
|
||||
PARTY_DB_INFO PartyInfo = {0,};
|
||||
|
||||
if (!lpParty->SerializeOut(PartyInfo.PartyInfo, PartyInfo.PartyUserInfo))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!DBComponent::GameDB::UpdatePartyInfo(DBComponent, dwPartyID, &PartyInfo))
|
||||
{
|
||||
ERRLOG1(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / <20><>Ƽ<EFBFBD><C6BC> UpdatePartyInfo<66><6F> ȣ<><C8A3><EFBFBD>ϴµ<CFB4> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.", dwPartyID);
|
||||
return false;
|
||||
}
|
||||
|
||||
RULLOG1(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / <20><>Ƽ <20>ݱ<EFBFBD>.", dwPartyID);
|
||||
return DeletePartyMap(dwPartyID);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
CPartyDBInfo* CPartyDBMgr::CreateParty(CDBComponent& DBComponent, unsigned long dwLeaderID, char cLeaderLevel, unsigned short wLeaderClass, unsigned long dwLeaderGID,
|
||||
unsigned long dwMemberID, char cMemberLevel, unsigned short wMemberClass, unsigned long dwMemberGID)
|
||||
{
|
||||
using namespace DataStorage;
|
||||
|
||||
CSessionData* lpLeaderSessionData =
|
||||
CSessionDataMgr::GetInstance().GetCharLoadedSession(dwLeaderID);
|
||||
|
||||
CSessionData* lpMemberSessionData =
|
||||
CSessionDataMgr::GetInstance().GetCharLoadedSession(dwMemberID);
|
||||
|
||||
CCharacterData* lpLeaderCharData = 0;
|
||||
CCharacterData* lpMemberCharData = 0;
|
||||
|
||||
CPartyDBInfo* lpParty = 0;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ἲ <20>˻<EFBFBD>.
|
||||
if (0 == lpLeaderSessionData || 0 == lpMemberSessionData)
|
||||
{
|
||||
ERRLOG4(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : LeaderCID:%10u(0x%p) / MemberCID:%10u(0x%p) / "
|
||||
"<EFBFBD><EFBFBD>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.",
|
||||
dwLeaderID, lpLeaderSessionData, dwMemberID, lpMemberSessionData);
|
||||
}
|
||||
else if(CSessionData::SE_CHAR_ENABLED != lpLeaderSessionData->GetSessionState() ||
|
||||
CSessionData::SE_CHAR_ENABLED != lpMemberSessionData->GetSessionState())
|
||||
{
|
||||
ERRLOG4(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : LeaderCID:%10u(ST:%s) / MemberCID:%10u(ST:%s) / "
|
||||
"<EFBFBD><EFBFBD>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> <20><><EFBFBD>°<EFBFBD> Ȱ<><C8B0>ȭ<EFBFBD><C8AD><EFBFBD><EFBFBD> <20>ʾҽ<CABE><D2BD>ϴ<EFBFBD>.",
|
||||
dwLeaderID, g_szSessionStateString[lpLeaderSessionData->GetSessionState()],
|
||||
dwMemberID, g_szSessionStateString[lpMemberSessionData->GetSessionState()]);
|
||||
}
|
||||
else if(0 == (lpLeaderCharData = lpLeaderSessionData->GetCharacterData()) ||
|
||||
0 == (lpMemberCharData = lpMemberSessionData->GetCharacterData()))
|
||||
{
|
||||
ERRLOG4(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : LeaderCID:%10u(CharData:0x%p) / MemberCID:%10u(CharData:0x%p) / "
|
||||
"<EFBFBD><EFBFBD>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.",
|
||||
dwLeaderID, lpLeaderCharData, dwMemberID, lpMemberCharData);;
|
||||
}
|
||||
else
|
||||
{
|
||||
PARTY_DB_INFO PartyInfo = {0,};
|
||||
|
||||
PartyInfo.PartyInfo.MemberCID[0] = lpLeaderCharData->GetCID();
|
||||
PartyInfo.PartyUserInfo.m_cLevel[0] = cLeaderLevel;
|
||||
PartyInfo.PartyUserInfo.m_wClass[0] = wLeaderClass;
|
||||
PartyInfo.PartyUserInfo.m_dwGID[0] = dwLeaderGID;
|
||||
strncpy(PartyInfo.PartyInfo.Name[0], lpLeaderCharData->GetName(), CHAR_INFOST::MAX_NAME_LEN);
|
||||
|
||||
|
||||
PartyInfo.PartyInfo.MemberCID[1] = lpMemberCharData->GetCID();
|
||||
PartyInfo.PartyUserInfo.m_cLevel[1] = cMemberLevel;
|
||||
PartyInfo.PartyUserInfo.m_wClass[1] = wMemberClass;
|
||||
PartyInfo.PartyUserInfo.m_dwGID[1] = dwMemberGID;
|
||||
strncpy(PartyInfo.PartyInfo.Name[1], lpMemberCharData->GetName(), CHAR_INFOST::MAX_NAME_LEN);
|
||||
|
||||
// DB <20><>Ƽ <20><><EFBFBD><EFBFBD>
|
||||
unsigned long dwPartyID = 0;
|
||||
|
||||
if (!DBComponent::GameDB::InsertParty(DBComponent, &PartyInfo, &dwPartyID))
|
||||
{
|
||||
ERRLOG3(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / LeaderCID:%10u / MemberCID:%10u / "
|
||||
"<EFBFBD><EFBFBD>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><>Ƽ<EFBFBD><C6BC> InsertParty<74><79> ȣ<><C8A3><EFBFBD>ϴµ<CFB4> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.",
|
||||
dwPartyID, dwLeaderID, dwMemberID);
|
||||
}
|
||||
else if (0 == dwPartyID)
|
||||
{
|
||||
ERRLOG3(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / LeaderCID:%10u / MemberCID:%10u / "
|
||||
"<EFBFBD><EFBFBD>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : DB<44><42><EFBFBD><EFBFBD> <20><>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.",
|
||||
dwPartyID, dwLeaderID, dwMemberID);
|
||||
}
|
||||
else if (0 == (lpParty = CreatePartyDBInfo(dwPartyID)))
|
||||
{
|
||||
ERRLOG3(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / LeaderCID:%10u / MemberCID:%10u / "
|
||||
"<EFBFBD><EFBFBD>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : CPartyDBInfo<66><6F><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
dwPartyID, dwLeaderID, dwMemberID);
|
||||
}
|
||||
else if (!lpParty->SerializeIn(PartyInfo.PartyInfo, PartyInfo.PartyUserInfo))
|
||||
{
|
||||
DeletePartyDBInfo(lpParty);
|
||||
lpParty = 0;
|
||||
|
||||
ERRLOG3(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / LeaderCID:%10u / MemberCID:%10u / "
|
||||
"<EFBFBD><EFBFBD>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Serialize <20><><EFBFBD><EFBFBD>",
|
||||
dwPartyID, dwLeaderID, dwMemberID);
|
||||
}
|
||||
else
|
||||
{
|
||||
lpParty->PartyMemLogin(dwLeaderID, lpLeaderSessionData->GetServerID());
|
||||
lpParty->PartyMemLogin(dwMemberID, lpMemberSessionData->GetServerID());
|
||||
|
||||
InsertPartyMap(dwPartyID, lpParty);
|
||||
|
||||
RULLOG3(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / LeaderCID:%10u / MemberCID;%10u / "
|
||||
"<EFBFBD><EFBFBD>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ", dwPartyID, dwLeaderID, dwMemberID);
|
||||
}
|
||||
}
|
||||
|
||||
return lpParty;
|
||||
}
|
||||
|
||||
bool CPartyDBMgr::DestoryParty(CDBComponent& DBComponent, unsigned long dwPartyID)
|
||||
{
|
||||
CPartyDBInfo* lpParty = FindPartyMap(dwPartyID);
|
||||
if (0 == lpParty)
|
||||
{
|
||||
ERRLOG1(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / <20><>Ƽ <20>Ҹ<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>", dwPartyID);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (MIN_MEMBER_NUM != lpParty->GetPartyMemNum())
|
||||
{
|
||||
ERRLOG1(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / <20><>Ƽ <20>Ҹ<EFBFBD> <20><><EFBFBD><EFBFBD> : <20>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD> <20>ּ<EFBFBD><D6BC>ο<EFBFBD><CEBF><EFBFBD> <20>ƴմϴ<D5B4>", dwPartyID);
|
||||
return false;
|
||||
}
|
||||
|
||||
PARTY_DB_INFO PartyInfo = {0,};
|
||||
if (!lpParty->SerializeOut(PartyInfo.PartyInfo, PartyInfo.PartyUserInfo))
|
||||
{
|
||||
ERRLOG1(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / <20><>Ƽ <20>Ҹ<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>", dwPartyID);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!DBComponent::GameDB::DeleteParty(DBComponent, &PartyInfo, dwPartyID))
|
||||
{
|
||||
ERRLOG1(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / <20><>Ƽ <20>Ҹ<EFBFBD> <20><><EFBFBD><EFBFBD> : DBȣ<42><C8A3> DeleteParty<74><79> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.", dwPartyID);
|
||||
return false;
|
||||
}
|
||||
|
||||
// ij<><C4B3> DB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20>ִ<EFBFBD> ij<><C4B3><EFBFBD>ʹ<EFBFBD> PID <20>缳<EFBFBD><E7BCB3> <20><><EFBFBD>־<EFBFBD><D6BE><EFBFBD> <20>Ѵ<EFBFBD>.
|
||||
using namespace DataStorage;
|
||||
|
||||
CCharacterData* lpMember = 0;
|
||||
for (unsigned long nCount = 0; nCount < lpParty->GetPartyMemNum(); ++nCount)
|
||||
{
|
||||
if (0 == lpParty->IsLoginedByIndex(nCount))
|
||||
{
|
||||
lpMember = static_cast<CCharacterData*>(CCharacterDataMgr::GetInstance().GetLogoutData(PartyInfo.PartyInfo.MemberCID[nCount]));
|
||||
|
||||
if (0 != lpMember)
|
||||
{
|
||||
if (dwPartyID == lpMember->GetPID())
|
||||
{
|
||||
RULLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:10u / <20><>Ƽ <20>Ҹ<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><>Ƽ <20>Ҹ<EFBFBD><D2B8><EFBFBD>, ij<><C4B3> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PID<49><44><EFBFBD><EFBFBD>",
|
||||
dwPartyID, PartyInfo.PartyInfo.MemberCID[nCount]);
|
||||
|
||||
lpMember->SetPID(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SendPacket::DeleteParty(lpParty);
|
||||
|
||||
RULLOG1(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / <20><>Ƽ <20>Ҹ<EFBFBD> <20><><EFBFBD><EFBFBD>", dwPartyID);
|
||||
return DeletePartyMap(dwPartyID);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
bool CPartyDBMgr::InsertPartyMember(CDBComponent& DBComponent, unsigned long dwPartyID, unsigned long dwCharID, unsigned long dwGID,
|
||||
unsigned short wClass, char cLevel)
|
||||
{
|
||||
using namespace DataStorage;
|
||||
|
||||
CSessionData* lpInsertMember = CSessionDataMgr::GetInstance().GetCharLoadedSession(dwCharID);
|
||||
CCharacterData* lpInsertMemberCharData = 0;
|
||||
CPartyDBInfo* lpParty = 0;
|
||||
|
||||
PARTY_DB_INFO PartyInfo = {0,};
|
||||
|
||||
if(0 == lpInsertMember)
|
||||
{
|
||||
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>",
|
||||
dwPartyID, dwCharID);
|
||||
|
||||
return false;
|
||||
}
|
||||
else if(0 == (lpParty = OpenParty(DBComponent, dwPartyID)))
|
||||
{
|
||||
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD> : ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
dwPartyID, dwCharID);
|
||||
|
||||
return false;
|
||||
}
|
||||
else if(0 == (lpInsertMemberCharData = lpInsertMember->GetCharacterData()))
|
||||
{
|
||||
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD>ǿ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
dwPartyID, dwCharID);
|
||||
|
||||
return false;
|
||||
}
|
||||
else if(!lpParty->InsertPartyMem(lpInsertMember->GetServerID(), dwCharID, wClass, cLevel, dwGID, lpInsertMemberCharData->GetName()))
|
||||
{
|
||||
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><>Ƽ<EFBFBD><C6BC> ij<><C4B3><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
dwPartyID, dwCharID);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!lpParty->SerializeOut(PartyInfo.PartyInfo, PartyInfo.PartyUserInfo))
|
||||
{
|
||||
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
dwPartyID, dwCharID);
|
||||
|
||||
return false;
|
||||
}
|
||||
else if(!DBComponent::GameDB::InsertPartyMember(DBComponent, dwPartyID, &PartyInfo, dwCharID))
|
||||
{
|
||||
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD> : DB<44><42> InsertPartyMember ȣ<><C8A3> <20><><EFBFBD><EFBFBD>",
|
||||
dwPartyID, dwCharID);
|
||||
|
||||
return false;
|
||||
}
|
||||
else if(!SendPacket::PartyCmd(PktDD::SCmdInsertPartyMem, lpParty->GetPID(), dwCharID, dwGID,
|
||||
wClass, lpInsertMember->GetServerID(), cLevel, lpInsertMemberCharData->GetName()))
|
||||
{
|
||||
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
dwPartyID, dwCharID);
|
||||
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
DETLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD>", dwPartyID, dwCharID);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CPartyDBMgr::DeletePartyMember(CDBComponent& DBComponent, unsigned long dwPartyID,
|
||||
unsigned long dwCharID, unsigned long dwReference)
|
||||
{
|
||||
CPartyDBInfo* lpParty = OpenParty(DBComponent, dwPartyID);
|
||||
if (0 == lpParty)
|
||||
{
|
||||
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
dwPartyID, dwCharID);
|
||||
|
||||
return false;
|
||||
}
|
||||
else if (MIN_MEMBER_NUM == lpParty->GetPartyMemNum())
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
return DestoryParty(DBComponent, dwPartyID);
|
||||
}
|
||||
|
||||
unsigned long dwServerID = 0;
|
||||
unsigned long dwOldLeader = lpParty->GetLeader();
|
||||
if (!lpParty->DeletePartyMem(dwCharID, dwServerID))
|
||||
{
|
||||
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
dwPartyID, dwCharID);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
DETLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", dwPartyID, dwCharID);
|
||||
|
||||
PARTY_DB_INFO PartyInfo = {0,};
|
||||
if (!lpParty->SerializeOut(PartyInfo.PartyInfo, PartyInfo.PartyUserInfo))
|
||||
{
|
||||
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
dwPartyID, dwCharID);
|
||||
|
||||
return false;
|
||||
}
|
||||
else if(!DBComponent::GameDB::DeletePartyMember(DBComponent, dwPartyID, &PartyInfo, dwCharID))
|
||||
{
|
||||
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : DB<44><42> DeletePartyMember ȣ<><C8A3> <20><><EFBFBD><EFBFBD>",
|
||||
dwPartyID, dwCharID);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> üũ
|
||||
unsigned long dwLeader = lpParty->GetLeader();
|
||||
if (dwOldLeader != dwLeader)
|
||||
{
|
||||
// <20><>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD>
|
||||
dwReference = dwLeader;
|
||||
}
|
||||
|
||||
if(!SendPacket::PartyCmd(PktDD::SCmdDeletePartyMem, lpParty->GetPID(), dwCharID, dwReference, 0, 0, 0, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"))
|
||||
{
|
||||
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٲ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
dwPartyID, dwCharID);
|
||||
}
|
||||
|
||||
if (0 == dwLeader)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ<EFBFBD><C6BC> <20>ݴ´<DDB4>.
|
||||
if(CloseParty(DBComponent, dwPartyID))
|
||||
{
|
||||
DETLOG3(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / Leader:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><>Ƽ<EFBFBD><C6BC> <20>ݽ<EFBFBD><DDBD>ϴ<EFBFBD>.",
|
||||
dwPartyID, dwCharID, dwLeader);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CPartyDBMgr::AutoRoutingOn(CDBComponent& DBComponent, unsigned long dwPartyID, unsigned long dwCharID)
|
||||
{
|
||||
// CharID <20><> 0 <20≯<EFBFBD> ALL
|
||||
CPartyDBInfo* lpParty = OpenParty(DBComponent, dwPartyID);
|
||||
if (0 == lpParty)
|
||||
{
|
||||
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ON <20><><EFBFBD><EFBFBD> : <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>",
|
||||
dwPartyID, dwCharID);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!lpParty->AutoRouting(dwCharID, true, (0 == dwCharID) ? true : false))
|
||||
{
|
||||
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ON <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ѱ<EFBFBD> <20><><EFBFBD><EFBFBD> (CID<49><44> 0<≯<EFBFBD> <20><><EFBFBD><EFBFBD>)",
|
||||
dwPartyID, dwCharID);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return SendPacket::PartyCmd(PktDD::SCmdAutoRoutingOn, lpParty->GetPID(), dwCharID, 0, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
bool CPartyDBMgr::AutoRoutingOff(CDBComponent& DBComponent, unsigned long dwPartyID, unsigned long dwCharID)
|
||||
{
|
||||
// CharID <20><> 0 <20≯<EFBFBD> ALL
|
||||
CPartyDBInfo* lpParty = OpenParty(DBComponent, dwPartyID);
|
||||
if (0 == lpParty)
|
||||
{
|
||||
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> OFF <20><><EFBFBD><EFBFBD> : <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>",
|
||||
dwPartyID, dwCharID);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (false == lpParty->AutoRouting(dwCharID, false, (0 == dwCharID) ? true : false))
|
||||
{
|
||||
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> OFF <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ѱ<EFBFBD> <20><><EFBFBD><EFBFBD> (CID<49><44> 0<≯<EFBFBD> <20><><EFBFBD><EFBFBD>)",
|
||||
dwPartyID, dwCharID);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return SendPacket::PartyCmd(PktDD::SCmdAutoRoutingOff, lpParty->GetPID(), dwCharID, 0, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
void CPartyDBMgr::LoginPartyMember(CPartyDBInfo* lpParty, unsigned long dwUserID, unsigned long dwCharID, unsigned long dwGID,
|
||||
unsigned short wClass, unsigned long dwServerID, char cLevel)
|
||||
{
|
||||
if (0 == lpParty)
|
||||
{
|
||||
ERRLOG3(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : UID:%10u / CID:%10u / ServerID:0x%08X / "
|
||||
"<EFBFBD><EFBFBD>Ƽ <20><><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>", dwUserID, dwCharID, dwServerID);
|
||||
}
|
||||
else if (!lpParty->IsMember(dwCharID))
|
||||
{
|
||||
ERRLOG4(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / UID:%10u / CID:%10u / ServerID:0x%08X / "
|
||||
"<EFBFBD><EFBFBD>Ƽ <20><><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴմϴ<D5B4>",
|
||||
lpParty->GetPID(), dwUserID, dwCharID, dwServerID);
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned long dwPartyID = lpParty->GetPID();
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> DB<44><42><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ȯ<><C8AE>
|
||||
|
||||
using namespace DataStorage;
|
||||
|
||||
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(dwCharID);
|
||||
CCharacterData* lpCharacterData = 0;
|
||||
|
||||
if (0 == dwPartyID || 0 == lpSessionData || 0 == (lpCharacterData = lpSessionData->GetCharacterData()))
|
||||
{
|
||||
ERRLOG6(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / UID:%10u / CID:%10u(Session:0x%p/Character:0x%p) / ServerID:0x%08X / "
|
||||
"<EFBFBD><EFBFBD>Ƽ <20><><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> Ȥ<><C8A4> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>",
|
||||
dwPartyID, dwUserID, dwCharID, lpSessionData, lpCharacterData, dwServerID);
|
||||
}
|
||||
else if (lpCharacterData->GetPID() != dwPartyID)
|
||||
{
|
||||
ERRLOG5(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CharacterDataPID:%10u / UID:%10u / CID:%10u / ServerID:0x%08X / "
|
||||
"<EFBFBD><EFBFBD>Ƽ <20><><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><>û PID<49><44> ij<><C4B3><EFBFBD><EFBFBD> PID<49><44> <20>ٸ<EFBFBD><D9B8>ϴ<EFBFBD>",
|
||||
dwPartyID, lpCharacterData->GetPID(), dwUserID, dwCharID, dwServerID);
|
||||
}
|
||||
else if (!lpParty->PartyMemLogin(dwCharID, dwServerID))
|
||||
{
|
||||
GET_MULTI_DISPATCH(lpGameDispatch, dwServerID,
|
||||
DBAgent::CGameDispatch, DBAgent::CGameDispatch::GetDispatchTable());
|
||||
|
||||
if(0 != lpGameDispatch)
|
||||
{
|
||||
ERRLOG4(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / UID:%10u / CID:%10u / ServerID:0x%08X / "
|
||||
"<EFBFBD><EFBFBD>Ƽ <20><><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><>Ƽ <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
dwPartyID, dwUserID, dwCharID, dwServerID);
|
||||
|
||||
SendPacket::PartyCmd(lpGameDispatch->GetSendStream(), PktDD::SCmdLoginPartyMem,
|
||||
dwPartyID, dwCharID, dwGID, wClass, dwServerID, cLevel, lpCharacterData->GetName(), 2);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DETLOG4(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / UID:%10u / CID:%10u / ServerID:0x%08X / "
|
||||
"<EFBFBD><EFBFBD>Ƽ <20><><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD>", dwPartyID, dwUserID, dwCharID, dwServerID);
|
||||
|
||||
CPartyDBInfo* lpParty = CPartyDBMgr::GetInstance().OpenParty(CDBSingleObject::GetInstance(), dwPartyID);
|
||||
|
||||
if(lpParty)
|
||||
{
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ //
|
||||
lpParty->SetUserInfoLevel(dwCharID, cLevel);
|
||||
lpParty->SetUserInfoClass(dwCharID, wClass);
|
||||
lpParty->SetUserInfoGID(dwCharID, dwGID);
|
||||
}
|
||||
|
||||
SendPacket::PartyCmd(PktDD::SCmdLoginPartyMem, lpParty->GetPID(),
|
||||
dwCharID, dwGID, wClass, dwServerID, cLevel, lpCharacterData->GetName());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CPartyDBMgr::LogoutPartyMember(CDBComponent& DBComponent, CPartyDBInfo* lpParty, unsigned long dwCharID)
|
||||
{
|
||||
if (0 == lpParty)
|
||||
{
|
||||
ERRLOG1(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : CID:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20>αƿ<D7BE> <20><><EFBFBD><EFBFBD> : <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", dwCharID);
|
||||
}
|
||||
else if (!lpParty->IsMember(dwCharID))
|
||||
{
|
||||
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20>αƿ<D7BE> <20><><EFBFBD><EFBFBD> : <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20>ƴմϴ<D5B4>",
|
||||
lpParty->GetPID(), dwCharID);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned long dwPartyID = lpParty->GetPID();
|
||||
unsigned long dwOldLeader = lpParty->GetLeader();
|
||||
|
||||
if (!lpParty->PartyMemLogout(dwCharID))
|
||||
{
|
||||
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20>αƿ<D7BE> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> <20>αƿ<D7BE> <20><><EFBFBD><EFBFBD>",
|
||||
dwPartyID, dwCharID);
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned long dwLeader = lpParty->GetLeader();
|
||||
unsigned long dwReference = 0;
|
||||
if (dwOldLeader != dwLeader)
|
||||
{
|
||||
dwReference = dwLeader;
|
||||
}
|
||||
|
||||
DETLOG3(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / NewLeader:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20>αƿ<D7BE> <20><><EFBFBD><EFBFBD>",
|
||||
dwPartyID, dwCharID, dwReference);
|
||||
|
||||
SendPacket::PartyCmd(PktDD::SCmdLogoutPartyMem, lpParty->GetPID(), dwCharID, dwReference, 0, 0, 0, 0);
|
||||
|
||||
if (0 == dwLeader)
|
||||
{
|
||||
// <20><>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
||||
if(CloseParty(DBComponent, dwPartyID))
|
||||
{
|
||||
DETLOG3(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / Leader:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20>αƿ<D7BE> : <20><>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><>Ƽ<EFBFBD><C6BC> <20>ݽ<EFBFBD><DDBD>ϴ<EFBFBD>.",
|
||||
dwPartyID, dwCharID, dwLeader);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CPartyDBMgr::SendToGameServerPartyData(CSendStream& SendStream)
|
||||
{
|
||||
// <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>. //]
|
||||
PartyMap::iterator start = m_PartyMap.begin();
|
||||
PartyMap::iterator end = m_PartyMap.end();
|
||||
|
||||
for(; start!=end; ++start)
|
||||
{
|
||||
// <20><>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD> //
|
||||
CPartyDBInfo* lpPartyDBInfo = start->second;
|
||||
|
||||
if(lpPartyDBInfo)
|
||||
{
|
||||
// <20><>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //
|
||||
|
||||
PARTY sParty = lpPartyDBInfo->GetParty();
|
||||
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktPIDAck));
|
||||
|
||||
PktPIDAck* lppktPIDAck = reinterpret_cast<PktPIDAck*>(lpBuffer);
|
||||
|
||||
memset(lppktPIDAck, 0, sizeof(PktPIDAck));
|
||||
|
||||
lppktPIDAck->m_wCmd = PktDD::SCmdGetPartyInfo;
|
||||
lppktPIDAck->m_Party = lpPartyDBInfo->GetParty();
|
||||
|
||||
SendStream.WrapHeader(sizeof(PktPIDAck), CmdAgentParty, 0, PktPMD::NO_SERVER_ERR);
|
||||
|
||||
// <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //
|
||||
PARTY_USERINFO sPartyUserInfo = lpPartyDBInfo->GetPartyUserInfo();
|
||||
|
||||
for(unsigned char cIndex = 0; cIndex < PARTY::MAX_MEM; cIndex++)
|
||||
{
|
||||
// <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ӵǾ<D3B5><C7BE>ִ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> //
|
||||
if(sParty.MemberCID[cIndex] && sParty.ServerID[cIndex])
|
||||
{
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktPMD));
|
||||
|
||||
if(0 != lpBuffer)
|
||||
{
|
||||
PktPMD* lpPktPMD = reinterpret_cast<PktPMD*>(lpBuffer);
|
||||
|
||||
lpPktPMD->m_wCmd = PktDD::SCmdLoginPartyMem;
|
||||
lpPktPMD->m_dwPartyID = sParty.m_dwPartyID;
|
||||
lpPktPMD->m_dwSenderID = sParty.MemberCID[cIndex];
|
||||
lpPktPMD->m_dwGID = sPartyUserInfo.m_dwGID[cIndex];
|
||||
lpPktPMD->m_wClass = sParty.m_wClass[cIndex];
|
||||
lpPktPMD->m_dwServerID = sParty.ServerID[cIndex];
|
||||
lpPktPMD->m_cLevel = sParty.m_cLevel[cIndex];
|
||||
|
||||
if(sParty.Name[cIndex])
|
||||
{
|
||||
strncpy(lpPktPMD->m_strSenderName, sParty.Name[cIndex], CHAR_INFOST::MAX_NAME_LEN);
|
||||
lpPktPMD->m_strSenderName[CHAR_INFOST::MAX_NAME_LEN - 1] = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
memset(lpPktPMD->m_strSenderName, 0, sizeof(char) * CHAR_INFOST::MAX_NAME_LEN);
|
||||
}
|
||||
|
||||
SendStream.WrapHeader(sizeof(PktPMD), CmdAgentParty, 0, PktPMD::NO_SERVER_ERR);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
#ifndef _RYL_DBAGENT_PARTY_DB_MGR_H_
|
||||
#define _RYL_DBAGENT_PARTY_DB_MGR_H_
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <map>
|
||||
#include <boost/pool/pool_alloc.hpp>
|
||||
#include <boost/pool/pool.hpp>
|
||||
|
||||
// forward decl.
|
||||
class CDBComponent;
|
||||
class CSendStream;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
|
||||
// forward delc.
|
||||
class CPartyDBInfo;
|
||||
|
||||
class CPartyDBMgr
|
||||
{
|
||||
public:
|
||||
|
||||
static CPartyDBMgr& GetInstance();
|
||||
|
||||
CPartyDBInfo* OpenParty(CDBComponent& DBComponent, unsigned long dwPartyID);
|
||||
bool CloseParty(CDBComponent& DBComponent, unsigned long dwPartyID);
|
||||
|
||||
CPartyDBInfo* CreateParty(CDBComponent& DBComponent, unsigned long dwLeaderID, char cLeaderLevel, unsigned short wLeaderClass, unsigned long dwLeaderGID,
|
||||
unsigned long dwMemberID, char cMemberLevel, unsigned short wMemberClass, unsigned long dwMemberGID);
|
||||
|
||||
bool DestoryParty(CDBComponent& DBComponent, unsigned long dwPartyID);
|
||||
|
||||
bool InsertPartyMember(CDBComponent& DBComponent, unsigned long dwPartyID, unsigned long dwCharID, unsigned long dwGID,
|
||||
unsigned short wClass, char cLevel);
|
||||
|
||||
bool DeletePartyMember(CDBComponent& DBComponent, unsigned long dwPartyID,
|
||||
unsigned long dwCharID, unsigned long dwReference);
|
||||
|
||||
bool AutoRoutingOn(CDBComponent& DBComponent, unsigned long dwPartyID, unsigned long dwCharID);
|
||||
bool AutoRoutingOff(CDBComponent& DBComponent, unsigned long dwPartyID, unsigned long dwCharID);
|
||||
|
||||
bool InsertPartyMap(unsigned long dwPartyID, CPartyDBInfo* lpParty);
|
||||
bool DeletePartyMap(unsigned long dwPartyID);
|
||||
CPartyDBInfo* FindPartyMap(unsigned long dwPartyID_In);
|
||||
|
||||
void LoginPartyMember(CPartyDBInfo* lpParty, unsigned long dwUserID, unsigned long dwCharID, unsigned long dwGID,
|
||||
unsigned short wClass, unsigned long dwServerID, char cLevel);
|
||||
|
||||
void LogoutPartyMember(CDBComponent& DBComponent, CPartyDBInfo* lpParty, unsigned long dwCharID);
|
||||
|
||||
void SendToGameServerPartyData(CSendStream& SendStream);
|
||||
|
||||
private:
|
||||
|
||||
CPartyDBMgr();
|
||||
~CPartyDBMgr();
|
||||
|
||||
CPartyDBInfo* CreatePartyDBInfo(unsigned long dwPID);
|
||||
void DeletePartyDBInfo(CPartyDBInfo* lpPartyDBInfo);
|
||||
|
||||
enum Const
|
||||
{
|
||||
MIN_MEMBER_NUM = 2
|
||||
};
|
||||
|
||||
typedef std::map<unsigned long, CPartyDBInfo*, std::less<unsigned long>,
|
||||
boost::fast_pool_allocator<std::pair<unsigned long, CPartyDBInfo*> > > PartyMap;
|
||||
|
||||
PartyMap m_PartyMap;
|
||||
boost::pool<> m_PartyDBPool;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,853 @@
|
||||
#include "stdafx.h"
|
||||
#include "CampDB.h"
|
||||
#include "SiegeObjectDBMgr.h"
|
||||
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
#include <Network/Packet/WrapPacket.h>
|
||||
#include <Network/Packet/PacketStruct/ServerInfo.h>
|
||||
#include <Network/Dispatch/GameDispatch.h>
|
||||
|
||||
#include <Community/Guild/GuildDB.h>
|
||||
#include <Community/Guild/GuildDBMgr.h>
|
||||
|
||||
#include <Castle/Castle.h>
|
||||
#include <Castle/CastleMgr.h>
|
||||
|
||||
#include <DB/DBComponent.h>
|
||||
#include <Castle/CastleDBComponent.h>
|
||||
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
|
||||
#include <atltime.h>
|
||||
|
||||
|
||||
CCampDB::CCampDB(CDBComponent& DBComponent, const CampInfoDB& CampInfo)
|
||||
: CSiegeObjectDB(DBComponent, CampInfo), m_wChangeType(0),
|
||||
m_dwOldTotalMinutes(Siege::CAMP_ENCAMPING_TIME)
|
||||
{
|
||||
::memcpy(&m_CampRight, CampInfo.m_szRight, sizeof(CampRight));
|
||||
}
|
||||
|
||||
CCampDB::CCampDB(CDBComponent& DBComponent, unsigned long dwCampID, unsigned long dwGID,
|
||||
unsigned char cZone, unsigned char cChannel, Position Pos)
|
||||
: CSiegeObjectDB(DBComponent, dwCampID, dwGID, cZone, cChannel, Pos),
|
||||
m_wChangeType(0), m_dwOldTotalMinutes(Siege::CAMP_ENCAMPING_TIME)
|
||||
{
|
||||
}
|
||||
|
||||
CCampDB::~CCampDB()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
bool CCampDB::CancelBuild()
|
||||
{
|
||||
if (m_cState == Siege::DEVELOPING)
|
||||
{
|
||||
m_cState = Siege::CANCELING;
|
||||
|
||||
SYSTEMTIME sysTime;
|
||||
GetLocalTime(&sysTime);
|
||||
|
||||
m_TimeValue.Year = sysTime.wYear;
|
||||
m_TimeValue.Month = sysTime.wMonth;
|
||||
m_TimeValue.Day = sysTime.wDay;
|
||||
m_TimeValue.Hour = sysTime.wHour;
|
||||
m_TimeValue.Minute = sysTime.wMinute;
|
||||
m_TimeValue.Second = sysTime.wSecond;
|
||||
|
||||
DBComponent::CastleDB::UpdateCampState(m_DBComponent, GetCampID(), m_cState);
|
||||
DBComponent::CastleDB::UpdateCampTime(m_DBComponent, GetCampID(), Siege::TYPE_REMAIN_TIME, sysTime);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CCampDB::Cancel()
|
||||
{
|
||||
m_cState = Siege::DESTROYED;
|
||||
m_dwHP = 0;
|
||||
m_cUpgradeStep = 0;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CCampDB::Upgrade(unsigned char cUpgradeTime, unsigned long dwUpgradeGold, unsigned char cUpgradeType)
|
||||
{
|
||||
if (Siege::COMPLETE == m_cState)
|
||||
{
|
||||
if (Siege::MAX_UPGRADE_NUM == m_cUpgradeStep) return false;
|
||||
|
||||
m_cState = Siege::UPGRADING;
|
||||
m_cUpgradeTime = cUpgradeTime;
|
||||
|
||||
SYSTEMTIME sysTime;
|
||||
GetLocalTime(&sysTime);
|
||||
|
||||
m_TimeValue.Year = sysTime.wYear;
|
||||
m_TimeValue.Month = sysTime.wMonth;
|
||||
m_TimeValue.Day = sysTime.wDay;
|
||||
m_TimeValue.Hour = sysTime.wHour;
|
||||
m_TimeValue.Minute = sysTime.wMinute;
|
||||
m_TimeValue.Second = sysTime.wSecond;
|
||||
|
||||
DBComponent::CastleDB::UpdateCampState(m_DBComponent, GetCampID(), m_cState);
|
||||
DBComponent::CastleDB::UpdateCampTime(m_DBComponent, GetCampID(), Siege::TYPE_REMAIN_TIME, sysTime);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CCampDB::Repair(unsigned long dwRepairHP, unsigned long dwRepairGold)
|
||||
{
|
||||
if (Siege::COMPLETE == m_cState)
|
||||
{
|
||||
m_cState = Siege::REPARING;
|
||||
m_dwRepairHP = dwRepairHP;
|
||||
m_cRepairTime = Siege::CAMP_REPAIR_TIME;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> â<><C3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
if (dwRepairGold > 0)
|
||||
{
|
||||
Guild::CGuildDB* lpGuild = static_cast<Guild::CGuildDB*>(
|
||||
Guild::CGuildDBMgr::GetInstance().GetGuild(m_dwGID));
|
||||
|
||||
if (lpGuild)
|
||||
{
|
||||
lpGuild->DeductGold(dwRepairGold);
|
||||
}
|
||||
}
|
||||
|
||||
SYSTEMTIME sysTime;
|
||||
GetLocalTime(&sysTime);
|
||||
|
||||
m_TimeValue.Year = sysTime.wYear;
|
||||
m_TimeValue.Month = sysTime.wMonth;
|
||||
m_TimeValue.Day = sysTime.wDay;
|
||||
m_TimeValue.Hour = sysTime.wHour;
|
||||
m_TimeValue.Minute = sysTime.wMinute;
|
||||
m_TimeValue.Second = sysTime.wSecond;
|
||||
|
||||
DBComponent::CastleDB::UpdateCampState(m_DBComponent, GetCampID(), m_cState);
|
||||
DBComponent::CastleDB::UpdateCampTime(m_DBComponent, GetCampID(), Siege::TYPE_REMAIN_TIME, sysTime);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CCampDB::Destroy(unsigned long dwEnemyNation, bool bDeductFame)
|
||||
{
|
||||
m_cState = Siege::DESTROYED;
|
||||
m_dwHP = 0;
|
||||
m_cUpgradeStep = 0;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CCampDB::ChangeType(unsigned short wType)
|
||||
{
|
||||
if (Siege::COMPLETE == m_cState)
|
||||
{
|
||||
m_cState = Siege::CHANGING;
|
||||
m_cChangeTime = Siege::CAMP_CHANGING_TIME;
|
||||
m_wChangeType = wType;
|
||||
|
||||
SYSTEMTIME sysTime;
|
||||
GetLocalTime(&sysTime);
|
||||
|
||||
m_TimeValue.Year = sysTime.wYear;
|
||||
m_TimeValue.Month = sysTime.wMonth;
|
||||
m_TimeValue.Day = sysTime.wDay;
|
||||
m_TimeValue.Hour = sysTime.wHour;
|
||||
m_TimeValue.Minute = sysTime.wMinute;
|
||||
m_TimeValue.Second = sysTime.wSecond;
|
||||
|
||||
DBComponent::CastleDB::UpdateCampState(m_DBComponent, GetCampID(), m_cState);
|
||||
DBComponent::CastleDB::UpdateCampTime(m_DBComponent, GetCampID(), Siege::TYPE_REMAIN_TIME, sysTime);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CCampDB::UpdateLastUseTime(bool bInit)
|
||||
{
|
||||
CSiegeObjectDB::UpdateLastUseTime(bInit);
|
||||
|
||||
if (!bInit)
|
||||
{
|
||||
SYSTEMTIME sysTime;
|
||||
GetLocalTime(&sysTime);
|
||||
|
||||
DBComponent::CastleDB::UpdateCampTime(m_DBComponent, GetCampID(), Siege::TYPE_LAST_USE_TIME, sysTime);
|
||||
}
|
||||
}
|
||||
|
||||
void CCampDB::UpdateHP(unsigned long dwNowHP)
|
||||
{
|
||||
CSiegeObjectDB::UpdateHP(dwNowHP);
|
||||
|
||||
DBComponent::CastleDB::UpdateCampHP(m_DBComponent, GetCampID(), m_dwHP);
|
||||
}
|
||||
|
||||
bool CCampDB::ToStartKit()
|
||||
{
|
||||
m_cState = Siege::DESTROYING;
|
||||
|
||||
SYSTEMTIME sysTime;
|
||||
GetLocalTime(&sysTime);
|
||||
|
||||
m_TimeValue.Year = sysTime.wYear;
|
||||
m_TimeValue.Month = sysTime.wMonth;
|
||||
m_TimeValue.Day = sysTime.wDay;
|
||||
m_TimeValue.Hour = sysTime.wHour;
|
||||
m_TimeValue.Minute = sysTime.wMinute;
|
||||
m_TimeValue.Second = sysTime.wSecond;
|
||||
|
||||
DBComponent::CastleDB::UpdateCampState(m_DBComponent, GetCampID(), m_cState);
|
||||
DBComponent::CastleDB::UpdateCampTime(m_DBComponent, GetCampID(), Siege::TYPE_REMAIN_TIME, sysTime);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CCampDB::SetRight(CampRight campRight)
|
||||
{
|
||||
m_CampRight = campRight;
|
||||
DBComponent::CastleDB::UpdateCampRight(m_DBComponent, GetCampID(), reinterpret_cast<char*>(&m_CampRight), sizeof(CampRight));
|
||||
}
|
||||
|
||||
void CCampDB::SetMaterialNum(unsigned char cMaterial)
|
||||
{
|
||||
CSiegeObjectDB::SetMaterialNum(cMaterial);
|
||||
DBComponent::CastleDB::UpdateCampMaterial(m_DBComponent, GetCampID(), m_cMaterial);
|
||||
}
|
||||
|
||||
void CCampDB::UpdateRewardFame(int Fame)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
Guild::CGuildDB* lpGuild = static_cast<Guild::CGuildDB*>(
|
||||
Guild::CGuildDBMgr::GetInstance().GetGuild(m_dwGID));
|
||||
|
||||
if (lpGuild)
|
||||
{
|
||||
lpGuild->AddLoginedMemberFame( Guild::TYPE_VALUE, Fame );
|
||||
}
|
||||
}
|
||||
|
||||
Siege::eReturn CCampDB::Process()
|
||||
{
|
||||
CTime nowTime = CTime::GetCurrentTime();
|
||||
CTimeSpan timeSpan(0);
|
||||
|
||||
/* // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ּ<EFBFBD> ó<><C3B3>
|
||||
if (0 != m_LastUseTime.Year && Siege::DEVELOPING != m_cState)
|
||||
{
|
||||
CTime lastUseTime(m_LastUseTime.Year, m_LastUseTime.Month, m_LastUseTime.Day,
|
||||
m_LastUseTime.Hour, m_LastUseTime.Minute, m_LastUseTime.Second);
|
||||
|
||||
timeSpan = nowTime - lastUseTime;
|
||||
if (timeSpan.GetDays() > Siege::CAMP_LEAST_USE_TIME)
|
||||
{
|
||||
DestroyCamp();
|
||||
SendCampCmd(PktCampCmd::CAMP_DESTROY);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> ó<><C3B3>
|
||||
Guild::CGuildDB* lpGuild = static_cast<Guild::CGuildDB*>(
|
||||
Guild::CGuildDBMgr::GetInstance().GetGuild(m_dwGID));
|
||||
|
||||
if (lpGuild)
|
||||
{
|
||||
lpGuild->AddAllMemberFame( Siege::FAME_FOR_DESTROYED_CAMP );
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD>
|
||||
return Siege::RET_DESTROY_CAMP;
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
switch (m_cState)
|
||||
{
|
||||
case Siege::COMPLETE: // <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
{
|
||||
}
|
||||
break;
|
||||
|
||||
case Siege::DEVELOPING: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
if (0 != m_TimeValue.Year)
|
||||
{
|
||||
CTime developTime(m_TimeValue.Year, m_TimeValue.Month, m_TimeValue.Day,
|
||||
m_TimeValue.Hour, m_TimeValue.Minute, m_TimeValue.Second);
|
||||
|
||||
timeSpan = nowTime - developTime;
|
||||
if (timeSpan.GetTotalMinutes() >= Siege::CAMP_ENCAMPING_TIME)
|
||||
{
|
||||
Guild::CGuildDB* lpGuild = static_cast<Guild::CGuildDB*>(
|
||||
Guild::CGuildDBMgr::GetInstance().GetGuild( m_dwGID ));
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD>
|
||||
m_cState = Siege::COMPLETE;
|
||||
UpdateLastUseTime();
|
||||
|
||||
// DB<44><42> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
SYSTEMTIME sysTime;
|
||||
::memset(&sysTime, 0, sizeof(SYSTEMTIME));
|
||||
::memset(&m_TimeValue, 0, sizeof(TIME));
|
||||
|
||||
DBComponent::CastleDB::UpdateCampState(m_DBComponent, GetCampID(), m_cState);
|
||||
DBComponent::CastleDB::UpdateCampTime(m_DBComponent, GetCampID(), Siege::TYPE_REMAIN_TIME, sysTime);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// <20><EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
PktCampMessage pktCampMessage;
|
||||
memset(&pktCampMessage, 0, sizeof(PktCampMessage));
|
||||
|
||||
if (IsWorldWeapon())
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD>
|
||||
// <20><EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20><>ȣ, <20><><EFBFBD><EFBFBD> <20><>ȣ, <20><><EFBFBD><EFBFBD>
|
||||
pktCampMessage.m_cMsgCmd = PktCampMessage::MSGCMD_WEAPON_ENCAMP_END;
|
||||
pktCampMessage.m_dwCampID = GetCampID();
|
||||
pktCampMessage.m_dwGID = m_dwGID;
|
||||
pktCampMessage.m_cZone = m_cZone;
|
||||
pktCampMessage.m_bNotify = true;
|
||||
|
||||
if (NULL != lpGuild)
|
||||
{
|
||||
pktCampMessage.m_cNation = lpGuild->GetNation();
|
||||
}
|
||||
|
||||
if (PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage, 0, 0))
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD>
|
||||
// <20><EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20><>ȣ, <20><><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>
|
||||
pktCampMessage.m_cMsgCmd = PktCampMessage::MSGCMD_ENCAMP_END;
|
||||
pktCampMessage.m_dwCampID = GetCampID();
|
||||
pktCampMessage.m_dwGID = m_dwGID;
|
||||
pktCampMessage.m_cZone = m_cZone;
|
||||
pktCampMessage.m_bNotify = false;
|
||||
|
||||
if (PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage, 0, 0))
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage));
|
||||
}
|
||||
|
||||
memset(&pktCampMessage, 0, sizeof(PktCampMessage));
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD>
|
||||
// <20><EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20><>ȣ, <20><><EFBFBD><EFBFBD> <20≯<EFBFBD>, <20><><EFBFBD><EFBFBD>
|
||||
pktCampMessage.m_cMsgCmd = PktCampMessage::MSGCMD_ENCAMP_END;
|
||||
pktCampMessage.m_dwCampID = GetCampID();
|
||||
pktCampMessage.m_dwGID = m_dwGID;
|
||||
pktCampMessage.m_cZone = m_cZone;
|
||||
pktCampMessage.m_bNotify = true;
|
||||
|
||||
if (NULL != lpGuild)
|
||||
{
|
||||
strcpy(pktCampMessage.m_szGuildName, lpGuild->GetName());
|
||||
}
|
||||
|
||||
if (PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage, 0, 0))
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage));
|
||||
}
|
||||
}
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
|
||||
SendCampCmd(PktCampCmd::CAMP_BUILD_COMPLETE);
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>϶<EFBFBD> 10<31><30> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><DEBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
|
||||
if (0 < timeSpan.GetTotalMinutes() && m_dwOldTotalMinutes != timeSpan.GetTotalMinutes() &&
|
||||
0 == (timeSpan.GetTotalMinutes() % Siege::CAMP_ENCAMPING_INTERVAL))
|
||||
{
|
||||
m_dwOldTotalMinutes = static_cast<unsigned long>( timeSpan.GetTotalMinutes() );
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// <20><EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
PktCampMessage pktCampMessage;
|
||||
memset(&pktCampMessage, 0, sizeof(PktCampMessage));
|
||||
|
||||
if (IsWorldWeapon())
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
|
||||
// <20><EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20><>ȣ, <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD>, <20><><EFBFBD><EFBFBD>
|
||||
pktCampMessage.m_cMsgCmd = PktCampMessage::MSGCMD_WEAPON_ENCAMPING;
|
||||
pktCampMessage.m_dwCampID = GetCampID();
|
||||
pktCampMessage.m_dwGID = m_dwGID;
|
||||
pktCampMessage.m_cZone = m_cZone;
|
||||
pktCampMessage.m_cRemainTime = static_cast<unsigned char>(Siege::CAMP_ENCAMPING_TIME - timeSpan.GetTotalMinutes());
|
||||
pktCampMessage.m_bNotify = true;
|
||||
|
||||
if (PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage, 0, 0))
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
|
||||
// <20><EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20><>ȣ, <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD>, <20><><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>
|
||||
pktCampMessage.m_cMsgCmd = PktCampMessage::MSGCMD_ENCAMPING;
|
||||
pktCampMessage.m_dwCampID = GetCampID();
|
||||
pktCampMessage.m_dwGID = m_dwGID;
|
||||
pktCampMessage.m_cZone = m_cZone;
|
||||
pktCampMessage.m_cRemainTime = static_cast<unsigned char>(Siege::CAMP_ENCAMPING_TIME - timeSpan.GetTotalMinutes());
|
||||
pktCampMessage.m_bNotify = false;
|
||||
|
||||
if (PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage, 0, 0))
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage));
|
||||
}
|
||||
}
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case Siege::CANCELING: // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><>ŸƮŶ<C6AE><C5B6><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
{
|
||||
if (0 != m_TimeValue.Year)
|
||||
{
|
||||
CTime cancelTime(m_TimeValue.Year, m_TimeValue.Month, m_TimeValue.Day,
|
||||
m_TimeValue.Hour, m_TimeValue.Minute, m_TimeValue.Second);
|
||||
|
||||
timeSpan = nowTime - cancelTime;
|
||||
if (timeSpan.GetTotalMinutes() >= Siege::CAMP_CANCELING_TIME)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD>
|
||||
Cancel();
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// <20><EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
PktCampMessage pktCampMessage;
|
||||
memset(&pktCampMessage, 0, sizeof(PktCampMessage));
|
||||
|
||||
if (IsWorldWeapon())
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD>
|
||||
// <20><EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20><>ȣ, <20><><EFBFBD><EFBFBD>
|
||||
pktCampMessage.m_cMsgCmd = PktCampMessage::MSGCMD_WEAPON_CANCEL_END;
|
||||
pktCampMessage.m_dwCampID = GetCampID();
|
||||
pktCampMessage.m_dwGID = m_dwGID;
|
||||
pktCampMessage.m_cZone = m_cZone;
|
||||
pktCampMessage.m_bNotify = true;
|
||||
|
||||
if (PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage, 0, 0))
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD>
|
||||
// <20><EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20><>ȣ, <20><><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>
|
||||
pktCampMessage.m_cMsgCmd = PktCampMessage::MSGCMD_CANCEL_END;
|
||||
pktCampMessage.m_dwCampID = GetCampID();
|
||||
pktCampMessage.m_dwGID = m_dwGID;
|
||||
pktCampMessage.m_cZone = m_cZone;
|
||||
pktCampMessage.m_bNotify = false;
|
||||
|
||||
if (PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage, 0, 0))
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage));
|
||||
}
|
||||
}
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
|
||||
SendCampCmd(PktCampCmd::CAMP_CANCEL_COMPLETE);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> ó<><C3B3>
|
||||
Guild::CGuildDB* lpGuild = static_cast<Guild::CGuildDB*>(
|
||||
Guild::CGuildDBMgr::GetInstance().GetGuild(m_dwGID));
|
||||
|
||||
if (lpGuild)
|
||||
{
|
||||
lpGuild->AddGoldToMaster( Siege::GOLD_FOR_CANCEL_CAMP );
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD>
|
||||
return Siege::RET_DESTROY_CAMP;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case Siege::UPGRADING: // <20><><EFBFBD><EFBFBD><D7B7>̵<EFBFBD><CCB5><EFBFBD>
|
||||
{
|
||||
if (0 != m_TimeValue.Year)
|
||||
{
|
||||
CTime upgradeTime(m_TimeValue.Year, m_TimeValue.Month, m_TimeValue.Day,
|
||||
m_TimeValue.Hour, m_TimeValue.Minute, m_TimeValue.Second);
|
||||
|
||||
timeSpan = nowTime - upgradeTime;
|
||||
if (timeSpan.GetTotalMinutes() >= m_cUpgradeTime)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><D7B7>̵<EFBFBD> <20>Ϸ<EFBFBD>
|
||||
m_cState = Siege::COMPLETE;
|
||||
++m_cUpgradeStep;
|
||||
|
||||
// DB<44><42> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
SYSTEMTIME sysTime;
|
||||
::memset(&sysTime, 0, sizeof(SYSTEMTIME));
|
||||
::memset(&m_TimeValue, 0, sizeof(TIME));
|
||||
|
||||
DBComponent::CastleDB::UpdateCampState(m_DBComponent, GetCampID(), m_cState);
|
||||
DBComponent::CastleDB::UpdateCampUpgrade(m_DBComponent, GetCampID(), m_cUpgradeStep);
|
||||
DBComponent::CastleDB::UpdateCampTime(m_DBComponent, GetCampID(), Siege::TYPE_REMAIN_TIME, sysTime);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// <20><EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
PktCampMessage pktCampMessage;
|
||||
memset(&pktCampMessage, 0, sizeof(PktCampMessage));
|
||||
|
||||
if (IsWorldWeapon())
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><D7B7>̵<EFBFBD> <20>Ϸ<EFBFBD>
|
||||
// <20><EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20><>ȣ, <20><><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>
|
||||
pktCampMessage.m_cMsgCmd = PktCampMessage::MSGCMD_WEAPON_UPGRADE_END;
|
||||
pktCampMessage.m_dwCampID = GetCampID();
|
||||
pktCampMessage.m_dwGID = m_dwGID;
|
||||
pktCampMessage.m_cZone = m_cZone;
|
||||
pktCampMessage.m_bNotify = false;
|
||||
|
||||
if (PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage, 0, 0))
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><D7B7>̵<EFBFBD> <20>Ϸ<EFBFBD>
|
||||
// <20><EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20><>ȣ, <20><><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>
|
||||
pktCampMessage.m_cMsgCmd = PktCampMessage::MSGCMD_UPGRADE_END;
|
||||
pktCampMessage.m_dwCampID = GetCampID();
|
||||
pktCampMessage.m_dwGID = m_dwGID;
|
||||
pktCampMessage.m_cZone = m_cZone;
|
||||
pktCampMessage.m_bNotify = false;
|
||||
|
||||
if (PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage, 0, 0))
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage));
|
||||
}
|
||||
}
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
|
||||
SendCampCmd(PktCampCmd::CAMP_UPGRADE_COMPLETE, m_cUpgradeStep);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case Siege::REPARING: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
if (0 != m_TimeValue.Year)
|
||||
{
|
||||
CTime repairTime(m_TimeValue.Year, m_TimeValue.Month, m_TimeValue.Day,
|
||||
m_TimeValue.Hour, m_TimeValue.Minute, m_TimeValue.Second);
|
||||
|
||||
timeSpan = nowTime - repairTime;
|
||||
if (timeSpan.GetTotalSeconds() >= m_cRepairTime)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD>
|
||||
m_cState = Siege::COMPLETE;
|
||||
|
||||
// DB<44><42> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
SYSTEMTIME sysTime;
|
||||
::memset(&sysTime, 0, sizeof(SYSTEMTIME));
|
||||
::memset(&m_TimeValue, 0, sizeof(TIME));
|
||||
|
||||
DBComponent::CastleDB::UpdateCampState(m_DBComponent, GetCampID(), m_cState);
|
||||
DBComponent::CastleDB::UpdateCampTime(m_DBComponent, GetCampID(), Siege::TYPE_REMAIN_TIME, sysTime);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// <20><EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
PktCampMessage pktCampMessage;
|
||||
memset(&pktCampMessage, 0, sizeof(PktCampMessage));
|
||||
|
||||
if (IsWorldWeapon())
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD>
|
||||
// <20><EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20><>ȣ, <20><><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>
|
||||
pktCampMessage.m_cMsgCmd = PktCampMessage::MSGCMD_WEAPON_REPAIR_END;
|
||||
pktCampMessage.m_dwCampID = GetCampID();
|
||||
pktCampMessage.m_dwGID = m_dwGID;
|
||||
pktCampMessage.m_cZone = m_cZone;
|
||||
pktCampMessage.m_bNotify = false;
|
||||
|
||||
if (PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage, 0, 0))
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD>
|
||||
// <20><EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20><>ȣ, <20><><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>
|
||||
pktCampMessage.m_cMsgCmd = PktCampMessage::MSGCMD_REPAIR_END;
|
||||
pktCampMessage.m_dwCampID = GetCampID();
|
||||
pktCampMessage.m_dwGID = m_dwGID;
|
||||
pktCampMessage.m_cZone = m_cZone;
|
||||
pktCampMessage.m_bNotify = false;
|
||||
|
||||
if (PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage, 0, 0))
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage));
|
||||
}
|
||||
}
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
|
||||
SendCampCmd(PktCampCmd::CAMP_REPAIR_COMPLETE, m_dwRepairHP);
|
||||
m_dwRepairHP = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case Siege::DESTROYING: // <20><>ŸƮŶ<C6AE><C5B6><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
|
||||
{
|
||||
if (0 != m_TimeValue.Year)
|
||||
{
|
||||
CTime destroyTime(m_TimeValue.Year, m_TimeValue.Month, m_TimeValue.Day,
|
||||
m_TimeValue.Hour, m_TimeValue.Minute, m_TimeValue.Second);
|
||||
|
||||
timeSpan = nowTime - destroyTime;
|
||||
if (timeSpan.GetTotalMinutes() >= Siege::CAMP_TO_STARTKIT_TIME)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ı<EFBFBD> <20>Ϸ<EFBFBD>
|
||||
Destroy();
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// <20><EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
PktCampMessage pktCampMessage;
|
||||
memset(&pktCampMessage, 0, sizeof(PktCampMessage));
|
||||
|
||||
Guild::CGuildDB* lpGuild = static_cast<Guild::CGuildDB*>(
|
||||
Guild::CGuildDBMgr::GetInstance().GetGuild(m_dwGID));
|
||||
|
||||
short sFameForSelfDestroyCamp = Siege::FAME_FOR_SELF_DESTROY_CAMP;
|
||||
|
||||
if (IsWorldWeapon())
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ı<EFBFBD> <20>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
// <20><EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20><>ȣ, <20><><EFBFBD><EFBFBD> <20≯<EFBFBD>, <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>
|
||||
pktCampMessage.m_cMsgCmd = PktCampMessage::MSGCMD_WEAPON_SELF_DESTROY_END;
|
||||
pktCampMessage.m_dwCampID = GetCampID();
|
||||
pktCampMessage.m_dwGID = m_dwGID;
|
||||
pktCampMessage.m_cZone = m_cZone;
|
||||
pktCampMessage.m_bNotify = true;
|
||||
|
||||
if (NULL != lpGuild)
|
||||
{
|
||||
strcpy(pktCampMessage.m_szGuildName, lpGuild->GetName()); // <20><><EFBFBD><EFBFBD> <20≯<EFBFBD>
|
||||
pktCampMessage.m_cNation = lpGuild->GetNation();
|
||||
}
|
||||
|
||||
if (PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage, 0, 0))
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ı<EFBFBD> <20>Ϸ<EFBFBD>
|
||||
// <20><EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20><>ȣ, <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>
|
||||
pktCampMessage.m_cMsgCmd = PktCampMessage::MSGCMD_SELF_DESTROY_END;
|
||||
pktCampMessage.m_dwCampID = GetCampID();
|
||||
pktCampMessage.m_dwGID = m_dwGID;
|
||||
pktCampMessage.m_cZone = m_cZone;
|
||||
pktCampMessage.m_nValue1 = -(sFameForSelfDestroyCamp);
|
||||
pktCampMessage.m_nValue2 = Siege::GOLD_FOR_SELF_DESTROY_CAMP;
|
||||
pktCampMessage.m_bNotify = false;
|
||||
|
||||
if (PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage, 0, 0))
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage));
|
||||
}
|
||||
|
||||
memset(&pktCampMessage, 0, sizeof(PktCampMessage));
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ı<EFBFBD> <20>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
// <20><EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20><>ȣ, <20><><EFBFBD><EFBFBD> <20≯<EFBFBD>, <20><><EFBFBD><EFBFBD>
|
||||
pktCampMessage.m_cMsgCmd = PktCampMessage::MSGCMD_SELF_DESTROY_END;
|
||||
pktCampMessage.m_dwCampID = GetCampID();
|
||||
pktCampMessage.m_dwGID = m_dwGID;
|
||||
pktCampMessage.m_cZone = m_cZone;
|
||||
pktCampMessage.m_bNotify = true;
|
||||
|
||||
if (NULL != lpGuild)
|
||||
{
|
||||
strcpy(pktCampMessage.m_szGuildName, lpGuild->GetName()); // <20><><EFBFBD><EFBFBD> <20≯<EFBFBD>
|
||||
}
|
||||
|
||||
if (PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage, 0, 0))
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage));
|
||||
}
|
||||
}
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
|
||||
SendCampCmd(PktCampCmd::CAMP_TO_STARTKIT_COMPLETE);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> ó<><C3B3>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> ó<><C3B3>
|
||||
if (lpGuild)
|
||||
{
|
||||
lpGuild->AddAllMemberFame( Guild::TYPE_VALUE, sFameForSelfDestroyCamp );
|
||||
lpGuild->AddGoldToMaster( Siege::GOLD_FOR_SELF_DESTROY_CAMP );
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD>
|
||||
return Siege::RET_DESTROY_CAMP;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case Siege::CHANGING: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
if (0 != m_TimeValue.Year)
|
||||
{
|
||||
CTime changeTime(m_TimeValue.Year, m_TimeValue.Month, m_TimeValue.Day,
|
||||
m_TimeValue.Hour, m_TimeValue.Minute, m_TimeValue.Second);
|
||||
|
||||
timeSpan = nowTime - changeTime;
|
||||
if (timeSpan.GetTotalMinutes() >= m_cChangeTime)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ÿ<><C5B8> <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD>
|
||||
m_cState = Siege::COMPLETE;
|
||||
|
||||
// ä<><C3A4><EFBFBD>⿴<EFBFBD>ٸ<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ӽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
if (Siege::MINING_CAMP == m_wObjectType)
|
||||
{
|
||||
DBComponent::CastleDB::DeleteMiningCampMineralInfo(m_DBComponent, GetCampID(), Siege::ACCUMULATED_MINERAL);
|
||||
DBComponent::CastleDB::DeleteMiningCampMineralInfo(m_DBComponent, GetCampID(), Siege::TEMPORARY_MINERAL);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> DB <20><><EFBFBD><EFBFBD>
|
||||
if (Siege::CAMP_SHOP == m_wObjectType)
|
||||
{
|
||||
DBComponent::CastleDB::DeleteCampShopInfo(m_DBComponent, GetCampID());
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD> <20><><EFBFBD><EFBFBD> DB <20><><EFBFBD><EFBFBD>
|
||||
if (Siege::CAMP_SHOP == m_wChangeType)
|
||||
{
|
||||
DBComponent::CastleDB::InsertCampShopInfo(m_DBComponent, GetCampID());
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
SYSTEMTIME sysTime;
|
||||
::memset(&sysTime, 0, sizeof(SYSTEMTIME));
|
||||
::memset(&m_TimeValue, 0, sizeof(TIME));
|
||||
|
||||
DBComponent::CastleDB::UpdateCampState(m_DBComponent, GetCampID(), m_cState);
|
||||
DBComponent::CastleDB::UpdateCampType(m_DBComponent, GetCampID(), m_wChangeType);
|
||||
DBComponent::CastleDB::UpdateCampTime(m_DBComponent, GetCampID(), Siege::TYPE_REMAIN_TIME, sysTime);
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// <20><EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
PktCampMessage pktCampMessage;
|
||||
memset(&pktCampMessage, 0, sizeof(PktCampMessage));
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ÿ<><C5B8> <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD>
|
||||
// <20><EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20><>ȣ, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8>, <20><><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>
|
||||
pktCampMessage.m_cMsgCmd = PktCampMessage::MSGCMD_CHANGE_TYPE_END;
|
||||
pktCampMessage.m_dwCampID = GetCampID();
|
||||
pktCampMessage.m_dwGID = m_dwGID;
|
||||
pktCampMessage.m_cZone = m_cZone;
|
||||
pktCampMessage.m_nValue1 = m_wChangeType;
|
||||
pktCampMessage.m_bNotify = false;
|
||||
|
||||
if (PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage, 0, 0))
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage));
|
||||
}
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
|
||||
SendCampCmd(PktCampCmd::CAMP_CHANGE_COMPLETE, m_wChangeType);
|
||||
|
||||
return Siege::RET_CHANGE_TYPE;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return Siege::RET_OK;
|
||||
}
|
||||
|
||||
|
||||
bool CCampDB::SerializeOut(char* szBuffer_Out, unsigned short& usBufferSize_Out, unsigned long& dwCID_Out)
|
||||
{
|
||||
if (!szBuffer_Out)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
usBufferSize_Out = 0;
|
||||
dwCID_Out = m_dwCID;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
CampInfoDB* lpCampInfoDB = reinterpret_cast<CampInfoDB*>(szBuffer_Out);
|
||||
|
||||
lpCampInfoDB->m_dwCampID = GetCampID();
|
||||
lpCampInfoDB->m_dwGID = m_dwGID;
|
||||
lpCampInfoDB->m_dwHP = m_dwHP;
|
||||
lpCampInfoDB->m_cZone = m_cZone;
|
||||
lpCampInfoDB->m_cChannel = 0;
|
||||
lpCampInfoDB->m_wObjectType = m_wObjectType;
|
||||
lpCampInfoDB->m_cState = m_cState;
|
||||
lpCampInfoDB->m_cSubState = m_cSubState;
|
||||
lpCampInfoDB->m_cUpgradeStep = m_cUpgradeStep;
|
||||
lpCampInfoDB->m_TimeValue = m_TimeValue;
|
||||
lpCampInfoDB->m_LastUseTime = m_LastUseTime;
|
||||
::memcpy(lpCampInfoDB->m_szRight, m_CampRight.m_aryCampRight, CampRight::MAX_RIGHT_NUM);
|
||||
lpCampInfoDB->m_Pos.fPointX = m_Pos.m_fPointX;
|
||||
lpCampInfoDB->m_Pos.fPointY = m_Pos.m_fPointY;
|
||||
lpCampInfoDB->m_Pos.fPointZ = m_Pos.m_fPointZ;
|
||||
lpCampInfoDB->m_cMaterial = m_cMaterial;
|
||||
lpCampInfoDB->m_cSiegeCount = m_cSiegeCount;
|
||||
|
||||
usBufferSize_Out += sizeof(CampInfoDB);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
#ifndef _RYL_DBAGENT_CAMP_DB_H_
|
||||
#define _RYL_DBAGENT_CAMP_DB_H_
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "SiegeObjectDB.h"
|
||||
|
||||
using namespace Siege;
|
||||
|
||||
class CCampDB : public CSiegeObjectDB
|
||||
{
|
||||
public:
|
||||
virtual ~CCampDB();
|
||||
|
||||
// Process <20>Լ<EFBFBD>
|
||||
virtual Siege::eReturn Process();
|
||||
|
||||
// Cmd ó<><C3B3> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
|
||||
virtual bool CancelBuild(); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
virtual bool Cancel(); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD>
|
||||
virtual bool Upgrade(unsigned char cUpgradeTime, unsigned long dwUpgradeGold = 0, unsigned char cUpgradeType = Siege::NO_JEWEL);
|
||||
virtual bool Repair(unsigned long dwRepairHP, unsigned long dwRepairGold = 0);
|
||||
virtual bool Destroy(unsigned long dwEnemyNation = 0, bool bDeductFame = false); // <20>ı<EFBFBD> <20>Ϸ<EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ı<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ı<EFBFBD>)
|
||||
virtual bool ChangeType(unsigned short wType);
|
||||
|
||||
void UpdateRewardFame(int Fame);
|
||||
|
||||
void UpdateLastUseTime(bool bInit=false);
|
||||
void UpdateHP(unsigned long dwNowHP);
|
||||
bool ToStartKit();
|
||||
|
||||
unsigned short GetChangeType() const { return m_wChangeType; }
|
||||
|
||||
const CampRight& GetRight() const { return m_CampRight; }
|
||||
void SetRight(CampRight campRight); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
void SetMaterialNum(unsigned char cMaterial);
|
||||
|
||||
virtual bool SerializeOut(char* szBuffer_Out, unsigned short& usBufferSize_Out, unsigned long& dwCID_Out);
|
||||
|
||||
protected:
|
||||
|
||||
CCampDB(CDBComponent& DBComponent, const CampInfoDB& CampInfo);
|
||||
CCampDB(CDBComponent& DBComponent, unsigned long dwCampID, unsigned long dwGID,
|
||||
unsigned char cZone, unsigned char cChannel, Position Pos);
|
||||
|
||||
CampRight m_CampRight; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
unsigned short m_wChangeType;
|
||||
|
||||
unsigned long m_dwOldTotalMinutes;
|
||||
|
||||
friend class CSiegeObjectDBMgr;
|
||||
};
|
||||
|
||||
#endif _RYL_DBAGENT_CAMP_DB_H_
|
||||
@@ -0,0 +1,110 @@
|
||||
|
||||
#include "stdafx.h"
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
#include <DB/DBComponent.h>
|
||||
#include <Castle/CastleDBComponent.h>
|
||||
|
||||
#include <Network/Packet/WrapPacket.h>
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
#include <Network/Dispatch/GameDispatch.h>
|
||||
|
||||
#include <Community/Guild/GuildDBMgr.h>
|
||||
#include <Community/Guild/Guild.h>
|
||||
|
||||
#include "CampShopDB.h"
|
||||
|
||||
CCampShopDB::CCampShopDB(CDBComponent& DBComponent, const CampInfoDB& CampInfo)
|
||||
: CCampDB(DBComponent, CampInfo), m_dwItemContainerSize(0), m_cItemNum(0), m_dwTempSafe(0), m_cTax(0)
|
||||
{
|
||||
std::fill_n(m_aryItemContainer, int(CampShopInfoDB::MAX_CONTAINER_SIZE), 0);
|
||||
}
|
||||
|
||||
CCampShopDB::~CCampShopDB()
|
||||
{
|
||||
}
|
||||
|
||||
Siege::eReturn CCampShopDB::Process()
|
||||
{
|
||||
if (m_cSiegeCount >= Siege::CAMP_SHOP_TRANSFER_COUNT)
|
||||
{
|
||||
Guild::CGuild* lpGuild = Guild::CGuildDBMgr::GetInstance().GetGuild(m_dwGID);
|
||||
if (NULL != lpGuild)
|
||||
{
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// <20><EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
PktCampMessage pktCampMessage;
|
||||
::memset(&pktCampMessage, 0, sizeof(PktCampMessage));
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ͱ<EFBFBD> ȹ<><C8B9>
|
||||
// <20><EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20><>ȣ, <20><><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>, <20><><EFBFBD>ͱ<EFBFBD>
|
||||
pktCampMessage.m_cMsgCmd = PktCampMessage::MSGCMD_SHOP_GAIN_TAX;
|
||||
pktCampMessage.m_dwCampID = GetCampID();
|
||||
pktCampMessage.m_dwGID = GetGID();
|
||||
pktCampMessage.m_cZone = GetZone();
|
||||
pktCampMessage.m_bNotify = false;
|
||||
pktCampMessage.m_nValue1 = m_dwTempSafe;
|
||||
|
||||
if (PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage),
|
||||
CmdCampMessage, 0, PktBase::NO_SERVER_ERR))
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage));
|
||||
}
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
SendCampCmd(PktCampCmd::CAMP_SHOP_GAIN_TAX, m_dwTempSafe);
|
||||
|
||||
DETLOG3(g_Log, "GID:%10u / CurrentGuildGold:%u / TempSafeGold:%u / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><EFBFBD><D7B5><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ͱ<EFBFBD><CDB1><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ա<EFBFBD><D4B1>մϴ<D5B4>",
|
||||
lpGuild->GetGID(), lpGuild->GetGold(), m_dwTempSafe);
|
||||
|
||||
lpGuild->AddGold(m_dwTempSafe);
|
||||
m_dwTempSafe = 0;
|
||||
|
||||
SetSiegeCount(0);
|
||||
DBComponent::CastleDB::UpdateCampSiegeCount(m_DBComponent, GetCampID(), GetSiegeCount());
|
||||
}
|
||||
}
|
||||
|
||||
return CCampDB::Process();
|
||||
}
|
||||
|
||||
bool CCampShopDB::UpdateCampInfo(const char* aryItemBuffer, unsigned long dwItemBufferSize, unsigned char cItemNum,
|
||||
unsigned long dwTempSafe, unsigned char cTax)
|
||||
{
|
||||
return DBComponent::CastleDB::UpdateCampShopInfo(m_DBComponent, GetCampID(),
|
||||
aryItemBuffer, dwItemBufferSize, cItemNum, dwTempSafe, cTax);
|
||||
}
|
||||
|
||||
bool CCampShopDB::SerializeOut(char* szBuffer_Out, unsigned short& usBufferSize_Out, unsigned long& dwCID_Out)
|
||||
{
|
||||
if (true == CCampDB::SerializeOut(szBuffer_Out, usBufferSize_Out, dwCID_Out))
|
||||
{
|
||||
char* lpBuffer = szBuffer_Out + usBufferSize_Out;
|
||||
if (NULL == lpBuffer)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
CampShopInfo* lpCampShopInfo = reinterpret_cast<CampShopInfo*>(lpBuffer);
|
||||
|
||||
lpCampShopInfo->m_dwTempSafe = m_dwTempSafe;
|
||||
lpCampShopInfo->m_cTax = m_cTax;
|
||||
lpCampShopInfo->m_dwBufferSize = m_dwItemContainerSize;
|
||||
lpCampShopInfo->m_cItemNum = m_cItemNum;
|
||||
|
||||
unsigned short wSize = static_cast<unsigned short>(m_dwItemContainerSize + sizeof(unsigned long) * m_cItemNum);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
char* lpItemBuffer = reinterpret_cast<char*>(lpCampShopInfo + 1);
|
||||
std::copy(m_aryItemContainer, m_aryItemContainer + wSize, lpItemBuffer);
|
||||
|
||||
usBufferSize_Out += sizeof(CampShopInfo) + wSize;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
#ifndef _RYL_DBAGENT_CAMP_SHOP_H_
|
||||
#define _RYL_DBAGENT_CAMP_SHOP_H_
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CampDB.h"
|
||||
|
||||
using namespace Siege;
|
||||
|
||||
class CCampShopDB : public CCampDB
|
||||
{
|
||||
public:
|
||||
|
||||
virtual ~CCampShopDB();
|
||||
|
||||
// Process <20>Լ<EFBFBD>
|
||||
virtual Siege::eReturn Process();
|
||||
|
||||
void SetItemContainer(const char* aryContainer, unsigned long dwContainerSize, unsigned char cItemNum)
|
||||
{
|
||||
std::copy(aryContainer, aryContainer + dwContainerSize + sizeof(unsigned long) * cItemNum, m_aryItemContainer);
|
||||
m_dwItemContainerSize = dwContainerSize;
|
||||
m_cItemNum = cItemNum;
|
||||
}
|
||||
|
||||
void SetTempSafe(unsigned long dwTempSafe) { m_dwTempSafe = dwTempSafe; }
|
||||
void SetTax(unsigned char cTax) { m_cTax = cTax; }
|
||||
|
||||
bool UpdateCampInfo(const char* aryItemBuffer, unsigned long dwItemBufferSize, unsigned char cItemNum,
|
||||
unsigned long dwTempSafe, unsigned char cTax);
|
||||
|
||||
bool SerializeOut(char* szBuffer_Out, unsigned short& usBufferSize_Out, unsigned long& dwCID_Out);
|
||||
|
||||
|
||||
private:
|
||||
|
||||
CCampShopDB(CDBComponent& DBComponent, const CampInfoDB& CampInfo);
|
||||
|
||||
unsigned char m_aryItemContainer[CampShopInfoDB::MAX_CONTAINER_SIZE]; // <20>Ǹ<EFBFBD><C7B8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
unsigned long m_dwItemContainerSize; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
unsigned char m_cItemNum; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
unsigned long m_dwTempSafe; // <20>ӽ<EFBFBD> <20>ݰ<EFBFBD>
|
||||
unsigned char m_cTax; // <20><><EFBFBD><EFBFBD>
|
||||
|
||||
friend class CSiegeObjectDBMgr;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,283 @@
|
||||
#include "stdafx.h"
|
||||
#include "CastleArmsDB.h"
|
||||
#include "SiegeObjectDBMgr.h"
|
||||
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
#include <Network/Packet/WrapPacket.h>
|
||||
#include <Network/Packet/PacketStruct/ServerInfo.h>
|
||||
#include <Network/Dispatch/GameDispatch.h>
|
||||
|
||||
#include <Community/Guild/GuildDB.h>
|
||||
#include <Community/Guild/GuildDBMgr.h>
|
||||
|
||||
#include <Castle/Castle.h>
|
||||
#include <Castle/CastleMgr.h>
|
||||
|
||||
#include <DB/DBComponent.h>
|
||||
#include <Castle/CastleDBComponent.h>
|
||||
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
|
||||
#include <atltime.h>
|
||||
|
||||
|
||||
CCastleArmsDB::CCastleArmsDB(CDBComponent& DBComponent, const CastleObjectInfoDB& CastleObject)
|
||||
: CSiegeObjectDB(DBComponent, CastleObject)
|
||||
{
|
||||
}
|
||||
|
||||
CCastleArmsDB::~CCastleArmsDB()
|
||||
{
|
||||
}
|
||||
|
||||
bool CCastleArmsDB::Build(unsigned short wType, unsigned char cDevelopTime, unsigned long dwDevelopGold, unsigned long dwOwnerID)
|
||||
{
|
||||
if (Siege::CASTLE_ARMS_NPC != m_wObjectType) return false;
|
||||
|
||||
if (Siege::COMPLETE == m_cState)
|
||||
{
|
||||
m_wObjectType = wType;
|
||||
m_cState = Siege::DEVELOPING;
|
||||
m_cUpgradeStep = 0;
|
||||
m_cDevelopTime = cDevelopTime;
|
||||
m_dwOwnerID = dwOwnerID;
|
||||
|
||||
SYSTEMTIME sysTime;
|
||||
GetLocalTime(&sysTime);
|
||||
|
||||
m_TimeValue.Year = sysTime.wYear;
|
||||
m_TimeValue.Month = sysTime.wMonth;
|
||||
m_TimeValue.Day = sysTime.wDay;
|
||||
m_TimeValue.Hour = sysTime.wHour;
|
||||
m_TimeValue.Minute = sysTime.wMinute;
|
||||
m_TimeValue.Second = sysTime.wSecond;
|
||||
|
||||
DBComponent::CastleDB::UpdateCastleObjectType(m_DBComponent, m_dwCID, wType, m_dwOwnerID);
|
||||
DBComponent::CastleDB::UpdateCastleObjectState(m_DBComponent, m_dwCID, m_cState, m_cSubState);
|
||||
DBComponent::CastleDB::UpdateCastleObjectTime(m_DBComponent, m_dwCID, sysTime);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CCastleArmsDB::Upgrade(unsigned char cUpgradeTime, unsigned long dwUpgradeGold, unsigned char cUpgradeType)
|
||||
{
|
||||
if ( !IsCastleArms() )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (Siege::COMPLETE == m_cState)
|
||||
{
|
||||
m_cState = Siege::UPGRADING;
|
||||
|
||||
SYSTEMTIME sysTime;
|
||||
GetLocalTime(&sysTime);
|
||||
m_cUpgradeTime = cUpgradeTime;
|
||||
|
||||
// CASTLE_TODO : <20><><EFBFBD><EFBFBD> <20>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
|
||||
// // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> â<><C3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
// Guild::CGuildDB* lpGuild = static_cast<Guild::CGuildDB*>(
|
||||
// Guild::CGuildDBMgr::GetInstance().GetGuild(m_dwGID));
|
||||
//
|
||||
// if (lpGuild)
|
||||
// {
|
||||
// lpGuild->DeductGold(dwUpgradeGold);
|
||||
// }
|
||||
|
||||
m_TimeValue.Year = sysTime.wYear;
|
||||
m_TimeValue.Month = sysTime.wMonth;
|
||||
m_TimeValue.Day = sysTime.wDay;
|
||||
m_TimeValue.Hour = sysTime.wHour;
|
||||
m_TimeValue.Minute = sysTime.wMinute;
|
||||
m_TimeValue.Second = sysTime.wSecond;
|
||||
|
||||
DBComponent::CastleDB::UpdateCastleObjectState(m_DBComponent, m_dwCID, m_cState, m_cSubState);
|
||||
DBComponent::CastleDB::UpdateCastleObjectTime(m_DBComponent, m_dwCID, sysTime);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CCastleArmsDB::Repair(unsigned long dwRepairHP, unsigned long dwRepairGold)
|
||||
{
|
||||
if ( !IsCastleArms() )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (Siege::COMPLETE == m_cState)
|
||||
{
|
||||
m_cState = Siege::REPARING;
|
||||
m_dwRepairHP = dwRepairHP;
|
||||
m_cRepairTime = Siege::CASTLE_ARMS_REPAIR_TIME;
|
||||
|
||||
SYSTEMTIME sysTime;
|
||||
GetLocalTime(&sysTime);
|
||||
|
||||
m_TimeValue.Year = sysTime.wYear;
|
||||
m_TimeValue.Month = sysTime.wMonth;
|
||||
m_TimeValue.Day = sysTime.wDay;
|
||||
m_TimeValue.Hour = sysTime.wHour;
|
||||
m_TimeValue.Minute = sysTime.wMinute;
|
||||
m_TimeValue.Second = sysTime.wSecond;
|
||||
|
||||
DBComponent::CastleDB::UpdateCastleObjectState(m_DBComponent, m_dwCID, m_cState, m_cSubState);
|
||||
DBComponent::CastleDB::UpdateCastleObjectTime(m_DBComponent, m_dwCID, sysTime);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CCastleArmsDB::Destroy(unsigned long dwEnemyNation, bool bDeductFame)
|
||||
{
|
||||
if ( !IsCastleArms() || Siege::CASTLE_ARMS_NPC == m_wObjectType )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
m_wObjectType = Siege::CASTLE_ARMS_NPC;
|
||||
m_cState = Siege::COMPLETE;
|
||||
m_cUpgradeStep = 0;
|
||||
m_dwHP = 0;
|
||||
m_dwOwnerID = 0;
|
||||
|
||||
DBComponent::CastleDB::UpdateCastleObjectType(m_DBComponent, m_dwCID, m_wObjectType, m_dwOwnerID);
|
||||
DBComponent::CastleDB::UpdateCastleObjectState(m_DBComponent, m_dwCID, m_cState, m_cSubState);
|
||||
DBComponent::CastleDB::UpdateCastleObjectUpgrade(m_DBComponent, m_dwCID, m_cUpgradeStep, m_cUpgradeType);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CCastleArmsDB::UpdateLastUseTime(bool bInit)
|
||||
{
|
||||
CSiegeObjectDB::UpdateLastUseTime(bInit);
|
||||
|
||||
if (!bInit)
|
||||
{
|
||||
SYSTEMTIME sysTime;
|
||||
GetLocalTime(&sysTime);
|
||||
|
||||
DBComponent::CastleDB::UpdateCastleObjectLastUseTime(m_DBComponent, m_dwCID, sysTime);
|
||||
}
|
||||
}
|
||||
|
||||
void CCastleArmsDB::UpdateHP(unsigned long dwNowHP)
|
||||
{
|
||||
CSiegeObjectDB::UpdateHP(dwNowHP);
|
||||
|
||||
DBComponent::CastleDB::UpdateCastleObjectHP(m_DBComponent, m_dwCID, m_dwHP);
|
||||
}
|
||||
|
||||
Siege::eReturn CCastleArmsDB::Process()
|
||||
{
|
||||
CTime nowTime = CTime::GetCurrentTime();
|
||||
CTimeSpan timeSpan(0);
|
||||
|
||||
switch (m_cState)
|
||||
{
|
||||
case Siege::COMPLETE: // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD><CFB7><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD>
|
||||
{
|
||||
if (0 != m_LastUseTime.Year && Siege::CASTLE_ARMS_NPC != m_wObjectType)
|
||||
{
|
||||
CTime lastUseTime(m_LastUseTime.Year, m_LastUseTime.Month, m_LastUseTime.Day,
|
||||
m_LastUseTime.Hour, m_LastUseTime.Minute, m_LastUseTime.Second);
|
||||
|
||||
timeSpan = nowTime - lastUseTime;
|
||||
if (timeSpan.GetTotalMinutes() >= Siege::CASTLE_ARMS_LEAST_USE_TIME)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20>ı<EFBFBD>
|
||||
Destroy();
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
|
||||
SendCastleCmd(0, PktCastleCmd::CASTLE_DESTROY_ARMS);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case Siege::DEVELOPING: // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
if (0 != m_TimeValue.Year)
|
||||
{
|
||||
CTime developTime(m_TimeValue.Year, m_TimeValue.Month, m_TimeValue.Day,
|
||||
m_TimeValue.Hour, m_TimeValue.Minute, m_TimeValue.Second);
|
||||
|
||||
timeSpan = nowTime - developTime;
|
||||
if (timeSpan.GetTotalMinutes() >= m_cDevelopTime)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD>
|
||||
m_cState = Siege::COMPLETE;
|
||||
|
||||
DBComponent::CastleDB::UpdateCastleObjectState(m_DBComponent, m_dwCID, m_cState, m_cSubState);
|
||||
|
||||
UpdateLastUseTime();
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
|
||||
SendCastleCmd(m_wObjectType, PktCastleCmd::CASTLE_CREATE_ARMS_COMPLETE);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case Siege::UPGRADING: // <20><><EFBFBD><EFBFBD><D7B7>̵<EFBFBD><CCB5><EFBFBD>
|
||||
{
|
||||
if (0 != m_TimeValue.Year)
|
||||
{
|
||||
CTime upgradeTime(m_TimeValue.Year, m_TimeValue.Month, m_TimeValue.Day,
|
||||
m_TimeValue.Hour, m_TimeValue.Minute, m_TimeValue.Second);
|
||||
|
||||
timeSpan = nowTime - upgradeTime;
|
||||
if (timeSpan.GetTotalMinutes() >= m_cUpgradeTime)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD>
|
||||
m_cState = Siege::COMPLETE;
|
||||
++m_cUpgradeStep;
|
||||
|
||||
DBComponent::CastleDB::UpdateCastleObjectState(m_DBComponent, m_dwCID, m_cState, m_cSubState);
|
||||
DBComponent::CastleDB::UpdateCastleObjectUpgrade(m_DBComponent, m_dwCID, m_cUpgradeStep, m_cUpgradeType);
|
||||
|
||||
UpdateLastUseTime();
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
|
||||
SendCastleCmd(m_cUpgradeStep, PktCastleCmd::CASTLE_UPGRADE_ARMS_COMPLETE);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case Siege::REPARING: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
if (0 != m_TimeValue.Year)
|
||||
{
|
||||
CTime repairTime(m_TimeValue.Year, m_TimeValue.Month, m_TimeValue.Day,
|
||||
m_TimeValue.Hour, m_TimeValue.Minute, m_TimeValue.Second);
|
||||
|
||||
timeSpan = nowTime - repairTime;
|
||||
if (timeSpan.GetTotalMinutes() >= m_cRepairTime)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD>
|
||||
m_cState = Siege::COMPLETE;
|
||||
|
||||
DBComponent::CastleDB::UpdateCastleObjectState(m_DBComponent, m_dwCID, m_cState, m_cSubState);
|
||||
|
||||
UpdateLastUseTime();
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
|
||||
SendCastleCmd(m_dwRepairHP, PktCastleCmd::CASTLE_REPAIR_ARMS_COMPLETE);
|
||||
m_dwRepairHP = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return Siege::RET_OK;
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
#ifndef _RYL_DBAGENT_CASTLE_ARMS_DB_H_
|
||||
#define _RYL_DBAGENT_CASTLE_ARMS_DB_H_
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "SiegeObjectDB.h"
|
||||
|
||||
using namespace Siege;
|
||||
|
||||
class CCastleArmsDB : public CSiegeObjectDB
|
||||
{
|
||||
public:
|
||||
virtual ~CCastleArmsDB();
|
||||
|
||||
// Process <20>Լ<EFBFBD>
|
||||
Siege::eReturn Process();
|
||||
|
||||
// Cmd ó<><C3B3> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
|
||||
bool Build(unsigned short wType, unsigned char cDevelopTime, unsigned long dwDevelopGold = 0, unsigned long dwOwnerID = 0);
|
||||
bool Upgrade(unsigned char cUpgradeTime, unsigned long dwUpgradeGold = 0, unsigned char cUpgradeType = Siege::NO_JEWEL);
|
||||
bool Repair(unsigned long dwRepairHP, unsigned long dwRepairGold = 0);
|
||||
bool Destroy(unsigned long dwEnemyNation = 0, bool bDeductFame = false);
|
||||
|
||||
void UpdateLastUseTime(bool bInit=false);
|
||||
void UpdateHP(unsigned long dwNowHP);
|
||||
|
||||
private:
|
||||
|
||||
CCastleArmsDB(CDBComponent& DBComponent, const CastleObjectInfoDB& CastleObject);
|
||||
|
||||
friend class CSiegeObjectDBMgr;
|
||||
};
|
||||
|
||||
#endif _RYL_DBAGENT_CASTLE_ARMS_DB_H_
|
||||
@@ -0,0 +1,232 @@
|
||||
#include "stdafx.h"
|
||||
#include "CastleEmblemDB.h"
|
||||
#include "SiegeObjectDBMgr.h"
|
||||
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
#include <Network/Packet/WrapPacket.h>
|
||||
#include <Network/Packet/PacketStruct/ServerInfo.h>
|
||||
#include <Network/Dispatch/GameDispatch.h>
|
||||
|
||||
#include <Community/Guild/GuildDB.h>
|
||||
#include <Community/Guild/GuildDBMgr.h>
|
||||
|
||||
#include <Castle/CastleDB.h>
|
||||
#include <Castle/CastleDBMgr.h>
|
||||
|
||||
#include <DB/DBComponent.h>
|
||||
#include <Castle/CastleDBComponent.h>
|
||||
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
|
||||
#include <atltime.h>
|
||||
|
||||
#include <GameTime/GameTimeDBMgr.h>
|
||||
|
||||
|
||||
|
||||
CCastleEmblemDB::CCastleEmblemDB(CDBComponent& DBComponent, const CastleObjectInfoDB& CastleObject)
|
||||
: CSiegeObjectDB(DBComponent, CastleObject), m_cEnemyNation(0)
|
||||
{
|
||||
m_cSubState = Siege::MINE;
|
||||
}
|
||||
|
||||
CCastleEmblemDB::~CCastleEmblemDB()
|
||||
{
|
||||
}
|
||||
|
||||
bool CCastleEmblemDB::Upgrade(unsigned char cUpgradeTime, unsigned long dwUpgradeGold, unsigned char cUpgradeType)
|
||||
{
|
||||
if (Siege::COMPLETE == m_cState)
|
||||
{
|
||||
if (Siege::MAX_EMBLEM_UPGRADE == m_cUpgradeStep) return false;
|
||||
|
||||
m_cState = Siege::UPGRADING;
|
||||
if (0 == m_cUpgradeStep) m_cUpgradeType = cUpgradeType;
|
||||
m_cUpgradeTime = cUpgradeTime;
|
||||
|
||||
SYSTEMTIME sysTime;
|
||||
GetLocalTime(&sysTime);
|
||||
|
||||
m_TimeValue.Year = sysTime.wYear;
|
||||
m_TimeValue.Month = sysTime.wMonth;
|
||||
m_TimeValue.Day = sysTime.wDay;
|
||||
m_TimeValue.Hour = sysTime.wHour;
|
||||
m_TimeValue.Minute = sysTime.wMinute;
|
||||
m_TimeValue.Second = sysTime.wSecond;
|
||||
|
||||
DBComponent::CastleDB::UpdateCastleObjectState(m_DBComponent, m_dwCID, m_cState, m_cSubState);
|
||||
DBComponent::CastleDB::UpdateCastleObjectTime(m_DBComponent, m_dwCID, sysTime);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CCastleEmblemDB::Destroy(unsigned long dwEnemyNation, bool bDeductFame)
|
||||
{
|
||||
m_cState = Siege::DEVELOPING;
|
||||
m_cUpgradeStep = 0;
|
||||
m_cUpgradeType = Siege::NO_JEWEL;
|
||||
|
||||
if (m_cSubState == Siege::ENEMY)
|
||||
{
|
||||
m_cSubState = Siege::MINE;
|
||||
m_cEnemyNation = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_cSubState = Siege::ENEMY;
|
||||
m_cEnemyNation = (unsigned char)dwEnemyNation;
|
||||
}
|
||||
|
||||
SYSTEMTIME sysTime;
|
||||
GetLocalTime(&sysTime);
|
||||
|
||||
m_TimeValue.Year = sysTime.wYear;
|
||||
m_TimeValue.Month = sysTime.wMonth;
|
||||
m_TimeValue.Day = sysTime.wDay;
|
||||
m_TimeValue.Hour = sysTime.wHour;
|
||||
m_TimeValue.Minute = sysTime.wMinute;
|
||||
m_TimeValue.Second = sysTime.wSecond;
|
||||
|
||||
DBComponent::CastleDB::UpdateCastleObjectState(m_DBComponent, m_dwCID, m_cState, Siege::MINE);
|
||||
DBComponent::CastleDB::UpdateCastleObjectUpgrade(m_DBComponent, m_dwCID, m_cUpgradeStep, m_cUpgradeType);
|
||||
DBComponent::CastleDB::UpdateCastleObjectTime(m_DBComponent, m_dwCID, sysTime);
|
||||
|
||||
// <20><>¡<EFBFBD><C2A1><EFBFBD><EFBFBD> <20>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
Castle::CCastleDB* lpCastle = Castle::CCastleDBMgr::GetInstance().GetCastle(m_dwCampOrCastleID);
|
||||
if (0 != lpCastle)
|
||||
{
|
||||
CSiegeObjectDB* lpGate = lpCastle->GetCastleGate();
|
||||
if (0 != lpGate && Siege::DESTROYED != lpGate->GetState())
|
||||
{
|
||||
lpGate->Destroy();
|
||||
lpGate->SendCastleCmd(0, PktCastleCmd::CASTLE_DESTROY_GATE);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CCastleEmblemDB::UpdateHP(unsigned long dwNowHP)
|
||||
{
|
||||
CSiegeObjectDB::UpdateHP(dwNowHP);
|
||||
|
||||
DBComponent::CastleDB::UpdateCastleObjectHP(m_DBComponent, m_dwCID, m_dwHP);
|
||||
}
|
||||
|
||||
|
||||
Siege::eReturn CCastleEmblemDB::Process()
|
||||
{
|
||||
CTime nowTime = CTime::GetCurrentTime();
|
||||
CTimeSpan timeSpan(0);
|
||||
|
||||
switch (m_cState)
|
||||
{
|
||||
case Siege::COMPLETE: // <20><>ȯ <20>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
{
|
||||
}
|
||||
break;
|
||||
|
||||
case Siege::DEVELOPING: // <20><>ȯ<EFBFBD><C8AF>
|
||||
{
|
||||
if (0 != m_TimeValue.Year)
|
||||
{
|
||||
CTime summonTime(m_TimeValue.Year, m_TimeValue.Month, m_TimeValue.Day,
|
||||
m_TimeValue.Hour, m_TimeValue.Minute, m_TimeValue.Second);
|
||||
|
||||
timeSpan = nowTime - summonTime;
|
||||
if (timeSpan.GetTotalMinutes() >= Siege::EMBLEM_SUMMON_TIME)
|
||||
{
|
||||
// <20><> <20><>¡<EFBFBD><C2A1> <20><>ȯ <20>Ϸ<EFBFBD>
|
||||
m_cState = Siege::COMPLETE;
|
||||
|
||||
DBComponent::CastleDB::UpdateCastleObjectState(m_DBComponent, m_dwCID, m_cState, Siege::MINE);
|
||||
|
||||
if (m_cSubState == Siege::MINE)
|
||||
{
|
||||
// <20>Ʊ<EFBFBD><C6B1><EFBFBD> <20><>ȯ <20>Ϸ<EFBFBD>
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
|
||||
// [Out] dwValue1 : SubState (<28>Ʊ<EFBFBD><C6B1><EFBFBD> <20><>ȯ<EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD> <20><><EFBFBD><EFBFBD>)
|
||||
SendCastleCmd(m_cSubState, PktCastleCmd::CASTLE_SUMMON_EMBLEM_COMPLETE);
|
||||
|
||||
Castle::CCastleDB* lpCastle = Castle::CCastleDBMgr::GetInstance().GetCastle( GetCastleID() );
|
||||
|
||||
if(lpCastle)
|
||||
{
|
||||
lpCastle->ChangeCastleMaster(static_cast<unsigned char>(lpCastle->GetNation()));
|
||||
|
||||
SendCastleCmd(lpCastle->GetNation(), PktCastleCmd::CASTLE_CHANGE_MASTER);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ <20>Ϸ<EFBFBD>.. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
Castle::CCastleDB* lpCastle = Castle::CCastleDBMgr::GetInstance().GetCastle( GetCastleID() );
|
||||
|
||||
if (lpCastle)
|
||||
{
|
||||
if(CGameTimeDBMgr::GetInstance().IsSiegeWarTime())
|
||||
{
|
||||
// CASTLE_TODO : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
|
||||
// CSiegeObjectDBMgr::GetInstance().DestroyCamp(m_dwGID);
|
||||
lpCastle->ChangeCastleMaster(m_cEnemyNation);
|
||||
m_cSubState = Siege::MINE;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
|
||||
// [Out] dwValue1 : <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
SendCastleCmd(m_cEnemyNation, PktCastleCmd::CASTLE_CHANGE_MASTER);
|
||||
}
|
||||
else // <20><><EFBFBD><EFBFBD><EFBFBD>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD><C8AF> <20>Ϸ<EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD> <20>ʴ´<CAB4>.
|
||||
{
|
||||
unsigned char cNation = Creature::STATELESS;
|
||||
|
||||
if(m_cEnemyNation!=Creature::STATELESS)
|
||||
{
|
||||
cNation = (m_cEnemyNation==Creature::KARTERANT) ? Creature::MERKADIA : Creature::KARTERANT;
|
||||
}
|
||||
|
||||
lpCastle->ChangeCastleMaster(cNation);
|
||||
m_cSubState = Siege::MINE;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
|
||||
// [Out] dwValue1 : <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
SendCastleCmd(cNation, PktCastleCmd::CASTLE_CHANGE_MASTER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case Siege::UPGRADING: // <20><><EFBFBD><EFBFBD><D7B7>̵<EFBFBD><CCB5><EFBFBD>
|
||||
{
|
||||
if (0 != m_TimeValue.Year)
|
||||
{
|
||||
CTime upgradeTime(m_TimeValue.Year, m_TimeValue.Month, m_TimeValue.Day,
|
||||
m_TimeValue.Hour, m_TimeValue.Minute, m_TimeValue.Second);
|
||||
|
||||
timeSpan = nowTime - upgradeTime;
|
||||
if (timeSpan.GetTotalMinutes() >= m_cUpgradeTime)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><D7B7>̵<EFBFBD> <20>Ϸ<EFBFBD>
|
||||
m_cState = Siege::COMPLETE;
|
||||
++m_cUpgradeStep;
|
||||
|
||||
DBComponent::CastleDB::UpdateCastleObjectState(m_DBComponent, m_dwCID, m_cState, m_cSubState);
|
||||
DBComponent::CastleDB::UpdateCastleObjectUpgrade(m_DBComponent, m_dwCID, m_cUpgradeStep, m_cUpgradeType);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
|
||||
// [In/Out] dwValue1 : <20><><EFBFBD><EFBFBD><D7B7>̵<EFBFBD> <20>ܰ<EFBFBD>
|
||||
SendCastleCmd(m_cUpgradeStep, PktCastleCmd::CASTLE_UPGRADE_EMBLEM_COMPLETE);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return Siege::RET_OK;
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
#ifndef _RYL_DBAGENT_CASTLE_EMBLEM_DB_H_
|
||||
#define _RYL_DBAGENT_CASTLE_EMBLEM_DB_H_
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "SiegeObjectDB.h"
|
||||
|
||||
using namespace Siege;
|
||||
|
||||
class CCastleEmblemDB : public CSiegeObjectDB
|
||||
{
|
||||
public:
|
||||
virtual ~CCastleEmblemDB();
|
||||
|
||||
// Process <20>Լ<EFBFBD>
|
||||
Siege::eReturn Process();
|
||||
|
||||
// Cmd ó<><C3B3> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
|
||||
bool Upgrade(unsigned char cUpgradeTime, unsigned long dwUpgradeGold = 0, unsigned char cUpgradeType = Siege::NO_JEWEL);
|
||||
bool Destroy(unsigned long dwEnemyNation = 0, bool bDeductFame = false);
|
||||
|
||||
void UpdateHP(unsigned long dwNowHP);
|
||||
|
||||
private:
|
||||
|
||||
CCastleEmblemDB(CDBComponent& DBComponent, const CastleObjectInfoDB& CastleObject);
|
||||
|
||||
unsigned char m_cEnemyNation; // Nation : <20><> <20><>¡<EFBFBD><C2A1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20>μ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ID
|
||||
|
||||
friend class CSiegeObjectDBMgr;
|
||||
};
|
||||
|
||||
#endif _RYL_DBAGENT_CASTLE_EMBLEM_DB_H_
|
||||
@@ -0,0 +1,279 @@
|
||||
#include "stdafx.h"
|
||||
#include "CastleGateDB.h"
|
||||
#include "SiegeObjectDBMgr.h"
|
||||
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
#include <Network/Packet/WrapPacket.h>
|
||||
#include <Network/Packet/PacketStruct/ServerInfo.h>
|
||||
#include <Network/Dispatch/GameDispatch.h>
|
||||
|
||||
#include <Community/Guild/GuildDB.h>
|
||||
#include <Community/Guild/GuildDBMgr.h>
|
||||
|
||||
#include <Castle/Castle.h>
|
||||
#include <Castle/CastleMgr.h>
|
||||
|
||||
#include <DB/DBComponent.h>
|
||||
#include <Castle/CastleDBComponent.h>
|
||||
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
|
||||
#include <atltime.h>
|
||||
|
||||
|
||||
CCastleGateDB::CCastleGateDB(CDBComponent& DBComponent, const CastleObjectInfoDB& CastleObject)
|
||||
: CSiegeObjectDB(DBComponent, CastleObject)
|
||||
{
|
||||
}
|
||||
|
||||
CCastleGateDB::~CCastleGateDB()
|
||||
{
|
||||
}
|
||||
|
||||
bool CCastleGateDB::Upgrade(unsigned char cUpgradeTime, unsigned long dwUpgradeGold, unsigned char cUpgradeType)
|
||||
{
|
||||
if (Siege::COMPLETE == m_cState)
|
||||
{
|
||||
if (Siege::MAX_UPGRADE_NUM == m_cUpgradeStep) return false;
|
||||
|
||||
m_cState = Siege::UPGRADING;
|
||||
m_cUpgradeTime = cUpgradeTime;
|
||||
|
||||
// CASTLE_TODO : <20><><EFBFBD><EFBFBD> <20>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
|
||||
// // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> â<><C3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
// Guild::CGuildDB* lpGuild = static_cast<Guild::CGuildDB*>(
|
||||
// Guild::CGuildDBMgr::GetInstance().GetGuild(m_dwGID));
|
||||
//
|
||||
// if (lpGuild)
|
||||
// {
|
||||
// lpGuild->DeductGold(dwUpgradeGold);
|
||||
// }
|
||||
|
||||
SYSTEMTIME sysTime;
|
||||
GetLocalTime(&sysTime);
|
||||
|
||||
m_TimeValue.Year = sysTime.wYear;
|
||||
m_TimeValue.Month = sysTime.wMonth;
|
||||
m_TimeValue.Day = sysTime.wDay;
|
||||
m_TimeValue.Hour = sysTime.wHour;
|
||||
m_TimeValue.Minute = sysTime.wMinute;
|
||||
m_TimeValue.Second = sysTime.wSecond;
|
||||
|
||||
DBComponent::CastleDB::UpdateCastleObjectState(m_DBComponent, m_dwCID, m_cState, m_cSubState);
|
||||
DBComponent::CastleDB::UpdateCastleObjectTime(m_DBComponent, m_dwCID, sysTime);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CCastleGateDB::Repair(unsigned long dwRepairHP, unsigned long dwRepairGold)
|
||||
{
|
||||
if (Siege::COMPLETE == m_cState)
|
||||
{
|
||||
m_cState = Siege::REPARING;
|
||||
m_dwRepairHP = dwRepairHP;
|
||||
m_cRepairTime = static_cast<unsigned char>(dwRepairHP * Siege::GATE_REPAIR_MIN_PER_HP);
|
||||
|
||||
// CASTLE_TODO : <20><><EFBFBD><EFBFBD> <20>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
|
||||
// // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> â<><C3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
// Guild::CGuildDB* lpGuild = static_cast<Guild::CGuildDB*>(
|
||||
// Guild::CGuildDBMgr::GetInstance().GetGuild(m_dwGID));
|
||||
//
|
||||
// if (lpGuild)
|
||||
// {
|
||||
// lpGuild->DeductGold(dwRepairGold);
|
||||
// }
|
||||
|
||||
SYSTEMTIME sysTime;
|
||||
GetLocalTime(&sysTime);
|
||||
|
||||
m_TimeValue.Year = sysTime.wYear;
|
||||
m_TimeValue.Month = sysTime.wMonth;
|
||||
m_TimeValue.Day = sysTime.wDay;
|
||||
m_TimeValue.Hour = sysTime.wHour;
|
||||
m_TimeValue.Minute = sysTime.wMinute;
|
||||
m_TimeValue.Second = sysTime.wSecond;
|
||||
|
||||
DBComponent::CastleDB::UpdateCastleObjectState(m_DBComponent, m_dwCID, m_cState, m_cSubState);
|
||||
DBComponent::CastleDB::UpdateCastleObjectTime(m_DBComponent, m_dwCID, sysTime);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CCastleGateDB::Restore(unsigned char cRestoreTime, unsigned long dwRestoreGold)
|
||||
{
|
||||
if (Siege::DESTROYED == m_cState)
|
||||
{
|
||||
m_cState = Siege::RESTORING;
|
||||
m_cDevelopTime = cRestoreTime;
|
||||
|
||||
// CASTLE_TODO : <20><><EFBFBD><EFBFBD> <20>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> â<><C3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
// Guild::CGuildDB* lpGuild = static_cast<Guild::CGuildDB*>(
|
||||
// Guild::CGuildDBMgr::GetInstance().GetGuild(m_dwGID));
|
||||
//
|
||||
// if (lpGuild)
|
||||
// {
|
||||
// lpGuild->DeductGold(dwRestoreGold);
|
||||
// }
|
||||
|
||||
SYSTEMTIME sysTime;
|
||||
GetLocalTime(&sysTime);
|
||||
|
||||
m_TimeValue.Year = sysTime.wYear;
|
||||
m_TimeValue.Month = sysTime.wMonth;
|
||||
m_TimeValue.Day = sysTime.wDay;
|
||||
m_TimeValue.Hour = sysTime.wHour;
|
||||
m_TimeValue.Minute = sysTime.wMinute;
|
||||
m_TimeValue.Second = sysTime.wSecond;
|
||||
|
||||
DBComponent::CastleDB::UpdateCastleObjectState(m_DBComponent, m_dwCID, m_cState, m_cSubState);
|
||||
DBComponent::CastleDB::UpdateCastleObjectTime(m_DBComponent, m_dwCID, sysTime);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CCastleGateDB::Destroy(unsigned long dwEnemyNation, bool bDeductFame)
|
||||
{
|
||||
m_cState = Siege::DESTROYED;
|
||||
m_cSubState = Siege::OPENED;
|
||||
m_cUpgradeStep = 0;
|
||||
m_dwHP = 0;
|
||||
|
||||
DBComponent::CastleDB::UpdateCastleObjectState(m_DBComponent, m_dwCID, m_cState, m_cSubState);
|
||||
DBComponent::CastleDB::UpdateCastleObjectUpgrade(m_DBComponent, m_dwCID, m_cUpgradeStep, m_cUpgradeType);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CCastleGateDB::UpdateHP(unsigned long dwNowHP)
|
||||
{
|
||||
CSiegeObjectDB::UpdateHP(dwNowHP);
|
||||
|
||||
DBComponent::CastleDB::UpdateCastleObjectHP(m_DBComponent, m_dwCID, m_dwHP);
|
||||
}
|
||||
|
||||
void CCastleGateDB::ForceOpen()
|
||||
{
|
||||
if (Siege::COMPLETE == m_cState && Siege::OPENED == m_cSubState)
|
||||
{
|
||||
return ;
|
||||
}
|
||||
|
||||
m_cState = Siege::COMPLETE;
|
||||
m_cSubState = Siege::OPENED;
|
||||
|
||||
DBComponent::CastleDB::UpdateCastleObjectState(m_DBComponent, m_dwCID, m_cState, m_cSubState);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
|
||||
SendCastleCmd(0, PktCastleCmd::CASTLE_GATE_FORCE_OPEN);
|
||||
}
|
||||
|
||||
void CCastleGateDB::ForceClose()
|
||||
{
|
||||
if (Siege::COMPLETE == m_cSubState && Siege::CLOSED == m_cSubState)
|
||||
{
|
||||
return ;
|
||||
}
|
||||
|
||||
m_cState = Siege::COMPLETE;
|
||||
m_cSubState = Siege::CLOSED;
|
||||
|
||||
DBComponent::CastleDB::UpdateCastleObjectState(m_DBComponent, m_dwCID, m_cState, m_cSubState);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
|
||||
SendCastleCmd(0, PktCastleCmd::CASTLE_GATE_FORCE_CLOSE);
|
||||
}
|
||||
|
||||
Siege::eReturn CCastleGateDB::Process()
|
||||
{
|
||||
CTime nowTime = CTime::GetCurrentTime();
|
||||
CTimeSpan timeSpan(0);
|
||||
|
||||
switch (m_cState)
|
||||
{
|
||||
case Siege::UPGRADING: // <20><><EFBFBD><EFBFBD><D7B7>̵<EFBFBD><CCB5><EFBFBD>
|
||||
{
|
||||
if (0 != m_TimeValue.Year)
|
||||
{
|
||||
CTime upgradeTime(m_TimeValue.Year, m_TimeValue.Month, m_TimeValue.Day,
|
||||
m_TimeValue.Hour, m_TimeValue.Minute, m_TimeValue.Second);
|
||||
|
||||
timeSpan = nowTime - upgradeTime;
|
||||
if (timeSpan.GetTotalMinutes() >= m_cUpgradeTime)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><D7B7>̵<EFBFBD> <20>Ϸ<EFBFBD>
|
||||
m_cState = Siege::COMPLETE;
|
||||
++m_cUpgradeStep;
|
||||
|
||||
DBComponent::CastleDB::UpdateCastleObjectState(m_DBComponent, m_dwCID, m_cState, m_cSubState);
|
||||
DBComponent::CastleDB::UpdateCastleObjectUpgrade(m_DBComponent, m_dwCID, m_cUpgradeStep, m_cUpgradeType);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
|
||||
SendCastleCmd(m_cUpgradeStep, PktCastleCmd::CASTLE_UPGRADE_GATE_COMPLETE);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case Siege::REPARING: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
if (0 != m_TimeValue.Year)
|
||||
{
|
||||
CTime repairTime(m_TimeValue.Year, m_TimeValue.Month, m_TimeValue.Day,
|
||||
m_TimeValue.Hour, m_TimeValue.Minute, m_TimeValue.Second);
|
||||
|
||||
timeSpan = nowTime - repairTime;
|
||||
if (timeSpan.GetTotalMinutes() >= m_cRepairTime)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD>
|
||||
m_cState = Siege::COMPLETE;
|
||||
|
||||
DBComponent::CastleDB::UpdateCastleObjectState(m_DBComponent, m_dwCID, m_cState, m_cSubState);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
|
||||
SendCastleCmd(m_dwRepairHP, PktCastleCmd::CASTLE_REPAIR_GATE_COMPLETE);
|
||||
m_dwRepairHP = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case Siege::RESTORING: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
if (0 != m_TimeValue.Year)
|
||||
{
|
||||
CTime restoreTime(m_TimeValue.Year, m_TimeValue.Month, m_TimeValue.Day,
|
||||
m_TimeValue.Hour, m_TimeValue.Minute, m_TimeValue.Second);
|
||||
|
||||
timeSpan = nowTime - restoreTime;
|
||||
if (timeSpan.GetTotalMinutes() >= m_cDevelopTime)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD>
|
||||
m_cState = Siege::COMPLETE;
|
||||
m_cUpgradeStep = 0;
|
||||
m_dwHP = 0;
|
||||
|
||||
DBComponent::CastleDB::UpdateCastleObjectState(m_DBComponent, m_dwCID, m_cState, m_cSubState);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
|
||||
SendCastleCmd(m_dwHP, PktCastleCmd::CASTLE_RESTORE_GATE_COMPLETE);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return Siege::RET_OK;
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
#ifndef _RYL_DBAGENT_CASTLE_GATE_DB_H_
|
||||
#define _RYL_DBAGENT_CASTLE_GATE_DB_H_
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "SiegeObjectDB.h"
|
||||
|
||||
using namespace Siege;
|
||||
|
||||
class CCastleGateDB : public CSiegeObjectDB
|
||||
{
|
||||
public:
|
||||
virtual ~CCastleGateDB();
|
||||
|
||||
// Process <20>Լ<EFBFBD>
|
||||
Siege::eReturn Process();
|
||||
|
||||
// Cmd ó<><C3B3> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
|
||||
bool Upgrade(unsigned char cUpgradeTime, unsigned long dwUpgradeGold = 0, unsigned char cUpgradeType = Siege::NO_JEWEL);
|
||||
bool Repair(unsigned long dwRepairHP, unsigned long dwRepairGold = 0);
|
||||
bool Restore(unsigned char cRestoreTime, unsigned long dwRestoreGold = 0);
|
||||
bool Destroy(unsigned long dwEnemyNation = 0, bool bDeductFame = false);
|
||||
|
||||
void UpdateHP(unsigned long dwNowHP);
|
||||
|
||||
// <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Open / Close <20><><EFBFBD>·<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD>´<EFBFBD> Complete<74><65> <20>ȴ<EFBFBD>.)
|
||||
void ForceOpen();
|
||||
void ForceClose();
|
||||
|
||||
private:
|
||||
|
||||
CCastleGateDB(CDBComponent& DBComponent, const CastleObjectInfoDB& CastleObject);
|
||||
|
||||
friend class CSiegeObjectDBMgr;
|
||||
};
|
||||
|
||||
#endif _RYL_DBAGENT_CASTLE_GATE_DB_H_
|
||||
@@ -0,0 +1,198 @@
|
||||
#include "stdafx.h"
|
||||
#include "MiningCampDB.h"
|
||||
#include "SiegeObjectDBMgr.h"
|
||||
|
||||
#include <DB/DBComponent.h>
|
||||
#include <Castle/CastleDBComponent.h>
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
|
||||
CMiningCampDB::CMiningCampDB(CDBComponent& DBComponent, const CampInfoDB& CampInfo)
|
||||
: CCampDB(DBComponent, CampInfo)
|
||||
{
|
||||
}
|
||||
|
||||
CMiningCampDB::~CMiningCampDB()
|
||||
{
|
||||
}
|
||||
|
||||
bool CMiningCampDB::OnOff(unsigned long dwSubState)
|
||||
{
|
||||
if ( Siege::MINING_ON == dwSubState && Siege::MINING_ON != m_cSubState )
|
||||
{
|
||||
m_cSiegeCount = 0;
|
||||
m_cSubState = Siege::MINING_ON;
|
||||
DBComponent::CastleDB::UpdateCampSubState(m_DBComponent, GetCampID(), m_cSubState);
|
||||
DBComponent::CastleDB::UpdateCampSiegeCount(m_DBComponent, GetCampID(), m_cSiegeCount);
|
||||
}
|
||||
else if ( Siege::MINING_OFF == dwSubState && Siege::MINING_OFF != m_cSubState )
|
||||
{
|
||||
m_cSiegeCount = 0;
|
||||
m_cSubState = Siege::MINING_OFF;
|
||||
DBComponent::CastleDB::UpdateCampSubState(m_DBComponent, GetCampID(), m_cSubState);
|
||||
DBComponent::CastleDB::UpdateCampSiegeCount(m_DBComponent, GetCampID(), m_cSiegeCount);
|
||||
|
||||
// <20>ӽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
DBComponent::CastleDB::DeleteMiningCampMineralInfo(m_DBComponent, GetCampID(), Siege::TEMPORARY_MINERAL);
|
||||
m_TemporaryMineralMap.clear();
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CMiningCampDB::GainMineral(unsigned short wMineralID, unsigned short wAmount)
|
||||
{
|
||||
MineralInfoMap::iterator itr = m_AccumulatedMineralMap.find(wMineralID);
|
||||
|
||||
if (itr != m_AccumulatedMineralMap.end())
|
||||
{
|
||||
if (itr->second < wAmount)
|
||||
{
|
||||
ERRLOG4(g_Log, "ȹ<EFBFBD><EFBFBD><EFBFBD>ҷ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.( CampID : 0x%08x, MineralID : %d, CurrentAmount : %d, GainAmount : %d )",
|
||||
GetCampID(), wMineralID, itr->second, wAmount);
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (itr->second == wAmount)
|
||||
{
|
||||
DBComponent::CastleDB::DeleteMiningCampMineralInfo(m_DBComponent, GetCampID(), Siege::ACCUMULATED_MINERAL, wMineralID);
|
||||
m_AccumulatedMineralMap.erase(itr);
|
||||
}
|
||||
else
|
||||
{
|
||||
itr->second -= wAmount;
|
||||
DBComponent::CastleDB::UpdateMiningCampMineralInfo(m_DBComponent, GetCampID(), Siege::ACCUMULATED_MINERAL, wMineralID, itr->second);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CMiningCampDB::AddMineral(unsigned char cFlag, const CampMineralInfo& campMineralInfo)
|
||||
{
|
||||
if (campMineralInfo.m_wAmount > 0)
|
||||
{
|
||||
switch (cFlag)
|
||||
{
|
||||
case Siege::ACCUMULATED_MINERAL :
|
||||
{
|
||||
m_AccumulatedMineralMap.insert( std::make_pair(campMineralInfo.m_wMineralID, campMineralInfo.m_wAmount) ).second;
|
||||
}
|
||||
break;
|
||||
|
||||
case Siege::TEMPORARY_MINERAL :
|
||||
{
|
||||
m_TemporaryMineralMap.insert( std::make_pair(campMineralInfo.m_wMineralID, campMineralInfo.m_wAmount) ).second;
|
||||
}
|
||||
break;
|
||||
|
||||
default: return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CMiningCampDB::UpdateMineralInfo(unsigned char cFlag, unsigned char cNum, CampMineralInfo* lpMineralInfo)
|
||||
{
|
||||
switch (cFlag)
|
||||
{
|
||||
case Siege::TEMPORARY_MINERAL :
|
||||
{
|
||||
DBComponent::CastleDB::DeleteMiningCampMineralInfo(m_DBComponent, GetCampID(), cFlag);
|
||||
m_TemporaryMineralMap.clear();
|
||||
|
||||
for (int i=0; i<cNum; ++i)
|
||||
{
|
||||
DBComponent::CastleDB::InsertMiningCampMineralInfo(m_DBComponent, GetCampID(), cFlag,
|
||||
lpMineralInfo->m_wMineralID, lpMineralInfo->m_wAmount);
|
||||
|
||||
AddMineral(cFlag, *lpMineralInfo);
|
||||
++lpMineralInfo;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case Siege::ACCUMULATED_MINERAL :
|
||||
{
|
||||
DBComponent::CastleDB::DeleteMiningCampMineralInfo(m_DBComponent, GetCampID(), cFlag);
|
||||
m_AccumulatedMineralMap.clear();
|
||||
|
||||
for (int i=0; i<cNum; ++i)
|
||||
{
|
||||
DBComponent::CastleDB::InsertMiningCampMineralInfo(m_DBComponent, GetCampID(), cFlag,
|
||||
lpMineralInfo->m_wMineralID, lpMineralInfo->m_wAmount);
|
||||
|
||||
AddMineral(cFlag, *lpMineralInfo);
|
||||
++lpMineralInfo;
|
||||
}
|
||||
|
||||
m_cSiegeCount = 0;
|
||||
DBComponent::CastleDB::UpdateCampSiegeCount(m_DBComponent, GetCampID(), m_cSiegeCount);
|
||||
}
|
||||
break;
|
||||
|
||||
default: return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool CMiningCampDB::SerializeOut(char* szBuffer_Out, unsigned short& usBufferSize_Out, unsigned long& dwCID_Out)
|
||||
{
|
||||
if (CCampDB::SerializeOut(szBuffer_Out, usBufferSize_Out, dwCID_Out))
|
||||
{
|
||||
char* lpBuffer = szBuffer_Out + usBufferSize_Out;
|
||||
|
||||
if (!lpBuffer)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// ä<><C3A4><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
unsigned short wSize = 0;
|
||||
MiningCampInfo* lpMiningCampInfo = reinterpret_cast<MiningCampInfo*>(lpBuffer);
|
||||
|
||||
lpMiningCampInfo->m_cAccumulatedNum = static_cast<unsigned char>(m_AccumulatedMineralMap.size());
|
||||
lpMiningCampInfo->m_cTemporaryNum = static_cast<unsigned char>(m_TemporaryMineralMap.size());
|
||||
|
||||
wSize += sizeof(MiningCampInfo);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
CampMineralInfo* lpCampMineralInfo = reinterpret_cast<CampMineralInfo*>(lpMiningCampInfo + 1);
|
||||
for (MineralInfoMap::iterator itr = m_AccumulatedMineralMap.begin();
|
||||
itr != m_AccumulatedMineralMap.end(); ++itr, ++lpCampMineralInfo)
|
||||
{
|
||||
lpCampMineralInfo->m_wMineralID = itr->first;
|
||||
lpCampMineralInfo->m_wAmount = itr->second;
|
||||
|
||||
wSize += sizeof(CampMineralInfo);
|
||||
}
|
||||
|
||||
// <20>ӽ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
for (MineralInfoMap::iterator itr = m_TemporaryMineralMap.begin();
|
||||
itr != m_TemporaryMineralMap.end(); ++itr, ++lpCampMineralInfo)
|
||||
{
|
||||
lpCampMineralInfo->m_wMineralID = itr->first;
|
||||
lpCampMineralInfo->m_wAmount = itr->second;
|
||||
|
||||
wSize += sizeof(CampMineralInfo);
|
||||
}
|
||||
|
||||
lpMiningCampInfo->m_wSize = wSize;
|
||||
usBufferSize_Out += wSize;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
#ifndef _RYL_DBAGENT_MINING_CAMP_H_
|
||||
#define _RYL_DBAGENT_MINING_CAMP_H_
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CampDB.h"
|
||||
#include <map>
|
||||
#include <Network/Packet/PacketStruct/CastlePacket.h>
|
||||
|
||||
using namespace Siege;
|
||||
|
||||
|
||||
class CMiningCampDB : public CCampDB
|
||||
{
|
||||
public:
|
||||
virtual ~CMiningCampDB();
|
||||
|
||||
typedef std::map<unsigned short, unsigned short> MineralInfoMap; // <wMineralID, wAmount>
|
||||
|
||||
bool OnOff(unsigned long dwSubState);
|
||||
bool GainMineral(unsigned short wMineralID, unsigned short wAmount); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ȹ<><C8B9>
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> AddMineral <20>Լ<EFBFBD><D4BC><EFBFBD> insert<72><74> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!! (<28>̹<EFBFBD> <20>ִ<EFBFBD> <20>༮<EFBFBD><E0BCAE> Add <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
|
||||
bool AddMineral(unsigned char cFlag, const CampMineralInfo& campMineralInfo);
|
||||
bool UpdateMineralInfo(unsigned char cFlag, unsigned char cNum, CampMineralInfo* lpMineralInfo);
|
||||
|
||||
bool SerializeOut(char* szBuffer_Out, unsigned short& usBufferSize_Out, unsigned long& dwCID_Out);
|
||||
|
||||
private:
|
||||
CMiningCampDB(CDBComponent& DBComponent, const CampInfoDB& CampInfo);
|
||||
|
||||
MineralInfoMap m_AccumulatedMineralMap;
|
||||
MineralInfoMap m_TemporaryMineralMap;
|
||||
|
||||
friend class CSiegeObjectDBMgr;
|
||||
};
|
||||
|
||||
#endif // _RYL_DBAGENT_MINING_CAMP_H_
|
||||
@@ -0,0 +1,182 @@
|
||||
#include "stdafx.h"
|
||||
#include "SiegeArmsDB.h"
|
||||
#include "SiegeObjectDBMgr.h"
|
||||
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
#include <Network/Packet/WrapPacket.h>
|
||||
#include <Network/Packet/PacketStruct/ServerInfo.h>
|
||||
#include <Network/Dispatch/GameDispatch.h>
|
||||
|
||||
#include <Community/Guild/GuildDB.h>
|
||||
#include <Community/Guild/GuildDBMgr.h>
|
||||
|
||||
#include <Castle/Castle.h>
|
||||
#include <Castle/CastleMgr.h>
|
||||
|
||||
#include <DB/DBComponent.h>
|
||||
#include <Castle/CastleDBComponent.h>
|
||||
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
|
||||
#include <atltime.h>
|
||||
|
||||
|
||||
CSiegeArmsDB::CSiegeArmsDB(CDBComponent& DBComponent, unsigned long dwOwnerID,
|
||||
unsigned char cNation, unsigned short wObjectType, unsigned char cUpgradeStep,
|
||||
unsigned char cZone, unsigned char cChannel, Position Pos)
|
||||
: CSiegeObjectDB(DBComponent, dwOwnerID, cNation, wObjectType, cUpgradeStep, cZone, cChannel, Pos)
|
||||
{
|
||||
}
|
||||
|
||||
CSiegeArmsDB::~CSiegeArmsDB()
|
||||
{
|
||||
}
|
||||
|
||||
bool CSiegeArmsDB::Repair(unsigned long dwRepairHP, unsigned long dwRepairGold)
|
||||
{
|
||||
if (Siege::COMPLETE == m_cState)
|
||||
{
|
||||
m_cState = Siege::REPARING;
|
||||
m_dwRepairHP = dwRepairHP;
|
||||
m_cRepairTime = Siege::SIEGE_ARMS_REPAIR_TIME;
|
||||
|
||||
SYSTEMTIME sysTime;
|
||||
GetLocalTime(&sysTime);
|
||||
|
||||
m_TimeValue.Year = sysTime.wYear;
|
||||
m_TimeValue.Month = sysTime.wMonth;
|
||||
m_TimeValue.Day = sysTime.wDay;
|
||||
m_TimeValue.Hour = sysTime.wHour;
|
||||
m_TimeValue.Minute = sysTime.wMinute;
|
||||
m_TimeValue.Second = sysTime.wSecond;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CSiegeArmsDB::Destroy(unsigned long dwEnemyNation, bool bDeductFame)
|
||||
{
|
||||
m_cState = Siege::DESTROYED;
|
||||
m_dwHP = 0;
|
||||
m_cUpgradeStep = 0;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CSiegeArmsDB::ToStartKit()
|
||||
{
|
||||
m_cState = Siege::DESTROYING;
|
||||
|
||||
SYSTEMTIME sysTime;
|
||||
GetLocalTime(&sysTime);
|
||||
|
||||
m_TimeValue.Year = sysTime.wYear;
|
||||
m_TimeValue.Month = sysTime.wMonth;
|
||||
m_TimeValue.Day = sysTime.wDay;
|
||||
m_TimeValue.Hour = sysTime.wHour;
|
||||
m_TimeValue.Minute = sysTime.wMinute;
|
||||
m_TimeValue.Second = sysTime.wSecond;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Siege::eReturn CSiegeArmsDB::Process()
|
||||
{
|
||||
CTime nowTime = CTime::GetCurrentTime();
|
||||
CTimeSpan timeSpan(0);
|
||||
|
||||
switch (m_cState)
|
||||
{
|
||||
case Siege::COMPLETE: // <20>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
{
|
||||
if (0 != m_LastUseTime.Year)
|
||||
{
|
||||
CTime lastUseTime(m_LastUseTime.Year, m_LastUseTime.Month, m_LastUseTime.Day,
|
||||
m_LastUseTime.Hour, m_LastUseTime.Minute, m_LastUseTime.Second);
|
||||
|
||||
timeSpan = nowTime - lastUseTime;
|
||||
if (timeSpan.GetTotalMinutes() > Siege::SIEGE_ARMS_LEAST_USE_TIME)
|
||||
{
|
||||
Destroy();
|
||||
SendSiegeArmsCmd(0, PktSiegeArmsCmd::SIEGE_DESTROY_ARMS);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD>
|
||||
return Siege::RET_DESTROY_SIEGE_ARMS;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case Siege::DEVELOPING: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
if (0 != m_TimeValue.Year)
|
||||
{
|
||||
CTime developTime(m_TimeValue.Year, m_TimeValue.Month, m_TimeValue.Day,
|
||||
m_TimeValue.Hour, m_TimeValue.Minute, m_TimeValue.Second);
|
||||
|
||||
timeSpan = nowTime - developTime;
|
||||
if (timeSpan.GetTotalMinutes() >= Siege::SIEGE_ARMS_BUILDING_TIME)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD>
|
||||
m_cState = Siege::COMPLETE;
|
||||
UpdateLastUseTime();
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
|
||||
SendSiegeArmsCmd(m_cUpgradeStep, PktSiegeArmsCmd::SIEGE_CREATE_ARMS_COMPLETE);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case Siege::REPARING: // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
if (0 != m_TimeValue.Year)
|
||||
{
|
||||
CTime repairTime(m_TimeValue.Year, m_TimeValue.Month, m_TimeValue.Day,
|
||||
m_TimeValue.Hour, m_TimeValue.Minute, m_TimeValue.Second);
|
||||
|
||||
timeSpan = nowTime - repairTime;
|
||||
if (timeSpan.GetTotalMinutes() >= m_cRepairTime)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD>
|
||||
m_cState = Siege::COMPLETE;
|
||||
UpdateLastUseTime();
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
|
||||
SendSiegeArmsCmd(m_dwRepairHP, PktSiegeArmsCmd::SIEGE_REPAIR_ARMS_COMPLETE);
|
||||
m_dwRepairHP = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case Siege::DESTROYING: // <20><>ŸƮŶ<C6AE><C5B6><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
|
||||
{
|
||||
if (0 != m_TimeValue.Year)
|
||||
{
|
||||
CTime destroyTime(m_TimeValue.Year, m_TimeValue.Month, m_TimeValue.Day,
|
||||
m_TimeValue.Hour, m_TimeValue.Minute, m_TimeValue.Second);
|
||||
|
||||
timeSpan = nowTime - destroyTime;
|
||||
if (timeSpan.GetTotalMinutes() >= Siege::SIEGE_ARMS_TO_STARTKIT_TIME)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ı<EFBFBD>
|
||||
Destroy();
|
||||
UpdateLastUseTime();
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
|
||||
SendSiegeArmsCmd(1, PktSiegeArmsCmd::SIEGE_TO_STARTKIT_COMPLETE);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD>
|
||||
return Siege::RET_DESTROY_SIEGE_ARMS;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return Siege::RET_OK;
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
#ifndef _RYL_DBAGENT_SIEGE_ARMS_DB_H_
|
||||
#define _RYL_DBAGENT_SIEGE_ARMS_DB_H_
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "SiegeObjectDB.h"
|
||||
|
||||
using namespace Siege;
|
||||
|
||||
class CSiegeArmsDB : public CSiegeObjectDB
|
||||
{
|
||||
public:
|
||||
virtual ~CSiegeArmsDB();
|
||||
|
||||
// Process <20>Լ<EFBFBD>
|
||||
Siege::eReturn Process();
|
||||
|
||||
// Cmd ó<><C3B3> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
|
||||
bool Repair(unsigned long dwRepairHP, unsigned long dwRepairGold = 0);
|
||||
bool Destroy(unsigned long dwEnemyNation = 0, bool bDeductFame = false);
|
||||
|
||||
bool ToStartKit();
|
||||
|
||||
private:
|
||||
|
||||
CSiegeArmsDB(CDBComponent& DBComponent, unsigned long dwOwnerID,
|
||||
unsigned char cNation, unsigned short wObjectType, unsigned char cUpgradeStep,
|
||||
unsigned char cZone, unsigned char cChannel, Position Pos);
|
||||
|
||||
friend class CSiegeObjectDBMgr;
|
||||
};
|
||||
|
||||
#endif _RYL_DBAGENT_SIEGE_ARMS_DB_H_
|
||||
@@ -0,0 +1,425 @@
|
||||
#include "stdafx.h"
|
||||
#include "SiegeObjectDB.h"
|
||||
#include "SiegeObjectDBMgr.h"
|
||||
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
#include <Network/Packet/WrapPacket.h>
|
||||
#include <Network/Packet/PacketStruct/ServerInfo.h>
|
||||
#include <Network/Dispatch/GameDispatch.h>
|
||||
|
||||
#include <Community/Guild/GuildDB.h>
|
||||
#include <Community/Guild/GuildDBMgr.h>
|
||||
|
||||
#include <Castle/Castle.h>
|
||||
#include <Castle/CastleMgr.h>
|
||||
|
||||
#include <DB/DBComponent.h>
|
||||
#include <Castle/CastleDBComponent.h>
|
||||
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
|
||||
#include <atltime.h>
|
||||
|
||||
|
||||
CSiegeObjectDB::CSiegeObjectDB(CDBComponent& DBComponent, const CastleObjectInfoDB& CastleObject)
|
||||
: m_dwCID(Creature::SIEGE_OBJECT_BIT | CastleObject.m_dwCID),
|
||||
m_dwCampOrCastleID(CastleObject.m_dwCastleID),
|
||||
m_dwOwnerID(CastleObject.m_dwOwnerID),
|
||||
m_dwGID(0),
|
||||
m_cNation(0),
|
||||
m_dwHP(CastleObject.m_dwHP),
|
||||
m_wObjectType(CastleObject.m_wObjectType),
|
||||
m_cState(CastleObject.m_cState),
|
||||
m_cSubState(CastleObject.m_cSubState),
|
||||
m_cUpgradeStep(CastleObject.m_cUpgradeStep),
|
||||
m_cUpgradeType(CastleObject.m_cUpgradeType),
|
||||
m_cZone(0),
|
||||
m_cChannel(0),
|
||||
m_TimeValue(CastleObject.m_RemainUpTime),
|
||||
m_LastUseTime(CastleObject.m_LastUseTime),
|
||||
m_Pos(CastleObject.m_Pos),
|
||||
m_cMaterial(0),
|
||||
m_cSiegeCount(0),
|
||||
m_dwRepairHP(0),
|
||||
m_fDefaultDir(CastleObject.m_fDefaultDir),
|
||||
m_cDevelopTime(Siege::DEFAULT_TIME_VALUE),
|
||||
m_cUpgradeTime(Siege::DEFAULT_TIME_VALUE),
|
||||
m_cRepairTime(Siege::DEFAULT_REPAIR_TIME),
|
||||
m_cChangeTime(Siege::DEFAULT_TIME_VALUE),
|
||||
m_DBComponent(DBComponent)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
CSiegeObjectDB::CSiegeObjectDB(CDBComponent& DBComponent, const CampInfoDB& CampInfo)
|
||||
: m_dwCID(0),
|
||||
m_dwCampOrCastleID(Castle::CAMP_BIT | CampInfo.m_dwCampID),
|
||||
m_dwOwnerID(0),
|
||||
m_dwGID(CampInfo.m_dwGID),
|
||||
m_cNation(0),
|
||||
m_dwHP(CampInfo.m_dwHP),
|
||||
m_wObjectType(CampInfo.m_wObjectType),
|
||||
m_cState(CampInfo.m_cState),
|
||||
m_cSubState(CampInfo.m_cSubState),
|
||||
m_cUpgradeStep(CampInfo.m_cUpgradeStep),
|
||||
m_cUpgradeType(0),
|
||||
m_cZone(CampInfo.m_cZone),
|
||||
m_cChannel(CampInfo.m_cChannel),
|
||||
m_TimeValue(CampInfo.m_TimeValue),
|
||||
m_LastUseTime(CampInfo.m_LastUseTime),
|
||||
m_Pos(CampInfo.m_Pos),
|
||||
m_cMaterial(CampInfo.m_cMaterial),
|
||||
m_cSiegeCount(CampInfo.m_cSiegeCount),
|
||||
m_dwRepairHP(0),
|
||||
m_fDefaultDir(0),
|
||||
m_cDevelopTime(Siege::DEFAULT_TIME_VALUE),
|
||||
m_cUpgradeTime(Siege::DEFAULT_TIME_VALUE),
|
||||
m_cRepairTime(Siege::DEFAULT_REPAIR_TIME),
|
||||
m_cChangeTime(Siege::DEFAULT_TIME_VALUE),
|
||||
m_DBComponent(DBComponent)
|
||||
{
|
||||
}
|
||||
|
||||
CSiegeObjectDB::CSiegeObjectDB(CDBComponent& DBComponent, unsigned long dwCampID,
|
||||
unsigned long dwGID, unsigned char cZone,
|
||||
unsigned char cChannel, Position Pos)
|
||||
: m_dwCID(0),
|
||||
m_dwCampOrCastleID(dwCampID),
|
||||
m_dwOwnerID(0),
|
||||
m_dwGID(dwGID),
|
||||
m_cNation(0),
|
||||
m_dwHP(0),
|
||||
m_wObjectType(Siege::CAMP),
|
||||
m_cSubState(0),
|
||||
m_cState(DEVELOPING),
|
||||
m_cUpgradeStep(0),
|
||||
m_cUpgradeType(0),
|
||||
m_cZone(cZone),
|
||||
m_cChannel(cChannel),
|
||||
m_Pos(Pos),
|
||||
m_cMaterial(0),
|
||||
m_cSiegeCount(0),
|
||||
m_dwRepairHP(0),
|
||||
m_fDefaultDir(0),
|
||||
m_cDevelopTime(Siege::DEFAULT_TIME_VALUE),
|
||||
m_cUpgradeTime(Siege::DEFAULT_TIME_VALUE),
|
||||
m_cRepairTime(Siege::DEFAULT_REPAIR_TIME),
|
||||
m_cChangeTime(Siege::DEFAULT_TIME_VALUE),
|
||||
m_DBComponent(DBComponent)
|
||||
{
|
||||
SYSTEMTIME sysTime;
|
||||
GetLocalTime(&sysTime);
|
||||
|
||||
m_TimeValue.Year = sysTime.wYear;
|
||||
m_TimeValue.Month = sysTime.wMonth;
|
||||
m_TimeValue.Day = sysTime.wDay;
|
||||
m_TimeValue.Hour = sysTime.wHour;
|
||||
m_TimeValue.Minute = sysTime.wMinute;
|
||||
m_TimeValue.Second = sysTime.wSecond;
|
||||
|
||||
m_LastUseTime = m_TimeValue;
|
||||
}
|
||||
|
||||
CSiegeObjectDB::CSiegeObjectDB(CDBComponent& DBComponent, unsigned long dwOwnerID,
|
||||
unsigned char cNation, unsigned short wObjectType,
|
||||
unsigned char cUpgradeStep, unsigned char cZone, unsigned char cChannel,
|
||||
Position Pos)
|
||||
: m_dwCID(0),
|
||||
m_dwCampOrCastleID(0),
|
||||
m_dwOwnerID(dwOwnerID),
|
||||
m_dwGID(0),
|
||||
m_cNation(cNation),
|
||||
m_dwHP(0),
|
||||
m_wObjectType(wObjectType),
|
||||
m_cSubState(0),
|
||||
m_cState(DEVELOPING),
|
||||
m_cUpgradeStep(cUpgradeStep),
|
||||
m_cUpgradeType(0),
|
||||
m_cZone(cZone),
|
||||
m_cChannel(cChannel),
|
||||
m_Pos(Pos),
|
||||
m_cMaterial(0),
|
||||
m_cSiegeCount(0),
|
||||
m_dwRepairHP(0),
|
||||
m_fDefaultDir(0),
|
||||
m_cDevelopTime(Siege::DEFAULT_TIME_VALUE),
|
||||
m_cUpgradeTime(Siege::DEFAULT_TIME_VALUE),
|
||||
m_cRepairTime(Siege::DEFAULT_REPAIR_TIME),
|
||||
m_cChangeTime(Siege::DEFAULT_TIME_VALUE),
|
||||
m_DBComponent(DBComponent)
|
||||
{
|
||||
SYSTEMTIME sysTime;
|
||||
GetLocalTime(&sysTime);
|
||||
|
||||
m_TimeValue.Year = sysTime.wYear;
|
||||
m_TimeValue.Month = sysTime.wMonth;
|
||||
m_TimeValue.Day = sysTime.wDay;
|
||||
m_TimeValue.Hour = sysTime.wHour;
|
||||
m_TimeValue.Minute = sysTime.wMinute;
|
||||
m_TimeValue.Second = sysTime.wSecond;
|
||||
|
||||
m_LastUseTime = m_TimeValue;
|
||||
}
|
||||
|
||||
CSiegeObjectDB::~CSiegeObjectDB()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void CSiegeObjectDB::SendCampCmd(unsigned char cSubCmd, unsigned long dwValue1, unsigned long dwValue2)
|
||||
{
|
||||
if ( IsCamp() )
|
||||
{
|
||||
SERVER_ID serverID;
|
||||
serverID.sID.Type = CServerSetup::GameServer;
|
||||
serverID.sID.Group = CServerSetup::GetInstance().GetServerGroup();
|
||||
serverID.sID.Channel = m_cChannel;
|
||||
serverID.sID.ID = m_cZone;
|
||||
|
||||
GET_MULTI_DISPATCH(lpGameDispatch, serverID.dwID,
|
||||
DBAgent::CGameDispatch, DBAgent::CGameDispatch::GetDispatchTable());
|
||||
|
||||
if(0 != lpGameDispatch)
|
||||
{
|
||||
CSendStream& SendStream = lpGameDispatch->GetSendStream();
|
||||
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktCampCmd));
|
||||
if(0 != lpBuffer)
|
||||
{
|
||||
PktCampCmd* lpPktCampCmd = reinterpret_cast<PktCampCmd*>(lpBuffer);
|
||||
|
||||
lpPktCampCmd->m_dwCID = m_dwCID;
|
||||
lpPktCampCmd->m_dwCampID = GetCampID();
|
||||
lpPktCampCmd->m_cState = m_cState;
|
||||
lpPktCampCmd->m_dwValue1 = dwValue1;
|
||||
lpPktCampCmd->m_dwValue2 = dwValue2;
|
||||
lpPktCampCmd->m_cSubCmd = cSubCmd;
|
||||
|
||||
SendStream.WrapHeader(sizeof(PktCampCmd), CmdCampCmd, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CSiegeObjectDB::SendCastleCmd(unsigned long dwValue, unsigned char cSubCmd)
|
||||
{
|
||||
if ( IsCastleObject() )
|
||||
{
|
||||
SERVER_ID serverID;
|
||||
serverID.sID.Type = CServerSetup::GameServer;
|
||||
serverID.sID.Group = CServerSetup::GetInstance().GetServerGroup();
|
||||
serverID.sID.Channel = m_cChannel;
|
||||
serverID.sID.ID = m_cZone;
|
||||
|
||||
GET_MULTI_DISPATCH(lpGameDispatch, serverID.dwID,
|
||||
DBAgent::CGameDispatch, DBAgent::CGameDispatch::GetDispatchTable());
|
||||
|
||||
if (0 != lpGameDispatch)
|
||||
{
|
||||
CSendStream& SendStream = lpGameDispatch->GetSendStream();
|
||||
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktCampCmd));
|
||||
if (0 != lpBuffer)
|
||||
{
|
||||
PktCastleCmd* lpPktCastleCmd = reinterpret_cast<PktCastleCmd*>(lpBuffer);
|
||||
|
||||
lpPktCastleCmd->m_dwCastleID = GetCastleID();
|
||||
lpPktCastleCmd->m_dwCastleObjectID = m_dwCID;
|
||||
lpPktCastleCmd->m_cState = m_cState;
|
||||
lpPktCastleCmd->m_dwValue1 = dwValue;
|
||||
lpPktCastleCmd->m_dwValue2 = 0;
|
||||
lpPktCastleCmd->m_cSubCmd = cSubCmd;
|
||||
|
||||
SendStream.WrapHeader(sizeof(PktCastleCmd), CmdCastleCmd, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CSiegeObjectDB::SendSiegeArmsCmd(unsigned long dwValue, unsigned char cSubCmd)
|
||||
{
|
||||
if ( IsSiegeArms() )
|
||||
{
|
||||
SERVER_ID serverID;
|
||||
|
||||
serverID.sID.Type = CServerSetup::GameServer;
|
||||
serverID.sID.Group = CServerSetup::GetInstance().GetServerGroup();
|
||||
serverID.sID.Channel = m_cChannel;
|
||||
serverID.sID.ID = m_cZone;
|
||||
|
||||
GET_MULTI_DISPATCH(lpGameDispatch, serverID.dwID,
|
||||
DBAgent::CGameDispatch, DBAgent::CGameDispatch::GetDispatchTable());
|
||||
|
||||
if(0 != lpGameDispatch)
|
||||
{
|
||||
CSendStream& SendStream = lpGameDispatch->GetSendStream();
|
||||
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktSiegeArmsCmd));
|
||||
if(0 != lpBuffer)
|
||||
{
|
||||
PktSiegeArmsCmd* lpPktSiegeArmsCmd = reinterpret_cast<PktSiegeArmsCmd*>(lpBuffer);
|
||||
|
||||
lpPktSiegeArmsCmd->m_dwCID = m_dwOwnerID;
|
||||
lpPktSiegeArmsCmd->m_dwArmsID = m_dwCID;
|
||||
lpPktSiegeArmsCmd->m_cState = m_cState;
|
||||
lpPktSiegeArmsCmd->m_dwValue = dwValue;
|
||||
lpPktSiegeArmsCmd->m_cSubCmd = cSubCmd;
|
||||
|
||||
SendStream.WrapHeader(sizeof(PktSiegeArmsCmd), CmdSiegeArmsCmd, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CSiegeObjectDB::UpdateLastUseTime(bool bInit)
|
||||
{
|
||||
if (bInit)
|
||||
{
|
||||
m_LastUseTime.Year = 0;
|
||||
m_LastUseTime.Month = 0;
|
||||
m_LastUseTime.Day = 0;
|
||||
m_LastUseTime.Hour = 0;
|
||||
m_LastUseTime.Minute = 0;
|
||||
m_LastUseTime.Second = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
SYSTEMTIME sysTime;
|
||||
GetLocalTime(&sysTime);
|
||||
|
||||
m_LastUseTime.Year = sysTime.wYear;
|
||||
m_LastUseTime.Month = sysTime.wMonth;
|
||||
m_LastUseTime.Day = sysTime.wDay;
|
||||
m_LastUseTime.Hour = sysTime.wHour;
|
||||
m_LastUseTime.Minute = sysTime.wMinute;
|
||||
m_LastUseTime.Second = sysTime.wSecond;
|
||||
}
|
||||
}
|
||||
|
||||
bool CSiegeObjectDB::IsCamp() const
|
||||
{
|
||||
switch ( m_wObjectType )
|
||||
{
|
||||
case Siege::CAMP:
|
||||
case Siege::CAMP_SHOP:
|
||||
case Siege::MINING_CAMP:
|
||||
case Siege::KARTERANT_WEAPON:
|
||||
case Siege::MERKADIA_WEAPON:
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CSiegeObjectDB::IsCastleObject() const
|
||||
{
|
||||
switch ( m_wObjectType )
|
||||
{
|
||||
case Siege::EMBLEM :
|
||||
case Siege::GATE :
|
||||
case Siege::BACKDOOR :
|
||||
case Siege::CASTLE_ARMS_NPC :
|
||||
case Siege::GUARD :
|
||||
case Siege::SHORT_RANGE_CASTLE_ARMS :
|
||||
case Siege::LONG_RANGE_CASTLE_ARMS :
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CSiegeObjectDB::IsCastleArms() const
|
||||
{
|
||||
switch ( m_wObjectType )
|
||||
{
|
||||
case Siege::GUARD :
|
||||
case Siege::SHORT_RANGE_CASTLE_ARMS :
|
||||
case Siege::LONG_RANGE_CASTLE_ARMS :
|
||||
case Siege::CASTLE_ARMS_NPC :
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CSiegeObjectDB::IsSiegeArms() const
|
||||
{
|
||||
switch ( m_wObjectType )
|
||||
{
|
||||
case Siege::SHORT_RANGE_SIEGE_ARMS :
|
||||
case Siege::LONG_RANGE_SIEGE_ARMS :
|
||||
case Siege::AIRSHIP :
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CSiegeObjectDB::IsRidable() const
|
||||
{
|
||||
switch ( m_wObjectType )
|
||||
{
|
||||
case Siege::SHORT_RANGE_CASTLE_ARMS :
|
||||
case Siege::LONG_RANGE_CASTLE_ARMS :
|
||||
case Siege::SHORT_RANGE_SIEGE_ARMS :
|
||||
case Siege::LONG_RANGE_SIEGE_ARMS :
|
||||
case Siege::AIRSHIP :
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CSiegeObjectDB::IsWorldWeapon() const
|
||||
{
|
||||
if (Siege::KARTERANT_WEAPON == m_wObjectType || Siege::MERKADIA_WEAPON == m_wObjectType)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void CSiegeObjectDB::SetGID(unsigned long dwGID)
|
||||
{
|
||||
m_dwGID = dwGID;
|
||||
|
||||
// if (IsEmblem() && 0 == dwGID)
|
||||
// {
|
||||
// m_cState = Siege::COMPLETE;
|
||||
// m_cSubState = Siege::NONE;
|
||||
// }
|
||||
}
|
||||
|
||||
void CSiegeObjectDB::SetNation(unsigned char cNation)
|
||||
{
|
||||
m_cNation = cNation ;
|
||||
|
||||
if (IsEmblem() && Creature::STATELESS == cNation)
|
||||
{
|
||||
m_cState = Siege::COMPLETE;
|
||||
m_cSubState = Siege::NONE;
|
||||
}
|
||||
}
|
||||
|
||||
void CSiegeObjectDB::SetZoneChannel(unsigned char cZone, unsigned char cChannel)
|
||||
{
|
||||
m_cZone = cZone;
|
||||
m_cChannel = cChannel;
|
||||
}
|
||||
|
||||
void CSiegeObjectDB::SetMaterialNum(unsigned char cMaterial)
|
||||
{
|
||||
m_cMaterial = cMaterial;
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
#ifndef _RYL_DBAGENT_SIEGE_OBJECT_DB_H_
|
||||
#define _RYL_DBAGENT_SIEGE_OBJECT_DB_H_
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <Network/Packet/PacketStruct/CastlePacket.h>
|
||||
#include <Creature/CreatureStructure.h>
|
||||
|
||||
using namespace Siege;
|
||||
|
||||
// forward decl.
|
||||
class CDBComponent;
|
||||
|
||||
class CSiegeObjectDB
|
||||
{
|
||||
public:
|
||||
|
||||
virtual ~CSiegeObjectDB();
|
||||
|
||||
// Process <20>Լ<EFBFBD>
|
||||
virtual Siege::eReturn Process() { return Siege::RET_OK; }
|
||||
|
||||
// Cmd ó<><C3B3> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
|
||||
virtual bool CancelBuild() { return false; }
|
||||
virtual bool Cancel() { return false; }
|
||||
virtual bool Build(unsigned short wType, unsigned char cDevelopTime, unsigned long dwDevelopGold = 0, unsigned long dwOwnerID = 0) { return false; }
|
||||
virtual bool Upgrade(unsigned char cUpgradeTime, unsigned long dwUpgradeGold = 0, unsigned char cUpgradeType = Siege::NO_JEWEL) { return false; }
|
||||
virtual bool Repair(unsigned long dwRepairHP, unsigned long dwRepairGold = 0) { return false; }
|
||||
virtual bool Restore(unsigned char cRestoreTime, unsigned long dwRestoreGold = 0) { return false; }
|
||||
virtual bool Destroy(unsigned long dwEnemyNation = 0, bool bDeductFame = false) { return false; }
|
||||
virtual bool ChangeType(unsigned short wType) { return false; }
|
||||
|
||||
virtual void UpdateRewardFame() { }
|
||||
|
||||
virtual void UpdateLastUseTime(bool bInit=false);
|
||||
virtual void UpdateHP(unsigned long dwNowHP) { m_dwHP = dwNowHP; }
|
||||
virtual bool ToStartKit() { return false; }
|
||||
|
||||
// To GameServer
|
||||
void SendCampCmd(unsigned char cSubCmd, unsigned long dwValue1=0, unsigned long dwValue2=0);
|
||||
void SendCastleCmd(unsigned long dwValue, unsigned char cSubCmd);
|
||||
void SendSiegeArmsCmd(unsigned long dwValue, unsigned char cSubCmd);
|
||||
|
||||
// Get / Set <20>Լ<EFBFBD>
|
||||
bool IsEmblem() const { return (Siege::EMBLEM == m_wObjectType); }
|
||||
bool IsCamp() const;
|
||||
bool IsGate() const { return (Siege::GATE == m_wObjectType); }
|
||||
bool IsGuard() const { return (Siege::GUARD == m_wObjectType); }
|
||||
bool IsCastleObject() const;
|
||||
bool IsCastleArms() const;
|
||||
bool IsSiegeArms() const;
|
||||
bool IsRidable() const;
|
||||
bool IsWorldWeapon() const;
|
||||
|
||||
unsigned long GetCID() const { return m_dwCID; }
|
||||
unsigned long GetGID() const { return m_dwGID; } // <20><><EFBFBD><EFBFBD>!! <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
unsigned long GetNation() const { return m_cNation; } // <20><><EFBFBD><EFBFBD>!! <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>鸸 <20><><EFBFBD><EFBFBD>
|
||||
unsigned long GetNowHP() const { return m_dwHP; }
|
||||
unsigned char GetState() const { return m_cState; }
|
||||
unsigned char GetSubState() const { return m_cSubState; }
|
||||
unsigned char GetUpgradeStep() const { return m_cUpgradeStep; }
|
||||
unsigned char GetZone() const { return m_cZone; }
|
||||
unsigned char GetChannel() const { return m_cChannel; }
|
||||
const Position& GetPosition() const { return m_Pos; }
|
||||
unsigned char GetMaterialNum() const { return m_cMaterial; }
|
||||
unsigned char GetSiegeCount() const { return m_cSiegeCount; }
|
||||
unsigned short GetObjectType() const { return m_wObjectType; }
|
||||
unsigned char GetDevelopTime() const { return m_cDevelopTime; }
|
||||
unsigned char GetUpgradeTime() const { return m_cUpgradeTime; }
|
||||
unsigned char GetRepairTime() const { return m_cRepairTime; }
|
||||
unsigned char GetChangeTime() const { return m_cChangeTime; }
|
||||
|
||||
const TIME& GetTimeValue() const { return m_TimeValue; }
|
||||
const TIME& GetLastUseTime() const { return m_LastUseTime; }
|
||||
|
||||
unsigned long GetCastleID() const { return m_dwCampOrCastleID; } // <20><> <20><>¡<EFBFBD><C2A1>, <20><><EFBFBD><EFBFBD>/<2F><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
unsigned long GetCampID() const { return m_dwCampOrCastleID; } // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
unsigned long GetOwnerID() const { return m_dwOwnerID; } // <20>ٰŸ<D9B0>/<2F><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>ٰŸ<D9B0>/<2F><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
void SetGID(unsigned long dwGID); // <20><><EFBFBD><EFBFBD>!! <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
void SetNation(unsigned char cNation); // <20><><EFBFBD><EFBFBD>!! <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>鸸 <20><><EFBFBD><EFBFBD>
|
||||
void SetZoneChannel(unsigned char cZone, unsigned char cChannel);
|
||||
virtual void SetMaterialNum(unsigned char cMaterial);
|
||||
void SetSiegeCount(unsigned char cSiegeCount) { m_cSiegeCount = cSiegeCount; }
|
||||
|
||||
protected:
|
||||
|
||||
CSiegeObjectDB(CDBComponent& DBComponent, const CastleObjectInfoDB& CastleObject);
|
||||
CSiegeObjectDB(CDBComponent& DBComponent, const CampInfoDB& CampInfo);
|
||||
|
||||
CSiegeObjectDB(CDBComponent& DBComponent, unsigned long dwCampID,
|
||||
unsigned long dwGID, unsigned char cZone, unsigned char cChannel, Position Pos);
|
||||
|
||||
CSiegeObjectDB(CDBComponent& DBComponent, unsigned long dwOwnerID,
|
||||
unsigned char cNation, unsigned short wObjectType, unsigned char cUpgradeStep,
|
||||
unsigned char cZone, unsigned char cChannel, Position Pos);
|
||||
|
||||
void SetCID(unsigned long dwCID) { m_dwCID = dwCID; }
|
||||
|
||||
unsigned long m_dwCID; // CID : SIEGE_OBJECT_BIT <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CreatureID
|
||||
unsigned long m_dwCampOrCastleID; // CampID : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
// CastleID : <20><> <20><>¡<EFBFBD><C2A1>, <20><><EFBFBD><EFBFBD>, <20><EFBFBD>, <20><><EFBFBD><EFBFBD>, <20>ٰŸ<D9B0>/<2F><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ID
|
||||
unsigned long m_dwOwnerID; // CID : <20>ٰŸ<D9B0>/<2F><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20>ٰŸ<D9B0>/<2F><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
unsigned long m_dwGID; // GID : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ID (<28><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
unsigned char m_cNation; // <20><> <20><>¡<EFBFBD><C2A1>, <20><><EFBFBD><EFBFBD>, <20><EFBFBD>, <20><><EFBFBD><EFBFBD>, <20>ٰŸ<D9B0>/<2F><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>鸸 <20><><EFBFBD><EFBFBD>)
|
||||
unsigned long m_dwHP; // HP
|
||||
|
||||
unsigned short m_wObjectType; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ Ÿ<><C5B8>
|
||||
unsigned char m_cState; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD>
|
||||
unsigned char m_cSubState; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (Use EMBLEM & GATE)
|
||||
unsigned char m_cUpgradeStep; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><D7B7>̵<EFBFBD> <20>ܰ<EFBFBD>
|
||||
unsigned char m_cUpgradeType; // <20><> <20><>¡<EFBFBD><C2A1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><D7B7>̵<EFBFBD> Ÿ<><C5B8> (Only EMBLEM)
|
||||
|
||||
unsigned char m_cDevelopTime; // <20><><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>)<29><> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ð<EFBFBD> (<28><>)
|
||||
unsigned char m_cUpgradeTime; // <20><><EFBFBD><EFBFBD><D7B7>̵忡 <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ð<EFBFBD> (<28><>)
|
||||
unsigned char m_cRepairTime; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ð<EFBFBD> (<28><>)
|
||||
unsigned char m_cChangeTime; // Ÿ<><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ð<EFBFBD> (<28><>)
|
||||
|
||||
unsigned char m_cZone; // <20><> (Only CAMP)
|
||||
unsigned char m_cChannel; // ä<><C3A4> (Only CAMP)
|
||||
TIME m_TimeValue; // <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
TIME m_LastUseTime; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD> (Use CAMP & SIEGE_ARMS & CASTLE_ARMS)
|
||||
Position m_Pos; // <20><>ġ
|
||||
unsigned char m_cMaterial; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
unsigned char m_cSiegeCount; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ƚ<><C8BD>
|
||||
|
||||
unsigned long m_dwRepairHP; // <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD><CFB7><EFBFBD> ȸ<><C8B8><EFBFBD><EFBFBD> HP <20><>
|
||||
float m_fDefaultDir; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>⺻ <20><><EFBFBD><EFBFBD>
|
||||
|
||||
CDBComponent& m_DBComponent; // DB
|
||||
|
||||
friend class CSiegeObjectDBMgr;
|
||||
};
|
||||
|
||||
#endif // _RYL_DBAGENT_SIEGE_OBJECT_DB_H_
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,126 @@
|
||||
#ifndef _SIEGE_OBJECT_MANAGER_H_
|
||||
#define _SIEGE_OBJECT_MANAGER_H_
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <map>
|
||||
#include <list>
|
||||
#include <boost/pool/pool.hpp>
|
||||
#include <boost/pool/pool_alloc.hpp>
|
||||
#include <Creature/Siege/SiegeConstants.h>
|
||||
#include <Network/Packet/PacketStruct/CastlePacket.h>
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
class CSendStream;
|
||||
class CDBComponent;
|
||||
class CSiegeObjectDB;
|
||||
class CCampDB;
|
||||
|
||||
class CSiegeObjectDBMgr
|
||||
{
|
||||
public:
|
||||
|
||||
static CSiegeObjectDBMgr& GetInstance();
|
||||
|
||||
// Ÿ<><C5B8> <20><><EFBFBD><EFBFBD>
|
||||
typedef std::map<unsigned long, CSiegeObjectDB*> SiegeObjectMap; // < CID, CSiegeObjectDB* >
|
||||
typedef std::map<unsigned long, CCampDB*> CampMap; // < CampID, CCampDB* >
|
||||
|
||||
bool Initialize(CDBComponent& DBComponent);
|
||||
void Process();
|
||||
void UpdateSiegeCount(); // <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> Ƚ<><C8BD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
|
||||
void UpdateRewardFame(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> Ƚ<><C8BD> <20><><EFBFBD><EFBFBD>
|
||||
void DecreaseWeaponRemainSiegeTime(); // <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD>ȴ<EFBFBD>.
|
||||
|
||||
// DB <20><><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>Լ<EFBFBD>
|
||||
CSiegeObjectDB* CreateCastleObject(CastleObjectInfoDB& CastleObject);
|
||||
CSiegeObjectDB* CreateCamp(CampInfoDB& CampInfo, unsigned long dwCID=0);
|
||||
CSiegeObjectDB* CreateMiningCamp(CampInfoDB& CampInfo, unsigned long dwCID=0);
|
||||
CSiegeObjectDB* CreateCampShop(CampInfoDB& CampInfo, unsigned long dwCID=0);
|
||||
CSiegeObjectDB* CreateWorldWeapon(CampInfoDB& CampInfo, unsigned long dwCID=0);
|
||||
|
||||
// <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD> <20><>û<EFBFBD><C3BB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> DB <20><> <20>߰<EFBFBD><DFB0>ϴ<EFBFBD> <20>Լ<EFBFBD>
|
||||
CSiegeObjectDB* CreateCamp(unsigned long dwGID, unsigned char cZone, unsigned char cChannel, POS Pos);
|
||||
CSiegeObjectDB* CreateWorldWeapon(unsigned long dwGID, unsigned short wObjectType, unsigned char cZone, unsigned char cChannel, POS Pos);
|
||||
CSiegeObjectDB* CreateSiegeArms(unsigned long dwOwnerID, unsigned char cNation, unsigned char cZone, unsigned char cChannel,
|
||||
unsigned short wObjectType, unsigned char cUpgradeStep, POS Pos);
|
||||
|
||||
// Get <20>Լ<EFBFBD>
|
||||
CCampDB* GetCamp(unsigned long dwCampID);
|
||||
CSiegeObjectDB* GetSiegeObject(unsigned long dwObjectID);
|
||||
unsigned char GetWorldWeaponNation(unsigned char cZone, unsigned char cChannel) const; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
void DeleteWorldWeaponNation(unsigned char cZone, unsigned char cChannel); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
|
||||
void UpdateWorldWeaponInfo(unsigned char cZone, unsigned char cChannel, unsigned char cOwenrNation,
|
||||
unsigned char cDestroyedWeaponNation, unsigned char cRemainSiegeTime);
|
||||
bool HasCampByGID(unsigned long dwGID, unsigned long dwExceptCampID=0);
|
||||
|
||||
// <20><>ü <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
|
||||
bool DeleteSiegeObject(unsigned long dwCID);
|
||||
bool DeleteSiegeObject(CSiegeObjectDB* lpObject);
|
||||
CampMap::iterator DeleteCamp(unsigned long dwCampID);
|
||||
|
||||
int DestroyCamp(unsigned long dwGID); // <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ı<EFBFBD>, <20>ı<EFBFBD><C4B1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
void DestroySiegeArms(unsigned long dwOnwerCID); // <20><><EFBFBD><EFBFBD> Ż<><C5BB><EFBFBD><EFBFBD> <20>ش<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⸦ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>
|
||||
void DestoryAllSiegeArms(); // <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
|
||||
bool ChangeCampType(unsigned long dwCampID, unsigned short wChangeType);
|
||||
|
||||
// GameServer <20><><EFBFBD><EFBFBD> Send <20>Լ<EFBFBD>
|
||||
void SendWorldWeaponInfo(CSendStream& SendStream, unsigned char cZone, unsigned char cChannel);
|
||||
void SendCampInfo(CSendStream& SendStream, unsigned char cZone, unsigned char cChannel);
|
||||
void SendSiegeArmsInfo(CSendStream& SendStream, unsigned char cZone, unsigned char cChannel);
|
||||
void SendProcessMining(unsigned long dwProcessType);
|
||||
|
||||
bool SerializeOutCastleObject(CSiegeObjectDB* lpObject_In, char* lpBuffer_Out, unsigned short& wBufferSize_Out);
|
||||
|
||||
private:
|
||||
|
||||
CSiegeObjectDBMgr();
|
||||
~CSiegeObjectDBMgr();
|
||||
|
||||
// CSiegeObjectDBMgr <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> Ÿ<><C5B8> <20><><EFBFBD><EFBFBD>
|
||||
typedef struct _WorldWeaponInfo
|
||||
{
|
||||
unsigned char m_cWorldWeaponNation; // <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
unsigned char m_cKarRemainSiegeTime; // ī<><C4AB><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ð<EFBFBD>
|
||||
unsigned char m_cMerRemainSiegeTime; // <20><EFBFBD>ī<EFBFBD><C4AB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ð<EFBFBD>
|
||||
} WorldWeaponInfo;
|
||||
|
||||
typedef std::map<unsigned long, WorldWeaponInfo> WorldWeaponInfoMap; // < dwZoneChannel, WorldWeaponInfo >
|
||||
// dwZoneChannel : Zone(16bit) | Channel(16bit)
|
||||
bool ReadCastleObjectInfoDB();
|
||||
bool ReadWorldWeaponInfoDB();
|
||||
bool ReadCampInfoDB();
|
||||
|
||||
unsigned long GetBlankIndex();
|
||||
|
||||
void CreateDummyCamp();
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>Լ<EFBFBD>
|
||||
CSiegeObjectDB* CreateCastleObjectDB(const CastleObjectInfoDB& CastleObject);
|
||||
CSiegeObjectDB* CreateCampDB(const CampInfoDB& CampInfo);
|
||||
CSiegeObjectDB* CreateMiningCampDB(const CampInfoDB& CampInfo);
|
||||
CSiegeObjectDB* CreateCampShopDB(const CampInfoDB& CampInfo);
|
||||
CSiegeObjectDB* CreateWorldWeaponDB(const CampInfoDB& CampInfo);
|
||||
|
||||
CSiegeObjectDB* CreateCampDB(unsigned long dwCampID, unsigned long dwGID,
|
||||
unsigned char cZone, unsigned char cChannel, Position Pos);
|
||||
CSiegeObjectDB* CreateWorldWeaponDB(unsigned long dwCampID, unsigned long dwGID, unsigned short wObjectType,
|
||||
unsigned char cZone, unsigned char cChannel, Position Pos);
|
||||
CSiegeObjectDB* CreateSiegeArmsDB(unsigned long dwOwnerID,
|
||||
unsigned char cNation, unsigned short wObjectType, unsigned char cUpgradeStep,
|
||||
unsigned char cZone, unsigned char cChannel, Position Pos);
|
||||
|
||||
void DeleteSiegeObjectDB(CSiegeObjectDB* lpSiegeObjectDB);
|
||||
|
||||
SiegeObjectMap m_SiegeObjectMap;
|
||||
CampMap m_CampMap;
|
||||
WorldWeaponInfoMap m_WorldWeaponInfoMap;
|
||||
CDBComponent* m_lpDBComponent;
|
||||
};
|
||||
|
||||
#endif // _SIEGE_OBJECT_MANAGER_H_
|
||||
@@ -0,0 +1,183 @@
|
||||
#include "stdafx.h"
|
||||
#include "WorldWeaponDB.h"
|
||||
#include "SiegeObjectDBMgr.h"
|
||||
|
||||
#include <DB/DBComponent.h>
|
||||
#include <Castle/CastleDBComponent.h>
|
||||
|
||||
#include <Community/Guild/GuildDB.h>
|
||||
#include <Community/Guild/GuildDBMgr.h>
|
||||
|
||||
#include <Network/Packet/WrapPacket.h>
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
#include <Network/Packet/PacketStruct/ServerInfo.h>
|
||||
#include <Network/Dispatch/GameDispatch.h>
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
|
||||
CWorldWeaponDB::CWorldWeaponDB(CDBComponent& DBComponent, unsigned long dwCampID, unsigned long dwGID, unsigned short wObjectType,
|
||||
unsigned char cZone, unsigned char cChannel, Position Pos)
|
||||
: CCampDB(DBComponent, dwCampID, dwGID, cZone, cChannel, Pos), m_iFireX(0), m_iFireZ(0)
|
||||
{
|
||||
m_wObjectType = wObjectType;
|
||||
}
|
||||
|
||||
CWorldWeaponDB::CWorldWeaponDB(CDBComponent& DBComponent, const CampInfoDB& CampInfo)
|
||||
: CCampDB(DBComponent, CampInfo), m_iFireX(0), m_iFireZ(0)
|
||||
{
|
||||
}
|
||||
|
||||
CWorldWeaponDB::~CWorldWeaponDB()
|
||||
{
|
||||
}
|
||||
|
||||
bool CWorldWeaponDB::UpdateWeaponState(unsigned char cWeaponState, unsigned long dwValue1, unsigned long dwValue2)
|
||||
{
|
||||
if (Siege::WEAPON_CHARGE != cWeaponState && Siege::WEAPON_FIRE != cWeaponState)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (cWeaponState)
|
||||
{
|
||||
case Siege::WEAPON_CHARGE: m_cChargeTime = static_cast<unsigned char>(dwValue1); break;
|
||||
case Siege::WEAPON_FIRE: m_iFireX = static_cast<int>(dwValue1); m_iFireZ = static_cast<int>(dwValue2); break;
|
||||
}
|
||||
|
||||
m_cSubState = cWeaponState;
|
||||
|
||||
SYSTEMTIME sysTime;
|
||||
GetLocalTime(&sysTime);
|
||||
|
||||
m_TimeValue.Year = sysTime.wYear;
|
||||
m_TimeValue.Month = sysTime.wMonth;
|
||||
m_TimeValue.Day = sysTime.wDay;
|
||||
m_TimeValue.Hour = sysTime.wHour;
|
||||
m_TimeValue.Minute = sysTime.wMinute;
|
||||
m_TimeValue.Second = sysTime.wSecond;
|
||||
|
||||
DBComponent::CastleDB::UpdateCampSubState(m_DBComponent, GetCampID(), m_cSubState);
|
||||
DBComponent::CastleDB::UpdateCampTime(m_DBComponent, GetCampID(), Siege::TYPE_REMAIN_TIME, sysTime);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CWorldWeaponDB::Fire()
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ı<EFBFBD> <20><><EFBFBD><EFBFBD> DB <20><> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
|
||||
if (Siege::KARTERANT_WEAPON == m_wObjectType)
|
||||
{
|
||||
DBComponent::CastleDB::InsertWorldWeaponInfo(m_DBComponent, GetZone(), GetChannel(), Creature::KARTERANT);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
CSiegeObjectDBMgr::GetInstance().UpdateWorldWeaponInfo(GetZone(), GetChannel(), Creature::STATELESS,
|
||||
Creature::KARTERANT, Siege::WEAPON_REBUILD_SIEGE_TIME_COUNT);
|
||||
}
|
||||
else if (Siege::MERKADIA_WEAPON == m_wObjectType)
|
||||
{
|
||||
DBComponent::CastleDB::InsertWorldWeaponInfo(m_DBComponent, GetZone(), GetChannel(), Creature::MERKADIA);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
CSiegeObjectDBMgr::GetInstance().UpdateWorldWeaponInfo(GetZone(), GetChannel(), Creature::STATELESS,
|
||||
Creature::MERKADIA, Siege::WEAPON_REBUILD_SIEGE_TIME_COUNT);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Siege::eReturn CWorldWeaponDB::Process()
|
||||
{
|
||||
CTime nowTime = CTime::GetCurrentTime();
|
||||
CTimeSpan timeSpan(0);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD> <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD> (<28><><EFBFBD><EFBFBD>)
|
||||
if (Siege::COMPLETE == m_cState && Siege::WEAPON_CHARGE == m_cSubState)
|
||||
{
|
||||
if (0 != m_TimeValue.Year)
|
||||
{
|
||||
CTime chargeTime(m_TimeValue.Year, m_TimeValue.Month, m_TimeValue.Day,
|
||||
m_TimeValue.Hour, m_TimeValue.Minute, m_TimeValue.Second);
|
||||
|
||||
timeSpan = nowTime - chargeTime;
|
||||
if (timeSpan.GetTotalMinutes() >= m_cChargeTime)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD>
|
||||
m_cSubState = Siege::WEAPON_READY;
|
||||
|
||||
// DB<44><42> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
SYSTEMTIME sysTime;
|
||||
::memset(&sysTime, 0, sizeof(SYSTEMTIME));
|
||||
::memset(&m_TimeValue, 0, sizeof(TIME));
|
||||
|
||||
DBComponent::CastleDB::UpdateCampSubState(m_DBComponent, GetCampID(), m_cSubState);
|
||||
DBComponent::CastleDB::UpdateCampTime(m_DBComponent, GetCampID(), Siege::TYPE_REMAIN_TIME, sysTime);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
|
||||
SendCampCmd(PktCampCmd::WORLDWEAPON_CHARGE_COMPLETE);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// <20><EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
PktCampMessage pktCampMessage;
|
||||
memset(&pktCampMessage, 0, sizeof(PktCampMessage));
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD>
|
||||
// <20><EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20><>ȣ, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>
|
||||
pktCampMessage.m_cMsgCmd = PktCampMessage::MSGCMD_WEAPON_CHARGE_END;
|
||||
pktCampMessage.m_dwCampID = GetCampID();
|
||||
pktCampMessage.m_dwGID = m_dwGID;
|
||||
pktCampMessage.m_cZone = m_cZone;
|
||||
pktCampMessage.m_bNotify = true;
|
||||
|
||||
Guild::CGuildDB* lpGuild = static_cast<Guild::CGuildDB *>(
|
||||
Guild::CGuildDBMgr::GetInstance().GetGuild(m_dwGID));
|
||||
|
||||
if (lpGuild)
|
||||
{
|
||||
pktCampMessage.m_cNation = lpGuild->GetNation();
|
||||
}
|
||||
|
||||
if (PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage, 0, 0))
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktCampMessage), sizeof(PktCampMessage), CmdCampMessage));
|
||||
}
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
return RET_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return CCampDB::Process();
|
||||
}
|
||||
|
||||
bool CWorldWeaponDB::Cancel()
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
CSiegeObjectDBMgr::GetInstance().DeleteWorldWeaponNation(GetZone(), GetChannel());
|
||||
|
||||
return CCampDB::Cancel();
|
||||
}
|
||||
|
||||
bool CWorldWeaponDB::Destroy(unsigned long dwEnemyGID, bool bDeductFame)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ı<EFBFBD> <20><><EFBFBD><EFBFBD> DB <20><> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
|
||||
if (Siege::KARTERANT_WEAPON == m_wObjectType)
|
||||
{
|
||||
DBComponent::CastleDB::InsertWorldWeaponInfo(m_DBComponent, GetZone(), GetChannel(), Creature::KARTERANT);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
CSiegeObjectDBMgr::GetInstance().UpdateWorldWeaponInfo(GetZone(), GetChannel(), Creature::STATELESS,
|
||||
Creature::KARTERANT, Siege::WEAPON_REBUILD_SIEGE_TIME_COUNT);
|
||||
}
|
||||
else if (Siege::MERKADIA_WEAPON == m_wObjectType)
|
||||
{
|
||||
DBComponent::CastleDB::InsertWorldWeaponInfo(m_DBComponent, GetZone(), GetChannel(), Creature::MERKADIA);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
CSiegeObjectDBMgr::GetInstance().UpdateWorldWeaponInfo(GetZone(), GetChannel(), Creature::STATELESS,
|
||||
Creature::MERKADIA, Siege::WEAPON_REBUILD_SIEGE_TIME_COUNT);
|
||||
}
|
||||
|
||||
return CCampDB::Destroy(dwEnemyGID, bDeductFame);
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
// File Name: WorldWeaponDB.h
|
||||
//
|
||||
// Programmer: Zergra( Park Jongtae ) in GamaSoft corp.
|
||||
//
|
||||
// File Desciption: <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> DB
|
||||
//
|
||||
// Date: 2004. 12. 14. (ȭ)
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
#ifndef _RYL_DBAGENT_WORLD_WEAPON_DB_H_
|
||||
#define _RYL_DBAGENT_WORLD_WEAPON_DB_H_
|
||||
|
||||
#pragma once
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
// Headers
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
#include "CampDB.h"
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
// Classes
|
||||
//--------------------------------------------------------------------------------------------------------------------------
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// class CWorldWeaponDB
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
class CWorldWeaponDB : public CCampDB
|
||||
{
|
||||
public:
|
||||
virtual ~CWorldWeaponDB();
|
||||
|
||||
// Process <20>Լ<EFBFBD>
|
||||
Siege::eReturn Process();
|
||||
|
||||
// Cmd ó<><C3B3> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
|
||||
bool Cancel(); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD>
|
||||
bool Destroy(unsigned long dwEnemyGID = 0, bool bDeductFame = false);
|
||||
|
||||
bool UpdateWeaponState(unsigned char cWeaponState, unsigned long dwValue1, unsigned long dwValue2);
|
||||
bool Fire();
|
||||
|
||||
protected:
|
||||
|
||||
// Client <20><> <20><>û<EFBFBD><C3BB><EFBFBD><EFBFBD> <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
CWorldWeaponDB(CDBComponent& DBComponent, unsigned long dwCampID, unsigned long dwGID, unsigned short wObjectType,
|
||||
unsigned char cZone, unsigned char cChannel, Position Pos);
|
||||
|
||||
// DB <20><><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD>
|
||||
CWorldWeaponDB(CDBComponent& DBComponent, const CampInfoDB& CampInfo);
|
||||
|
||||
unsigned char m_cChargeTime;
|
||||
int m_iFireX, m_iFireZ;
|
||||
|
||||
friend class CSiegeObjectDBMgr;
|
||||
};
|
||||
|
||||
#endif //_RYL_DBAGENT_WORLD_WEAPON_DB_H_
|
||||
@@ -0,0 +1,265 @@
|
||||
#include "stdafx.h"
|
||||
|
||||
#include "StatueDBMgr.h"
|
||||
|
||||
#include <DB/DBComponent.h>
|
||||
#include <Log/ServerLog.h>
|
||||
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
#include <Network/Packet/WrapPacket.h>
|
||||
#include <Network/Packet/PacketStruct/CastlePacket.h>
|
||||
#include <Network/Stream/SendStream.h>
|
||||
#include <Network/Dispatch/GameDispatch.h>
|
||||
|
||||
#include <Creature/Monster/MonsterStructure.h>
|
||||
|
||||
CStatueDBMgr& CStatueDBMgr::GetInstance()
|
||||
{
|
||||
static CStatueDBMgr ms_this;
|
||||
return ms_this;
|
||||
}
|
||||
|
||||
CStatueDBMgr::CStatueDBMgr()
|
||||
: m_lpDBComponent(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
CStatueDBMgr::~CStatueDBMgr()
|
||||
{
|
||||
ClearStatueMap();
|
||||
}
|
||||
|
||||
bool CStatueDBMgr::Initialize(CDBComponent& DBComponent)
|
||||
{
|
||||
ClearStatueMap();
|
||||
m_lpDBComponent = &DBComponent;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <20><>ũ ī<><C4AB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> or <20>ű<EFBFBD><C5B1><EFBFBD>
|
||||
if (true == CServerSetup::GetInstance().UseContents(GameRYL::STONE_BATTLE))
|
||||
// || true == CServerSetup::GetInstance().UseContents(GameRYL::NEWZONE_ZONE9))
|
||||
{
|
||||
const int MAX_ROWS = 1000;
|
||||
int nGetRows = 0;
|
||||
|
||||
char szBuffer[CDBComponent::QUERY_BUFFER_LEN];
|
||||
_snprintf(szBuffer, CDBComponent::QUERY_BUFFER_LEN - 1,
|
||||
"SELECT "
|
||||
"TblStatueInfo.nIndex, "
|
||||
"TblStatueInfo.tnChannel, "
|
||||
"TblStatueInfo.snKID, "
|
||||
"TblStatueInfo.nLostHP FROM TblStatueInfo ");
|
||||
|
||||
szBuffer[CDBComponent::QUERY_BUFFER_LEN - 1] = 0;
|
||||
if (0 == m_lpDBComponent || !m_lpDBComponent->ExecuteQuery(szBuffer))
|
||||
{
|
||||
ERRLOG0(g_Log, "Statue DB <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>");
|
||||
return false;
|
||||
}
|
||||
|
||||
StatueInfoDB* statueInfo = new StatueInfoDB[MAX_ROWS];
|
||||
memset(statueInfo, 0, sizeof(StatueInfoDB) * MAX_ROWS);
|
||||
|
||||
while (m_lpDBComponent->GetData((void**)statueInfo, sizeof(StatueInfoDB), MAX_ROWS, &nGetRows))
|
||||
{
|
||||
if (0 == nGetRows) { break; }
|
||||
|
||||
for (StatueInfoDB* lpStatueInfo = statueInfo; nGetRows > 0; --nGetRows, ++lpStatueInfo)
|
||||
{
|
||||
StatueInfoDB* lpStatue = CreateStatue(*lpStatueInfo);
|
||||
if (NULL != lpStatue)
|
||||
{
|
||||
unsigned long dwKey = CalcKeyValue(lpStatue->m_dwIndex, lpStatue->m_cChannel);
|
||||
if (!m_StatueMap.insert(std::make_pair(dwKey, lpStatue)).second)
|
||||
{
|
||||
ERRLOG2(g_Log, "Statue DB<44><42> <20>ߺ<EFBFBD><DFBA><EFBFBD> Ű<><C5B0><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>. Index: %d / Channel: %d",
|
||||
lpStatue->m_dwIndex, lpStatue->m_cChannel);
|
||||
|
||||
memset(statueInfo, 0, sizeof(StatueInfoDB) * MAX_ROWS);
|
||||
delete [] statueInfo;
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG2(g_Log, "Statue DB <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴµ<CFB4> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>. Index: %d / Channel: %d",
|
||||
lpStatueInfo->m_dwIndex, lpStatueInfo->m_cChannel);
|
||||
|
||||
memset(statueInfo, 0, sizeof(StatueInfoDB) * MAX_ROWS);
|
||||
delete [] statueInfo;
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
memset(statueInfo, 0, sizeof(StatueInfoDB) * MAX_ROWS);
|
||||
}
|
||||
|
||||
delete [] statueInfo;
|
||||
|
||||
SERLOG0(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Initalize <20><><EFBFBD><EFBFBD>.");
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
unsigned long CStatueDBMgr::CalcKeyValue(unsigned long dwIndex, unsigned char cChannel) const
|
||||
{
|
||||
return static_cast<unsigned long>( (dwIndex << 16) | (cChannel) );
|
||||
}
|
||||
|
||||
bool CStatueDBMgr::UpdateKID(unsigned long dwIndex, unsigned char cChannel, unsigned short wNewKID)
|
||||
{
|
||||
unsigned long dwKey = CalcKeyValue(dwIndex, cChannel);
|
||||
StatueMap::iterator itr = m_StatueMap.find(dwKey);
|
||||
if (itr == m_StatueMap.end())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
char szBuffer[CDBComponent::QUERY_BUFFER_LEN];
|
||||
_snprintf(szBuffer, CDBComponent::QUERY_BUFFER_LEN - 1,
|
||||
"UPDATE TblStatueInfo SET snKID=%d WHERE nIndex=%d and tnChannel=%d",
|
||||
wNewKID, dwIndex, cChannel);
|
||||
szBuffer[CDBComponent::QUERY_BUFFER_LEN - 1] = 0;
|
||||
|
||||
if (0 == m_lpDBComponent || !m_lpDBComponent->ExecuteQuery(szBuffer))
|
||||
{
|
||||
ERRLOG0(g_Log, "Statue KID DB Update <20><><EFBFBD><EFBFBD>");
|
||||
return false;
|
||||
}
|
||||
|
||||
StatueInfoDB* lpStatue = itr->second;
|
||||
if (0 != lpStatue)
|
||||
{
|
||||
lpStatue->m_wKID = wNewKID;
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG0(g_Log, "Statue KID Update <20><><EFBFBD><EFBFBD>");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CStatueDBMgr::UpdateLostHP(unsigned long dwIndex, unsigned char cChannel, unsigned long dwLostHP)
|
||||
{
|
||||
unsigned long dwKey = CalcKeyValue(dwIndex, cChannel);
|
||||
StatueMap::iterator itr = m_StatueMap.find(dwKey);
|
||||
if (itr == m_StatueMap.end())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
char szBuffer[CDBComponent::QUERY_BUFFER_LEN];
|
||||
_snprintf(szBuffer, CDBComponent::QUERY_BUFFER_LEN - 1,
|
||||
"UPDATE TblStatueInfo SET nLostHP=%d WHERE nIndex=%d and tnChannel=%d",
|
||||
dwLostHP, dwIndex, cChannel);
|
||||
szBuffer[CDBComponent::QUERY_BUFFER_LEN - 1] = 0;
|
||||
|
||||
if (0 == m_lpDBComponent || !m_lpDBComponent->ExecuteQuery(szBuffer))
|
||||
{
|
||||
ERRLOG0(g_Log, "Statue LostHP DB Update <20><><EFBFBD><EFBFBD>");
|
||||
return false;
|
||||
}
|
||||
|
||||
StatueInfoDB* lpStatue = itr->second;
|
||||
if (0 != lpStatue)
|
||||
{
|
||||
lpStatue->m_dwLostHP = dwLostHP;
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG0(g_Log, "Statue LostHP DB Update <20><><EFBFBD><EFBFBD>");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CStatueDBMgr::SendStatueInfo(CSendStream& SendStream, unsigned char cChannel)
|
||||
{
|
||||
const unsigned int MAX_STATUE_INFO = sizeof(PktStatueCmd) + sizeof(StatueInfo) * 100;
|
||||
char szBuffer[MAX_STATUE_INFO];
|
||||
PktStatueCmd* lpPktStatueCmd = reinterpret_cast<PktStatueCmd*>(szBuffer);
|
||||
StatueInfo* lpStatueInfo = reinterpret_cast<StatueInfo*>(lpPktStatueCmd + 1);
|
||||
|
||||
unsigned short wSize = 0;
|
||||
unsigned short wStatueNum = 0;
|
||||
|
||||
StatueMap::const_iterator itr = m_StatueMap.begin();
|
||||
StatueMap::const_iterator end = m_StatueMap.end();
|
||||
|
||||
while (itr != end)
|
||||
{
|
||||
const StatueInfoDB* lpStatue = itr->second;
|
||||
if (0 != lpStatue)
|
||||
{
|
||||
if (lpStatue->m_cChannel == cChannel)
|
||||
{
|
||||
lpStatueInfo->m_dwIndex = lpStatue->m_dwIndex;
|
||||
lpStatueInfo->m_wKID = lpStatue->m_wKID;
|
||||
lpStatueInfo->m_dwLostHP = lpStatue->m_dwLostHP;
|
||||
|
||||
++lpStatueInfo;
|
||||
++wStatueNum;
|
||||
wSize += sizeof(StatueInfo);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG0( g_Log, "Null StatueInfo <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD>ԵǾ<D4B5> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>." ) ;
|
||||
}
|
||||
|
||||
++itr;
|
||||
}
|
||||
|
||||
if (wStatueNum > 0)
|
||||
{
|
||||
lpPktStatueCmd->m_wSubCmd = PktStatueCmd::CMD_INFO;
|
||||
lpPktStatueCmd->m_dwValue = wStatueNum;
|
||||
lpPktStatueCmd->m_wSize = wSize;
|
||||
|
||||
SendStream.WrapCompress(szBuffer,
|
||||
static_cast<unsigned short>(sizeof(PktStatueCmd) + wSize), CmdStatueCmd, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
StatueInfoDB* CStatueDBMgr::CreateStatue( const StatueInfoDB& statueInfo )
|
||||
{
|
||||
StatueInfoDB* lpStatue = new StatueInfoDB;
|
||||
if (0 != lpStatue)
|
||||
{
|
||||
lpStatue->m_dwIndex = statueInfo.m_dwIndex;
|
||||
lpStatue->m_cChannel = statueInfo.m_cChannel;
|
||||
lpStatue->m_wKID = statueInfo.m_wKID;
|
||||
lpStatue->m_dwLostHP = statueInfo.m_dwLostHP;
|
||||
}
|
||||
|
||||
return lpStatue;
|
||||
}
|
||||
|
||||
void CStatueDBMgr::ClearStatueMap()
|
||||
{
|
||||
if (!m_StatueMap.empty())
|
||||
{
|
||||
StatueMap::iterator itr = m_StatueMap.begin();
|
||||
StatueMap::iterator end = m_StatueMap.end();
|
||||
|
||||
while (itr != end)
|
||||
{
|
||||
if (itr->second)
|
||||
{
|
||||
delete itr->second;
|
||||
itr->second = NULL;
|
||||
}
|
||||
|
||||
++itr;
|
||||
}
|
||||
|
||||
m_StatueMap.clear();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
#ifndef _RYL_DBAGENT_STATUE_DB_MANAGER_H_
|
||||
#define _RYL_DBAGENT_STATUE_DB_MANAGER_H_
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> DB <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><>ü
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <map>
|
||||
#include <Network/Packet/PacketStruct/CastlePacket.h>
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
class CDBComponent;
|
||||
class CSendStream;
|
||||
|
||||
class CStatueDBMgr
|
||||
{
|
||||
public:
|
||||
static CStatueDBMgr& GetInstance();
|
||||
|
||||
// <Key, StatueInfo*> : Key = (Index << 16) | (Channel)
|
||||
typedef std::map<unsigned long, StatueInfoDB*> StatueMap;
|
||||
|
||||
|
||||
bool Initialize(CDBComponent& DBComponent);
|
||||
|
||||
unsigned long CalcKeyValue(unsigned long dwIndex, unsigned char cChannel) const;
|
||||
|
||||
bool UpdateKID(unsigned long dwIndex, unsigned char cChannel, unsigned short wNewKID);
|
||||
bool UpdateLostHP(unsigned long dwIndex, unsigned char cChannel, unsigned long dwLostHP);
|
||||
|
||||
// Send to gameserver
|
||||
void SendStatueInfo(CSendStream& SendStream, unsigned char cChannel);
|
||||
|
||||
private:
|
||||
|
||||
CStatueDBMgr();
|
||||
~CStatueDBMgr();
|
||||
|
||||
StatueInfoDB* CreateStatue( const StatueInfoDB& statueInfo ) ;
|
||||
void ClearStatueMap() ;
|
||||
|
||||
CDBComponent* m_lpDBComponent;
|
||||
StatueMap m_StatueMap;
|
||||
};
|
||||
|
||||
#endif // _RYL_DBAGENT_STATUE_DB_MANAGER_H_
|
||||
@@ -0,0 +1,100 @@
|
||||
#include "stdafx.h"
|
||||
#include "AdminDataMgr.h"
|
||||
|
||||
#include <DB/DBdefine.h>
|
||||
#include <DB/DBComponent.h>
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
|
||||
|
||||
CAdminDataMgr& CAdminDataMgr::GetInstance()
|
||||
{
|
||||
static CAdminDataMgr adminDataMgr;
|
||||
return adminDataMgr;
|
||||
}
|
||||
|
||||
bool CAdminDataMgr::LoadAdminList(CDBComponent& DBComponent)
|
||||
{
|
||||
const int MAX_LIST = 100;
|
||||
|
||||
ADMIN AdminList[MAX_LIST];
|
||||
int AdminNum = 0;
|
||||
|
||||
memset(&AdminList, 0, sizeof(ADMIN) * MAX_LIST);
|
||||
|
||||
if(!DBComponent.ExecuteQuery("SELECT * FROM AdminList"))
|
||||
{
|
||||
ERRLOG1(g_Log, "<EFBFBD><EFBFBD><EFBFBD> DB<44><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>. : %s",
|
||||
DBComponent.GetErrorString());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
m_AdminMap.clear();
|
||||
|
||||
while(DBComponent.GetData((void **)AdminList, sizeof(ADMIN), MAX_LIST, &AdminNum))
|
||||
{
|
||||
if(0 == AdminNum)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
ADMIN* lpAdminPos = AdminList;
|
||||
ADMIN* lpAdminEnd = AdminList + AdminNum;
|
||||
|
||||
for(;lpAdminPos != lpAdminEnd; ++lpAdminPos)
|
||||
{
|
||||
AdminData adminData;
|
||||
adminData.m_dwUID = lpAdminPos->UID;
|
||||
adminData.m_cLevel = static_cast<unsigned char>(lpAdminPos->Level);
|
||||
|
||||
adminData.m_startIP.S_un.S_addr = inet_addr(lpAdminPos->IP_S);
|
||||
adminData.m_endIP.S_un.S_addr = inet_addr(lpAdminPos->IP_E);
|
||||
|
||||
m_AdminMap.insert(AdminMap::value_type(adminData.m_dwUID, adminData));
|
||||
}
|
||||
|
||||
memset(&AdminList, 0, sizeof(ADMIN) * MAX_LIST);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
unsigned char CAdminDataMgr::GetAdminLevel(unsigned long dwUID, IN_ADDR address)
|
||||
{
|
||||
AdminMap::iterator pos = m_AdminMap.find(dwUID);
|
||||
if(pos != m_AdminMap.end())
|
||||
{
|
||||
AdminData& admin = pos->second;
|
||||
|
||||
if(admin.m_dwUID == dwUID)
|
||||
{
|
||||
if(CServerSetup::GetInstance().GetAdminIPCheck())
|
||||
{
|
||||
if(admin.m_startIP.S_un.S_un_b.s_b1 == address.S_un.S_un_b.s_b1 &&
|
||||
admin.m_startIP.S_un.S_un_b.s_b2 == address.S_un.S_un_b.s_b2 &&
|
||||
admin.m_startIP.S_un.S_un_b.s_b3 == address.S_un.S_un_b.s_b3 &&
|
||||
admin.m_startIP.S_un.S_un_b.s_b4 <= address.S_un.S_un_b.s_b4 &&
|
||||
address.S_un.S_un_b.s_b4 <= admin.m_endIP.S_un.S_un_b.s_b4)
|
||||
{
|
||||
return admin.m_cLevel;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return admin.m_cLevel;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
#ifndef _RYL_DBAGENT_DB_ADMIN_DATA_H_
|
||||
#define _RYL_DBAGENT_DB_ADMIN_DATA_H_
|
||||
|
||||
#include <winsock2.h>
|
||||
#include <windows.h>
|
||||
|
||||
#include <map>
|
||||
#include <boost/pool/pool_alloc.hpp>
|
||||
|
||||
// forward decl.
|
||||
class CDBComponent;
|
||||
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
|
||||
struct AdminData
|
||||
{
|
||||
unsigned long m_dwUID;
|
||||
unsigned char m_cLevel;
|
||||
|
||||
IN_ADDR m_startIP;
|
||||
IN_ADDR m_endIP;
|
||||
};
|
||||
|
||||
class CAdminDataMgr
|
||||
{
|
||||
public:
|
||||
|
||||
static CAdminDataMgr& GetInstance();
|
||||
|
||||
bool LoadAdminList(CDBComponent& DBComponent);
|
||||
unsigned char GetAdminLevel(unsigned long dwUID, IN_ADDR address);
|
||||
|
||||
private:
|
||||
|
||||
typedef std::map<unsigned long, AdminData, std::less<unsigned long>,
|
||||
boost::fast_pool_allocator<std::pair<unsigned long, AdminData> > > AdminMap;
|
||||
|
||||
AdminMap m_AdminMap;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
185
Server/RylServerProject/RylDBAgentServer/DataStorage/Billing.cpp
Normal file
185
Server/RylServerProject/RylDBAgentServer/DataStorage/Billing.cpp
Normal file
@@ -0,0 +1,185 @@
|
||||
#include "stdafx.h"
|
||||
#include "Billing.h"
|
||||
#include "SessionData.h"
|
||||
|
||||
#include <Network/Stream/SendStream.h>
|
||||
#include <Network/SendPacket/SendServerInfo.h>
|
||||
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
#include <Log/ServerLog.h>
|
||||
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
|
||||
|
||||
enum BillingConst
|
||||
{
|
||||
SENDED_BILLING_TIMEOUT_NOTIFY = (1 << 0)
|
||||
};
|
||||
|
||||
|
||||
CBilling::CBilling()
|
||||
: m_nLoginTime(0),
|
||||
m_nPlayTime(0),
|
||||
m_dwCRMIndex1(0),
|
||||
m_cBillingType(0),
|
||||
m_cFlags(0),
|
||||
m_eWarnMsgType(WARN_BEFORE_1SEC)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
CBilling::~CBilling()
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
void CBilling::StartBilling(int nPlayTime, unsigned long dwCRMIndex1, unsigned char cBillingType)
|
||||
{
|
||||
m_nLoginTime = time(0);
|
||||
m_nPlayTime = nPlayTime;
|
||||
m_dwCRMIndex1 = dwCRMIndex1;
|
||||
m_cBillingType = cBillingType;
|
||||
m_cFlags = 0;
|
||||
}
|
||||
|
||||
void CBilling::ClearBilling()
|
||||
{
|
||||
m_nLoginTime = 0;
|
||||
m_nPlayTime = 0;
|
||||
m_dwCRMIndex1 = 0;
|
||||
m_cBillingType = 0;
|
||||
m_cFlags = 0;
|
||||
}
|
||||
|
||||
void CBilling::AddYouxiLandPoint(int nAdditionalPoint, unsigned char cBillingType)
|
||||
{
|
||||
m_nPlayTime += nAdditionalPoint;
|
||||
m_cBillingType = cBillingType;
|
||||
|
||||
m_cFlags &= ~SENDED_BILLING_TIMEOUT_NOTIFY;
|
||||
}
|
||||
|
||||
bool CBilling::CheckBilling(const CSessionData& SessionData, time_t nCurrentTime)
|
||||
{
|
||||
// <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>õǾ<C3B5><C7BE><EFBFBD>, PC<50><43><EFBFBD><EFBFBD> <20>ƴϰ<C6B4>,
|
||||
// <20><><EFBFBD><EFBFBD> CHAR_ENABLED<45><44><EFBFBD><EFBFBD><EFBFBD>̰<EFBFBD>,
|
||||
// <20>Ѱ<EFBFBD><D1B0><EFBFBD> <20><><EFBFBD>պ<EFBFBD><D5BA><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD> <20><><EFBFBD>쿡<EFBFBD><ECBFA1> <20><><EFBFBD><EFBFBD> üũ.
|
||||
if (0 != m_nLoginTime && 0 == m_dwCRMIndex1 &&
|
||||
CSessionData::SE_CHAR_ENABLED == SessionData.GetSessionState() &&
|
||||
CServerSetup::GamaUnitedBilling != CServerSetup::GetInstance().GetBillingType())
|
||||
{
|
||||
switch(m_cBillingType)
|
||||
{
|
||||
case 'T':
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. m_nPlayTime<6D><65> <20>д<EFBFBD><D0B4><EFBFBD>
|
||||
{
|
||||
// <20>߰<EFBFBD><DFB0>ð<EFBFBD> 20<32><30> <20><> <20><>.
|
||||
int nRemainSecond = int(m_nPlayTime * 60 + m_nLoginTime - nCurrentTime) + 20;
|
||||
|
||||
// 5<><35> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
if (0 < nRemainSecond && nRemainSecond <= 300 && !(m_cFlags & SENDED_BILLING_TIMEOUT_NOTIFY))
|
||||
{
|
||||
// <20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD>(<28>ι<EFBFBD> <20><> <20><>ƾ<EFBFBD><C6BE><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϱ<EFBFBD> <20><><EFBFBD>ؼ<EFBFBD>..
|
||||
m_cFlags |= SENDED_BILLING_TIMEOUT_NOTIFY;
|
||||
|
||||
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><> <20>и<EFBFBD><D0B8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
SendPacket::BillingNotify(SessionData,
|
||||
static_cast<unsigned char>((nRemainSecond + 30)/60), m_cBillingType);
|
||||
}
|
||||
else if (nRemainSecond <= 0)
|
||||
{
|
||||
DETLOG2(g_Log, "UID:%10u/CID:%10u/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
SessionData.GetUID(), SessionData.GetCID());
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'D':
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. m_nPlayTime<6D><65> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><>
|
||||
{
|
||||
const struct tm CurrentTime = *localtime(&nCurrentTime);
|
||||
const struct tm LoginTime = *localtime(&m_nLoginTime);
|
||||
|
||||
// <20>Ϸ<EFBFBD> <20><><EFBFBD>Ұ<EFBFBD>, <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 5<><35> <20><><EFBFBD≯<EFBFBD>, <20><> <20>и<EFBFBD><D0B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
if(LoginTime.tm_yday + m_nPlayTime - 1 == CurrentTime.tm_yday &&
|
||||
23 == CurrentTime.tm_hour && 55 <= CurrentTime.tm_min &&
|
||||
!(m_cFlags & SENDED_BILLING_TIMEOUT_NOTIFY))
|
||||
{
|
||||
// <20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD>(<28>ι<EFBFBD> <20><> <20><>ƾ<EFBFBD><C6BE><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϱ<EFBFBD> <20><><EFBFBD>ؼ<EFBFBD>..
|
||||
m_cFlags |= SENDED_BILLING_TIMEOUT_NOTIFY;
|
||||
|
||||
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><> <20>и<EFBFBD><D0B8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
SendPacket::BillingNotify(SessionData,
|
||||
static_cast<unsigned char>(60 - CurrentTime.tm_min), m_cBillingType);
|
||||
}
|
||||
else if(LoginTime.tm_yday + static_cast<long>(m_nPlayTime) <= CurrentTime.tm_yday)
|
||||
{
|
||||
DETLOG2(g_Log, "UID:%10u/CID:%10u/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
SessionData.GetUID(), SessionData.GetCID());
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'Y':
|
||||
|
||||
// <20>븸 <20><><EFBFBD><EFBFBD>Ʈ. m_nPlayTime<6D><65> <20>д<EFBFBD><D0B4><EFBFBD>
|
||||
{
|
||||
// <20>߰<EFBFBD><DFB0>ð<EFBFBD> 1<><31> <20><> <20><>.
|
||||
int nRemainSecond = int(m_nPlayTime * 60 + m_nLoginTime - nCurrentTime) + 60;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üŷ
|
||||
if (0 < nRemainSecond && nRemainSecond <= 60 && !(m_cFlags & SENDED_BILLING_TIMEOUT_NOTIFY))
|
||||
{
|
||||
// <20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD>(<28>ι<EFBFBD> <20><> <20><>ƾ<EFBFBD><C6BE><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϱ<EFBFBD> <20><><EFBFBD>ؼ<EFBFBD>..
|
||||
m_cFlags |= SENDED_BILLING_TIMEOUT_NOTIFY;
|
||||
|
||||
// Ű<>ۿ<EFBFBD> <20>ٽ<EFBFBD> <20>˾ƺ<CBBE><C6BA><EFBFBD>
|
||||
DETLOG5(g_Log, "UID:%10u/CID:%10u/<2F>븸 <20><><EFBFBD><EFBFBD>Ʈ üũ<C3BC>մϴ<D5B4>. <20><><EFBFBD><EFBFBD> <20><>:%d, <20>α<EFBFBD><CEB1><EFBFBD>:%d <20><><EFBFBD><EFBFBD>:%d",
|
||||
SessionData.GetUID(), SessionData.GetCID(), nRemainSecond, m_nLoginTime, nCurrentTime); // <20>ӽ<EFBFBD>
|
||||
|
||||
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><> <20>и<EFBFBD><D0B8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
unsigned char cRemainMinute = static_cast<unsigned char>((nRemainSecond + 30) / 60);
|
||||
|
||||
if(WARN_BEFORE_1SEC == m_eWarnMsgType)
|
||||
{
|
||||
// <20>߱<EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><DEBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
SendPacket::BillingCheckNotify(
|
||||
SessionData, cRemainMinute, m_cBillingType);
|
||||
}
|
||||
|
||||
// UID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ Ȯ<><C8AE> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
SendPacket::UpdateUIDTable(PktUUT::UpdateUIDTableBillingCheck,
|
||||
SessionData.GetAccountName(), NULL, SessionData.GetUID(), SessionData.GetCID(),
|
||||
SessionData.GetSessionID(), SessionData.GetServerID(), SessionData.GetRemoteAddress());
|
||||
}
|
||||
else if (nRemainSecond <= 0)
|
||||
{
|
||||
DETLOG6(g_Log, "UID:%10u/CID:%10u/<2F>븸 <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> "
|
||||
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>:%d Ÿ<><C5B8>:%d, <20>α<EFBFBD><CEB1><EFBFBD>:%d <20><><EFBFBD><EFBFBD><EFBFBD>ð<EFBFBD>:%d",
|
||||
SessionData.GetUID(), SessionData.GetCID(), nRemainSecond, m_nPlayTime, m_nLoginTime, nCurrentTime);
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
#ifndef _RYL_DBAGENT_BILLING_DATA_H_
|
||||
#define _RYL_DBAGENT_BILLING_DATA_H_
|
||||
|
||||
#include <ctime>
|
||||
|
||||
// forward decl;
|
||||
class CSendStream;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
// forward decl;
|
||||
class CSessionData;
|
||||
|
||||
class CBilling
|
||||
{
|
||||
public:
|
||||
|
||||
CBilling();
|
||||
~CBilling();
|
||||
|
||||
enum WarningType
|
||||
{
|
||||
WARN_BEFORE_1SEC = 0,
|
||||
NO_WARNING = 1,
|
||||
WARN_EVERY_MINUTE = 2
|
||||
};
|
||||
|
||||
|
||||
time_t GetLoginTime() const { return m_nLoginTime; }
|
||||
int GetPlayTime() const { return m_nPlayTime; }
|
||||
unsigned long GetCRMData() const { return m_dwCRMIndex1; }
|
||||
WarningType GetWarnMsgType() const { return m_eWarnMsgType; }
|
||||
char GetBillingType() const { return m_cBillingType; }
|
||||
|
||||
void SetWarnMsgType(WarningType eWarnMsgType) { m_eWarnMsgType = eWarnMsgType; }
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
void StartBilling(int nPlayTime,
|
||||
unsigned long dwCRMIndex1, unsigned char cBillingType);
|
||||
|
||||
void ClearBilling();
|
||||
|
||||
//! <20><><EFBFBD>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>
|
||||
void AddYouxiLandPoint(int nAdditionalPoint, unsigned char cBillingType);
|
||||
|
||||
//! true : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> / false : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>.
|
||||
bool CheckBilling(const CSessionData& SessionData, time_t nCurrentTime);
|
||||
|
||||
private:
|
||||
|
||||
time_t m_nLoginTime; // <20>α<EFBFBD><CEB1><EFBFBD> <20>ð<EFBFBD>(midnight, January 1, 1970 <20><><EFBFBD><EFBFBD> <20>帥 <20>ð<EFBFBD>(sec))
|
||||
|
||||
int m_nPlayTime; // <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD> (<28><>¥ Ȥ<><C8A4> <20>ð<EFBFBD>)
|
||||
unsigned long m_dwCRMIndex1; // PC<50><43> ID (0<≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
WarningType m_eWarnMsgType; // <20>ؿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><DEBD><EFBFBD> Ÿ<><C5B8> ( 0 : 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20>븸 <20><>, 1 : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, 2 : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> )
|
||||
|
||||
char m_cBillingType; // <20><><EFBFBD><EFBFBD> Ÿ<><C5B8> (D : <20><><EFBFBD><EFBFBD> <20><>¥, T : <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD>)
|
||||
char m_cFlags; // <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD>.
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,236 @@
|
||||
#ifndef _RYL_DBAGENT_CHARACTER_DATA_H_
|
||||
#define _RYL_DBAGENT_CHARACTER_DATA_H_
|
||||
|
||||
#include <DB/DBdefine.h>
|
||||
#include <Community/FriendList.h>
|
||||
#include <Community/BanList.h>
|
||||
#include <Skill/Spell/Affected.h>
|
||||
|
||||
#include <map>
|
||||
#include <boost/pool/object_pool.hpp>
|
||||
#include <boost/pool/pool_alloc.hpp>
|
||||
|
||||
// forward decl.
|
||||
class CDBComponent;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
// forward decl.
|
||||
class CSessionData;
|
||||
|
||||
template<typename Key, typename Data, typename Pred>
|
||||
class CDBDataMgr;
|
||||
|
||||
class CCharacterData
|
||||
{
|
||||
public:
|
||||
|
||||
enum
|
||||
{
|
||||
MAX_EQUIP_VIEW = 15
|
||||
};
|
||||
|
||||
enum CHANGED_CHAR_DATA
|
||||
{
|
||||
CHANGED_CHAR_INFOST = (1 << 0),
|
||||
CHANGED_CHAR_POS = (1 << 1),
|
||||
CHANGED_SKILL = (1 << 2),
|
||||
CHANGED_QUICK = (1 << 3),
|
||||
CHANGED_EQUIP = (1 << 4),
|
||||
CHANGED_INVEN = (1 << 5),
|
||||
CHANGED_EXTRA = (1 << 6),
|
||||
CHANGED_EXCHANGE = (1 << 7),
|
||||
CHANGED_TEMPINVEN = (1 << 8),
|
||||
CHANGED_CHAR_INFOEX = (1 << 9),
|
||||
CHANGED_QUEST = (1 << 10),
|
||||
CHANGED_HISTORY = (1 << 11),
|
||||
CHANGED_CONFIG = (1 << 12),
|
||||
CHANGED_FRIENDLIST = (1 << 13),
|
||||
CHANGED_BANLIST = (1 << 14),
|
||||
CHANGED_SPELL = (1 << 15),
|
||||
CHANGED_ENCHANT = (1 << 16)
|
||||
};
|
||||
|
||||
|
||||
CCharacterData();
|
||||
~CCharacterData();
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ҵ<DEBC>
|
||||
|
||||
//! Ű <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>´<EFBFBD>. <20><><EFBFBD>⼭<EFBFBD><E2BCAD> CID<49>̴<EFBFBD>.
|
||||
unsigned long GetKey() const { return GetCID(); }
|
||||
|
||||
unsigned long GetCID() const { return m_CharInfo.CID; }
|
||||
unsigned long GetPID() const { return m_CharInfo.PID; }
|
||||
unsigned long GetGID() const { return m_CharInfo.GID; }
|
||||
unsigned long GetServerID() const { return m_CharInfoEx.ServerID; }
|
||||
unsigned char GetAdminFlag() const { return m_CharInfoEx.cAdminFlag; }
|
||||
|
||||
const char* GetName() const { return m_CharInfo.Name; }
|
||||
char GetRace() const { return m_CharInfo.Race; }
|
||||
|
||||
unsigned short GetClass() { return m_CharInfo.Class; }
|
||||
char GetLevel() const { return m_CharInfo.Level; }
|
||||
|
||||
const CHAR_INFOST& GetInfo() const { return m_CharInfo; }
|
||||
const CHAR_POS& GetPos() const { return m_CharPos; }
|
||||
const SKILL& GetSkill() const { return m_Skill; }
|
||||
const QUICK& GetQuick() const { return m_Quick; }
|
||||
const SPELL& GetSpell() const { return m_Spell; }
|
||||
|
||||
const EQUIP& GetEquip() const { return m_Equip; }
|
||||
const INVEN& GetInven() const { return m_Inven; }
|
||||
const EXTRA& GetExtra() const { return m_Extra; }
|
||||
const EXCHANGE& GetExchange() const { return m_Exchange; }
|
||||
const TEMPINVEN& GetTempInven() const { return m_TempInven; }
|
||||
|
||||
const CHAR_INFOEX& GetInfoEx() const { return m_CharInfoEx; }
|
||||
const QUEST& GetQuest() const { return m_Quest; }
|
||||
const HISTORY& GetHistory() const { return m_History; }
|
||||
const CONFIG& GetConfig() const { return m_Config; }
|
||||
|
||||
const CFriendList& GetFriendList() const { return m_FriendList; }
|
||||
const CBanList& GetBanList() const { return m_BanList; }
|
||||
|
||||
TIME* GetLogoutTime() { return &m_CharInfoEx.LoggoutTime; }
|
||||
TIME* GetLoginTime() { return &m_LogginTime; }
|
||||
|
||||
|
||||
|
||||
|
||||
// ģ<><C4A3>/<2F>ź<EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><DEBC><EFBFBD>.
|
||||
bool AddFriend(unsigned long dwFriendCID, const char* szCharacterName, unsigned long dwGID, unsigned short wClass, char cLevel, unsigned long dwServerID);
|
||||
bool RemoveFriend(unsigned long dwFriendCID);
|
||||
|
||||
bool AddBan(unsigned long dwBanCID, const char* szBanName, unsigned long dwGID, unsigned short wClass, char cLevel, unsigned long dwServerID);
|
||||
bool RemoveBan(unsigned long dwBanCID);
|
||||
|
||||
bool SetFriendGroup(unsigned long dwCID, unsigned long dwGroup);
|
||||
|
||||
bool FriendSerializeIn(const char* lpData, unsigned long dwDataLen);
|
||||
bool BanSerializeIn(const char* lpData, unsigned long dwDataLen);
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ҵ<DEBC>
|
||||
void SetUID(unsigned long dwUID);
|
||||
void SetPID(unsigned long dwPID);
|
||||
void SetGID(unsigned long dwGID);
|
||||
void SetServerID(unsigned long dwServerID);
|
||||
|
||||
// <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD>쿡<EFBFBD><ECBFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20>ʴ´<CAB4>!
|
||||
bool SetInfo(const CHAR_INFOST& charInfoST, bool bChangeName = false);
|
||||
void SetPos(const CHAR_POS& charPos);
|
||||
void SetSkill(const SKILL& skill);
|
||||
void SetQuick(const QUICK& quick);
|
||||
// <20><><EFBFBD><EFBFBD>
|
||||
void SetSpell(const SPELL& spell);
|
||||
|
||||
void SetInfoEx(const CHAR_INFOEX& charInfoEx);
|
||||
void SetQuest(const QUEST& quest);
|
||||
void SetHistory(const HISTORY& history);
|
||||
void SetConfig(const CONFIG& config);
|
||||
|
||||
bool SetEquip(const char* szData, unsigned long dwDataLen);
|
||||
bool SetInven(const char* szData, unsigned long dwDataLen);
|
||||
bool SetExtra(const char* szData, unsigned long dwDataLen);
|
||||
bool SetExchange(const char* szData, unsigned long dwDataLen);
|
||||
bool SetTempInven(const char* szData, unsigned long dwDataLen);
|
||||
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ҵ<DEBC>
|
||||
bool IsDataChanged() const { return 0 != m_dwUpdateData; }
|
||||
bool IsValidData() const { return !(0 == GetCID() || 0 == GetInfo().Level); }
|
||||
|
||||
void ClearData(); //! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
void ReloadEquipView(); //! <20><><EFBFBD><EFBFBD> <20>並 <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ʈ<EFBFBD><C6AE>ũ<EFBFBD><C5A9> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
bool SerializeOut(char* lpBuffer_Out, unsigned short* lpSizeArray_Out,
|
||||
unsigned long &dwBufferSize_InOut, unsigned long dwSizeArrayNum);
|
||||
|
||||
//! <20><>Ʈ<EFBFBD><C6AE>ũ<EFBFBD>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD>۵Ǿ<DBB5> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
bool SerializeIn(const char* lpBuffer_In, const unsigned short* lpSizeArray_In,
|
||||
unsigned long dwBufferSize, unsigned long dwSizeArrayNum);
|
||||
|
||||
//! DB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
bool UpdateDBData(CDBComponent& DBComponent);
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
bool ForceUpdateDBAllData(CDBComponent& DBComponent)
|
||||
{
|
||||
m_dwUpdateData = 0xFFFFFFFF;
|
||||
return UpdateDBData(DBComponent);
|
||||
}
|
||||
|
||||
void SetFriendUpdateData(void) { m_dwUpdateData |= CCharacterData::CHANGED_FRIENDLIST; }
|
||||
void SetBadUpdateData(void) { m_dwUpdateData |= CCharacterData::CHANGED_BANLIST; }
|
||||
|
||||
void SetAdminFlag(unsigned char cAdminFlag) { m_CharInfoEx.cAdminFlag = cAdminFlag; }
|
||||
|
||||
unsigned char GetRealmCheckPoint(void) const { return m_CharInfoEx.RealmCheckPoint; }
|
||||
void SetRealmCheckPoint(unsigned char cRealmCheckPoint) { m_CharInfoEx.RealmCheckPoint = cRealmCheckPoint; }
|
||||
|
||||
unsigned char GetRealmMinute(void) const { return m_CharInfoEx.RealmMinute; }
|
||||
void SetRealmMinute(unsigned char cRealmMinute) { m_CharInfoEx.RealmMinute = cRealmMinute; }
|
||||
|
||||
unsigned char GetGuildWarFlag(void) const { return m_CharInfoEx.GuildWarFlag; }
|
||||
unsigned char GetRealmWarFlag(void) const { return m_CharInfoEx.RealmWarFlag; }
|
||||
bool SetGuildWarFlag(unsigned char cFlag);
|
||||
bool SetRealmWarFlag(unsigned char cFlag);
|
||||
|
||||
unsigned char GetRealmPoint() const { return m_CharInfoEx.RealmPoint; }
|
||||
void SetRealmPoint(unsigned char cRealmPoint) { m_CharInfoEx.RealmPoint = cRealmPoint; }
|
||||
|
||||
unsigned long GetLastDBUpdateTime() const { return m_dwLastDBUpdateTime; }
|
||||
|
||||
//! DB<44>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
bool GetFromDB(CDBComponent& DBComponent, unsigned long dwKey);
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD>, <20><><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ҷ<EFBFBD> <20>´<EFBFBD>.
|
||||
bool WriteDataToDumpFile(const char* szFileName);
|
||||
bool ReadDataFromDumpFile(const char* szFileName);
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><DEBC><EFBFBD>
|
||||
bool ConvertToPart2Item(bool bConvertSkillToTicket);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>
|
||||
bool DeductGold(unsigned long dwGold);
|
||||
bool AddGold(unsigned long dwGold);
|
||||
|
||||
private:
|
||||
|
||||
CHAR_INFOST m_CharInfo; // <20>⺻ <20><><EFBFBD><EFBFBD>
|
||||
CHAR_POS m_CharPos; // <20><>ġ <20><><EFBFBD><EFBFBD>
|
||||
SKILL m_Skill; // <20><>ų <20><><EFBFBD><EFBFBD>
|
||||
QUICK m_Quick; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
CHAR_INFOEX m_CharInfoEx; // <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
QUEST m_Quest; // <20><><EFBFBD><EFBFBD>Ʈ
|
||||
HISTORY m_History; // <20><><EFBFBD><EFBFBD><EFBFBD>丮
|
||||
CONFIG m_Config; // <20><><EFBFBD><EFBFBD>
|
||||
|
||||
EQUIP m_Equip; // <20><><EFBFBD><EFBFBD>
|
||||
INVEN m_Inven; // <20>κ<EFBFBD>
|
||||
EXTRA m_Extra; // <20><><EFBFBD><EFBFBD>
|
||||
EXCHANGE m_Exchange; // <20><>ȯ
|
||||
TEMPINVEN m_TempInven; // <20>ӽ<EFBFBD> <20>κ<EFBFBD><CEBA>丮
|
||||
SPELL m_Spell; // <20><><EFBFBD><EFBFBD>
|
||||
|
||||
CBanList m_BanList; // <20>ź<EFBFBD>
|
||||
CFriendList m_FriendList; // ģ<><C4A3>
|
||||
|
||||
|
||||
TIME m_LogginTime; // <20><><EFBFBD>缭<EFBFBD><E7BCAD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1>ε<EFBFBD> <20>ð<EFBFBD>.
|
||||
|
||||
unsigned short m_EquipView[MAX_EQUIP_VIEW]; // <20><><EFBFBD><EFBFBD> <20><>
|
||||
unsigned long m_dwUpdateData; // <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ÿ<EFBFBD><C5B8>.
|
||||
unsigned long m_dwLastDBUpdateTime;
|
||||
|
||||
unsigned long m_dwUID;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,99 @@
|
||||
#include "stdafx.h"
|
||||
#include "CharacterDataMgr.h"
|
||||
#include "SessionDataMgr.h"
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
|
||||
CCharacterDataMgr& CCharacterDataMgr::GetInstance()
|
||||
{
|
||||
static CCharacterDataMgr characterDataMgr;
|
||||
return characterDataMgr;
|
||||
}
|
||||
|
||||
CCharacterDataMgr::CCharacterDataMgr()
|
||||
{
|
||||
SetManagerName("ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
||||
}
|
||||
|
||||
|
||||
CCharacterDataMgr::~CCharacterDataMgr()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
DBDataError CCharacterDataMgr::LoadData(CSessionData& SessionData, unsigned long dwKey,
|
||||
CCharacterData*& lpLoadData_Out)
|
||||
{
|
||||
DBDataError eDataError = CCharaterDataMgrBase::LoadData(SessionData, dwKey, lpLoadData_Out);
|
||||
|
||||
if(DATA_SUCCEEDED == eDataError)
|
||||
{
|
||||
CSessionDataMgr::GetInstance().AddCharLoadedSession(dwKey, SessionData);
|
||||
}
|
||||
|
||||
return eDataError;
|
||||
}
|
||||
|
||||
DBDataError CCharacterDataMgr::UnloadData(const CSessionData& SessionData, CCharacterData* lpUnloadData)
|
||||
{
|
||||
DBDataError eDataError = CCharaterDataMgrBase::UnloadData(SessionData, lpUnloadData);
|
||||
|
||||
if(DATA_SUCCEEDED == eDataError)
|
||||
{
|
||||
CSessionDataMgr::GetInstance().RemoveCharLoadedSession(SessionData.GetCID());
|
||||
}
|
||||
|
||||
return eDataError;
|
||||
}
|
||||
|
||||
void CCharacterDataMgr::Log(LOG_TYPE eLogType, const char* pRtn, const char* pFileName, int nLine,
|
||||
const CSessionData* lpSessionData, const unsigned long& dwKey, const char* szErrorMsg)
|
||||
{
|
||||
switch(eLogType)
|
||||
{
|
||||
case LOG_NORMAL:
|
||||
case LOG_RULE:
|
||||
case LOG_INFO:
|
||||
|
||||
if(0 != lpSessionData)
|
||||
{
|
||||
g_Log.SimpleLog(eLogType, "UID:%10u / CID:%10u / Key:%10u / %s %s",
|
||||
lpSessionData->GetUID(), lpSessionData->GetCID(), dwKey, GetManagerName(), szErrorMsg);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_Log.SimpleLog(eLogType, "Key:%10u / %s %s",
|
||||
dwKey, GetManagerName(), szErrorMsg);
|
||||
}
|
||||
break;
|
||||
|
||||
case LOG_DETAIL:
|
||||
case LOG_SYSERR:
|
||||
case LOG_ERROR:
|
||||
case LOG_DEBUG:
|
||||
case LOG_WARN:
|
||||
|
||||
if(0 != lpSessionData)
|
||||
{
|
||||
g_Log.DetailLog(eLogType, pRtn, pFileName, nLine,
|
||||
"UID:%10u / CID:%10u / Key:%10u / %s %s",
|
||||
lpSessionData->GetUID(), lpSessionData->GetCID(), dwKey, GetManagerName(), szErrorMsg);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_Log.DetailLog(eLogType, pRtn, pFileName, nLine, "Key:%10u / %s %s",
|
||||
dwKey, GetManagerName(), szErrorMsg);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
#ifndef _RYL_DBAGENT_CHARACTER_DATA_MGR_H_
|
||||
#define _RYL_DBAGENT_CHARACTER_DATA_MGR_H_
|
||||
|
||||
#include "DBDataMgr.h"
|
||||
#include "CharacterData.h"
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
typedef CDBDataMgr<unsigned long, CCharacterData> CCharaterDataMgrBase;
|
||||
|
||||
class CCharacterDataMgr : public CCharaterDataMgrBase
|
||||
{
|
||||
public:
|
||||
|
||||
static CCharacterDataMgr& GetInstance();
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD>/<2F><><EFBFBD>ε<EFBFBD>
|
||||
virtual DBDataError LoadData(CSessionData& SessionData,
|
||||
unsigned long dwKey, CCharacterData*& lpLoadData_Out);
|
||||
|
||||
virtual DBDataError UnloadData(const CSessionData& SessionData, CCharacterData* lpUnloadData);
|
||||
|
||||
private:
|
||||
|
||||
CCharacterDataMgr();
|
||||
~CCharacterDataMgr();
|
||||
|
||||
virtual void Log(LOG_TYPE eLogType, const char* pRtn, const char* pFileName, int nLine,
|
||||
const CSessionData* lpSessionData, const unsigned long& dataKey, const char* szErrorMsg);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,41 @@
|
||||
#ifndef _RYL_DBAGENT_DB_DATA_H_
|
||||
#define _RYL_DBAGENT_DB_DATA_H_
|
||||
|
||||
//forward decl.
|
||||
class CDBComponent;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
// forward decl.
|
||||
class CSessionData;
|
||||
class CDBDataMgr;
|
||||
|
||||
class IDBData
|
||||
{
|
||||
public:
|
||||
|
||||
virtual ~IDBData() { }
|
||||
|
||||
virtual unsigned long GetKey() const = 0; //! Key<65><79> <20>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>´<EFBFBD>.
|
||||
virtual unsigned long GetLastDBUpdateTime() const = 0; //! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
|
||||
|
||||
virtual bool UpdateDBData(CDBComponent& DBComponent) = 0; //! DB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ѵ<EFBFBD>.
|
||||
virtual bool IsDataChanged() const = 0; //! <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>θ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD>, <20><><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ҷ<EFBFBD> <20>´<EFBFBD>.
|
||||
virtual bool WriteDataToDumpFile(const char* szFileName) = 0;
|
||||
virtual bool ReadDataFromDumpFile(const char* szFileName) = 0;
|
||||
|
||||
protected:
|
||||
|
||||
//! DB<44><42><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ҷ<EFBFBD><D2B7>´<EFBFBD>.
|
||||
virtual bool GetFromDB(CDBComponent& DBComponent, unsigned long dwKey) = 0;
|
||||
|
||||
friend class CDBDataMgr;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,18 @@
|
||||
#include "stdafx.h"
|
||||
#include "DBDataMgr.h"
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
|
||||
const char* g_szDBDataErrorString[MAX_DATA_ERROR] =
|
||||
{
|
||||
"DATA_SUCCEEDED", //! <20><><EFBFBD><EFBFBD>
|
||||
"DATA_SERVER_ERROR", //! <20><EFBFBD><DEB8><EFBFBD> <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
|
||||
"DATA_ALREADY_LOGIN_ERROR", //! <20>̹<EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
||||
"DATA_ALREADY_LOGOUT_ERROR" //! <20>̹<EFBFBD> <20>αƿ<D7BE> <20><> <20><><EFBFBD><EFBFBD>
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
522
Server/RylServerProject/RylDBAgentServer/DataStorage/DBDataMgr.h
Normal file
522
Server/RylServerProject/RylDBAgentServer/DataStorage/DBDataMgr.h
Normal file
@@ -0,0 +1,522 @@
|
||||
#ifndef _RYL_DBAGENT_DB_DATA_MGR_H_
|
||||
#define _RYL_DBAGENT_DB_DATA_MGR_H_
|
||||
|
||||
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <utility>
|
||||
#include <mmsystem.h>
|
||||
#include <Log/ServerLogDefine.h>
|
||||
#include <boost/pool/pool_alloc.hpp>
|
||||
#include <boost/pool/object_pool.hpp>
|
||||
|
||||
#include "SessionData.h"
|
||||
|
||||
|
||||
//forward decl.
|
||||
class CDBComponent;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
// forward decl.
|
||||
class CSessionData;
|
||||
|
||||
enum DBDataError
|
||||
{
|
||||
DATA_SUCCEEDED = 0, //! <20><><EFBFBD><EFBFBD>
|
||||
DATA_SERVER_ERROR = 1, //! <20><EFBFBD><DEB8><EFBFBD> <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
|
||||
DATA_ALREADY_LOGIN_ERROR = 2, //! <20>̹<EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
||||
DATA_ALREADY_LOGOUT_ERROR = 3, //! <20>̹<EFBFBD> <20>αƿ<D7BE> <20><> <20><><EFBFBD><EFBFBD>
|
||||
MAX_DATA_ERROR = 4
|
||||
};
|
||||
|
||||
extern const char* g_szDBDataErrorString[MAX_DATA_ERROR];
|
||||
|
||||
template<typename Key, typename Data, typename Pred = std::less<Key> >
|
||||
class CDBDataMgr
|
||||
{
|
||||
public:
|
||||
|
||||
typedef typename Key KeyType;
|
||||
typedef typename Data DataType;
|
||||
|
||||
enum Const { MAX_MANAGER_NAME = 32 };
|
||||
|
||||
// ù<><C3B9>° <20><><EFBFBD>ڴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
// <20>ι<EFBFBD>° <20><><EFBFBD>ڴ<EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>ð<EFBFBD>
|
||||
// <20>αƿ<D7BE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ե<EFBFBD> <20>ð<EFBFBD>
|
||||
typedef std::pair<DataType*, unsigned long> DBDataPair;
|
||||
|
||||
typedef std::map<KeyType, DBDataPair, Pred,
|
||||
boost::fast_pool_allocator< std::pair<KeyType, DBDataPair> > > DataMap;
|
||||
|
||||
//! DB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
void SetDBComponent(CDBComponent* lpDBComponent) { m_lpDBComponent = lpDBComponent; }
|
||||
CDBComponent* GetDBComponent() { return m_lpDBComponent; }
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> LoginDB<44><42> <20>ִ<EFBFBD><D6B4><EFBFBD>, LogoutDB<44><42> <20>ִ<EFBFBD><D6B4><EFBFBD> <20>˾<EFBFBD> <20>´<EFBFBD>.
|
||||
bool IsDataLoginDB(const KeyType& dataKey) { return m_LoginMap.end() != m_LoginMap.find(dataKey); }
|
||||
bool IsDataLogoutDB(const KeyType& dataKey) { return m_LogoutMap.end() != m_LogoutMap.find(dataKey); }
|
||||
|
||||
//! <20><><EFBFBD>õ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
|
||||
const char* GetManagerName() const { return m_szManagerName; }
|
||||
unsigned int GetLoginNum() const { return static_cast<unsigned int>(m_LoginMap.size()); }
|
||||
unsigned int GetLogoutNum() const { return static_cast<unsigned int>(m_LogoutMap.size()); }
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
|
||||
virtual DBDataError LoadData(CSessionData& SessionData, KeyType dataKey, DataType*& lpLoadData_Out);
|
||||
virtual DBDataError UnloadData(const CSessionData& SessionData, DataType* lpUnloadData);
|
||||
|
||||
DataType* GetLogoutData(const KeyType& dataKey); //! <20>αƿ<D7BE><C6BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
|
||||
DBDataError ReloadData(const KeyType& dataKey); //! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DB<44>κ<EFBFBD><CEBA><EFBFBD> Reload<61>Ѵ<EFBFBD>.
|
||||
bool RemoveLogoutData(const KeyType& dataKey); //! <20>αƿ<D7BE><C6BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20>αƿ<D7BE><C6BF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
bool ManageUnloadedData(unsigned long dwMaxDataNum);
|
||||
|
||||
//! <20>α<EFBFBD><CEB1><EFBFBD> <20><> / <20>αƿ<D7BE> <20>¿<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ѵ<EFBFBD>.
|
||||
//! Arg1 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>ּҰ<D6BC><D2B0><EFBFBD>,
|
||||
//! Arg2 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>Ҹ<EFBFBD><D2B8><EFBFBD> <20>ִ<EFBFBD> <20>ð<EFBFBD><C3B0>̴<EFBFBD>.
|
||||
void UpdateDBData(unsigned long dwMinUpdateNum, unsigned long dwMaxUseTime);
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
void Destroy()
|
||||
{
|
||||
Destroy(m_LoginMap.begin(), m_LoginMap.end());
|
||||
Destroy(m_LogoutMap.begin(), m_LogoutMap.end());
|
||||
|
||||
m_LoginMap.clear();
|
||||
m_LogoutMap.clear();
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
CDBDataMgr() : m_lpDBComponent(0) { memset(m_szManagerName, 0, sizeof(char) * MAX_MANAGER_NAME); }
|
||||
~CDBDataMgr() { Destroy(); }
|
||||
|
||||
void SetManagerName(const char* szManagerName)
|
||||
{
|
||||
strncpy(m_szManagerName, szManagerName, MAX_MANAGER_NAME - 1);
|
||||
m_szManagerName[MAX_MANAGER_NAME - 1] = 0;
|
||||
}
|
||||
|
||||
// KeyType<70><65> <20>α<CEB1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ӹƼ<DEBE> ó<><C3B3><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20>Ѵ<EFBFBD>.
|
||||
virtual void Log(LOG_TYPE eLogType,
|
||||
const char* pRtn, const char* pFileName, int nLine,
|
||||
const CSessionData* lpSessionData,
|
||||
const KeyType& dataKey, const char* szErrorMsg) = 0;
|
||||
|
||||
// Data<74><61> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><EFBFBD><DEBC><EFBFBD><EFBFBD>̴<EFBFBD>.
|
||||
Data* CreateData() { return new Data; }
|
||||
void DeleteData(Data* lpDBData) { delete lpDBData; }
|
||||
|
||||
/*
|
||||
Data* CreateData() { return m_DataPool.construct(); }
|
||||
void DeleteData(Data* lpDBData) { m_DataPool.destruct(lpDBData); }
|
||||
*/
|
||||
|
||||
private:
|
||||
|
||||
void Destroy(typename DataMap::iterator first, typename DataMap::iterator last);
|
||||
|
||||
CDBComponent* m_lpDBComponent; //! DB<44><42><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
DataMap m_LoginMap; //! <20>α<EFBFBD><CEB1><EFBFBD> <20><> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
|
||||
DataMap m_LogoutMap; //! <20>αƿ<D7BE><C6BF><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
|
||||
|
||||
boost::object_pool<Data> m_DataPool; //! <20><>ü Ǯ
|
||||
|
||||
char m_szManagerName[MAX_MANAGER_NAME]; //! <20><><EFBFBD><EFBFBD> <20>Ŵ<EFBFBD><C5B4><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD>.
|
||||
};
|
||||
|
||||
template<typename Key, typename Data, typename Pred>
|
||||
class CGreaterLogoutTime
|
||||
{
|
||||
public:
|
||||
|
||||
typedef typename CDBDataMgr<Key, Data, Pred>::DataMap::value_type DataType;
|
||||
|
||||
CGreaterLogoutTime(unsigned long dwCurrentTime) : m_dwCurrentTime(dwCurrentTime) { }
|
||||
|
||||
bool operator () (const DataType& lhs, const DataType& rhs)
|
||||
{
|
||||
return m_dwCurrentTime - lhs.second.second >
|
||||
m_dwCurrentTime - rhs.second.second;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
unsigned long m_dwCurrentTime;
|
||||
};
|
||||
|
||||
template<typename Key, typename Data, typename Pred>
|
||||
class CGreaterUpdateTime
|
||||
{
|
||||
public:
|
||||
|
||||
typedef typename CDBDataMgr<Key, Data, Pred>::DataMap::value_type DataType;
|
||||
|
||||
CGreaterUpdateTime(unsigned long dwCurrentTime) : m_dwCurrentTime(dwCurrentTime) { }
|
||||
|
||||
bool operator () (const DataType& lhs, const DataType& rhs)
|
||||
{
|
||||
return m_dwCurrentTime - lhs.second.first->GetLastDBUpdateTime() >
|
||||
m_dwCurrentTime - rhs.second.first->GetLastDBUpdateTime();
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
unsigned long m_dwCurrentTime;
|
||||
};
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><> Session<6F><6E> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
template<typename Key, typename Data, typename Pred>
|
||||
DBDataError CDBDataMgr<Key, Data, Pred>::LoadData(CSessionData& SessionData, KeyType dataKey, Data*& lpLoadData_Out)
|
||||
{
|
||||
lpLoadData_Out = 0;
|
||||
Data* lpDBData = 0;
|
||||
|
||||
DataMap::iterator pos;
|
||||
DataMap::iterator end;
|
||||
|
||||
// <20>α<EFBFBD><CEB1><EFBFBD> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD>ɴ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
pos = m_LoginMap.find(dataKey);
|
||||
end = m_LoginMap.end();
|
||||
|
||||
if(pos != end)
|
||||
{
|
||||
Log(LOG_ERROR, LOG_FFL, &SessionData, dataKey, (pos->second.first->GetKey() != dataKey)
|
||||
? "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD> : Ű <20><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD><D9B8>ϴ<EFBFBD>" : "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD> : <20>̹<EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>");
|
||||
|
||||
return DATA_ALREADY_LOGIN_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20>αƿ<D7BE> <20>ʿ<EFBFBD><CABF><EFBFBD> <20>˻<EFBFBD><CBBB>մϴ<D5B4>.
|
||||
pos = m_LogoutMap.find(dataKey);
|
||||
end = m_LogoutMap.end();
|
||||
|
||||
if(pos != end)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20>ִ<EFBFBD>. <20>αƿ<D7BE> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, <20><><EFBFBD><EFBFBD> <20>غ<EFBFBD><D8BA><EFBFBD> <20>Ѵ<EFBFBD>.
|
||||
lpDBData = pos->second.first;
|
||||
m_LogoutMap.erase(pos);
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ε带 <20>Ѵ<EFBFBD>.
|
||||
if(0 != m_lpDBComponent)
|
||||
{
|
||||
lpDBData = CreateData();
|
||||
|
||||
if(0 != lpDBData)
|
||||
{
|
||||
if(!lpDBData->GetFromDB(*m_lpDBComponent, dataKey))
|
||||
{
|
||||
// DB<44><42><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. GetFromDB<44><42><EFBFBD>ο<EFBFBD><CEBF><EFBFBD> <20>α<EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
DeleteData(lpDBData);
|
||||
lpDBData = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Log(LOG_ERROR, LOG_FFL, &SessionData, dataKey, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><EFBFBD><DEB8><EFBFBD> <20>Ҵ翡 <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Log(LOG_ERROR, LOG_FFL, &SessionData, dataKey, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD> : DB<44><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD> NULL<4C>Դϴ<D4B4>");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(0 != lpDBData)
|
||||
{
|
||||
DBDataPair dataPair(lpDBData, timeGetTime());
|
||||
|
||||
if(!m_LoginMap.insert(std::make_pair(dataKey, dataPair)).second)
|
||||
{
|
||||
Log(LOG_ERROR, LOG_FFL, &SessionData, dataKey,
|
||||
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD> : LoginMap<61><70> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>)");
|
||||
|
||||
DeleteData(lpDBData);
|
||||
lpDBData = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
Log(LOG_INFO, LOG_FFL, &SessionData, dataKey, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD>");
|
||||
|
||||
lpLoadData_Out = lpDBData;
|
||||
return DATA_SUCCEEDED;
|
||||
}
|
||||
}
|
||||
|
||||
return DATA_SERVER_ERROR;
|
||||
|
||||
}
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Session<6F><6E><EFBFBD><EFBFBD> <20>и<EFBFBD><D0B8><EFBFBD> <20><> <20><><EFBFBD>ε<EFBFBD><CEB5>Ѵ<EFBFBD>.
|
||||
template<typename Key, typename Data, typename Pred>
|
||||
DBDataError CDBDataMgr<Key, Data, Pred>::UnloadData(const CSessionData& SessionData, Data* lpUnloadData)
|
||||
{
|
||||
if(0 != lpUnloadData)
|
||||
{
|
||||
KeyType dataKey = lpUnloadData->GetKey();
|
||||
|
||||
// <20>α<EFBFBD><CEB1><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> ã<>Ƽ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
if (0 == m_LoginMap.erase(dataKey))
|
||||
{
|
||||
Log(LOG_ERROR, LOG_FFL, &SessionData, dataKey, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD> <20>̻<EFBFBD> : <20>α<EFBFBD><CEB1><EFBFBD> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD><CEB5>մϴ<D5B4>");
|
||||
}
|
||||
else if(0 == m_lpDBComponent || !lpUnloadData->UpdateDBData(*m_lpDBComponent))
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>.
|
||||
Log(LOG_ERROR, LOG_FFL, &SessionData, dataKey, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD> <20>̻<EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>");
|
||||
}
|
||||
else if (m_LogoutMap.insert(
|
||||
std::make_pair(dataKey, std::make_pair(lpUnloadData, timeGetTime()))).second)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>. <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ְ<EFBFBD> <20><>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
Log(LOG_INFO, LOG_FFL, &SessionData, dataKey, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD> <20><><EFBFBD><EFBFBD>");
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>. <20><><EFBFBD>⼭ Ż<><C5BB>
|
||||
return DATA_SUCCEEDED;
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>. <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD>.
|
||||
Log(LOG_ERROR, LOG_FFL, &SessionData, dataKey, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD> <20><><EFBFBD><EFBFBD> : Logout<75>ʿ<EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>");
|
||||
}
|
||||
|
||||
// <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
if(!lpUnloadData->WriteDataToDumpFile(0))
|
||||
{
|
||||
Log(LOG_ERROR, LOG_FFL, &SessionData, dataKey, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD>ε<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>");
|
||||
}
|
||||
|
||||
// <20><EFBFBD><DEB8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ܵ<EFBFBD> <20><>¿ <20><> <20><><EFBFBD><EFBFBD>. <20>߸<EFBFBD> Delete<74>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;;
|
||||
// DeleteData(lpUnloadData);
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG4(g_Log, "UID:%10u / CID:%10u / lpUnloadData:0x%p / %s <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD>ڰ<EFBFBD> <20>̻<EFBFBD><CCBB>մϴ<D5B4>",
|
||||
SessionData.GetUID(), SessionData.GetCID(), lpUnloadData, m_szManagerName);
|
||||
}
|
||||
|
||||
return DATA_SERVER_ERROR;
|
||||
}
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DB<44>κ<EFBFBD><CEBA><EFBFBD> Reload<61>Ѵ<EFBFBD>.
|
||||
template<typename Key, typename Data, typename Pred>
|
||||
DBDataError CDBDataMgr<Key, Data, Pred>::ReloadData(const KeyType& dataKey)
|
||||
{
|
||||
if(0 == m_lpDBComponent)
|
||||
{
|
||||
return DATA_SERVER_ERROR;
|
||||
}
|
||||
|
||||
// <20>α<EFBFBD><CEB1><EFBFBD> <20>ʿ<EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>ҷ<EFBFBD><D2B7>ͼ<EFBFBD><CDBC><EFBFBD> <20>ȵȴ<C8B5>.
|
||||
DataMap::iterator pos = m_LoginMap.find(dataKey);
|
||||
DataMap::iterator end = m_LoginMap.end();
|
||||
|
||||
if(pos != end)
|
||||
{
|
||||
return DATA_ALREADY_LOGIN_ERROR;
|
||||
}
|
||||
|
||||
// <20>αƿ<D7BE> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, DB<44>κ<EFBFBD><CEBA><EFBFBD> <20>ҷ<EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
pos == m_LogoutMap.find(dataKey);
|
||||
end == m_LogoutMap.end();
|
||||
|
||||
return (pos != end && !pos->second.first->GetFromDB(*m_lpDBComponent, dataKey))
|
||||
? DATA_SERVER_ERROR : DATA_SUCCEEDED;
|
||||
}
|
||||
|
||||
template<typename Key, typename Data, typename Pred>
|
||||
bool CDBDataMgr<Key, Data, Pred>::RemoveLogoutData(const KeyType& dataKey)
|
||||
{
|
||||
// <20>αƿ<D7BE> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
DataMap::iterator pos = m_LogoutMap.find(dataKey);
|
||||
DataMap::iterator end = m_LogoutMap.end();
|
||||
|
||||
if(pos != end)
|
||||
{
|
||||
DeleteData(pos->second.first);
|
||||
m_LogoutMap.erase(pos);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20>αƿ<D7BE><C6BF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
template<typename Key, typename Data, typename Pred>
|
||||
bool CDBDataMgr<Key, Data, Pred>::ManageUnloadedData(unsigned long dwMaxDataNum)
|
||||
{
|
||||
size_t nLogoutDataNum = m_LogoutMap.size();
|
||||
|
||||
if(dwMaxDataNum < nLogoutDataNum)
|
||||
{
|
||||
// <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
typedef std::vector<std::pair<KeyType, DBDataPair>,
|
||||
boost::pool_allocator<std::pair<KeyType, DBDataPair> > > RemoveMap;
|
||||
|
||||
RemoveMap removeMap(nLogoutDataNum - dwMaxDataNum);
|
||||
|
||||
std::partial_sort_copy(m_LogoutMap.begin(), m_LogoutMap.end(),
|
||||
removeMap.begin(), removeMap.end(), CGreaterLogoutTime<Key,Data,Pred>(timeGetTime()));
|
||||
|
||||
RemoveMap::iterator pos = removeMap.begin();
|
||||
RemoveMap::iterator end = removeMap.end();
|
||||
|
||||
for(; pos != end; ++pos)
|
||||
{
|
||||
m_LogoutMap.erase(pos->first);
|
||||
DeleteData(pos->second.first);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//! <20>α<EFBFBD><CEB1><EFBFBD> <20>¿<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD>
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ѵ<EFBFBD>. <20><><EFBFBD>ڴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>Ҹ<EFBFBD><D2B8><EFBFBD> <20>ִ<EFBFBD> <20>ð<EFBFBD><C3B0>̴<EFBFBD>.
|
||||
template<typename Key, typename Data, typename Pred>
|
||||
void CDBDataMgr<Key, Data, Pred>::UpdateDBData(unsigned long dwMinUpdateNum, unsigned long dwMaxUseTime)
|
||||
{
|
||||
if(0 != m_lpDBComponent)
|
||||
{
|
||||
typedef std::vector<std::pair<KeyType, DBDataPair>,
|
||||
boost::pool_allocator<std::pair<KeyType, DBDataPair> > > UpdateList;
|
||||
|
||||
UpdateList updateList(m_LoginMap.size());
|
||||
|
||||
unsigned long dwStartTime = timeGetTime();
|
||||
|
||||
std::partial_sort_copy(m_LoginMap.begin(), m_LoginMap.end(),
|
||||
updateList.begin(), updateList.end(), CGreaterUpdateTime<Key,Data,Pred>(dwStartTime));
|
||||
|
||||
UpdateList::iterator loginPos = updateList.begin();
|
||||
UpdateList::iterator loginEnd = updateList.end();
|
||||
|
||||
unsigned long dwCurrentTime = timeGetTime();
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ұų<D2B0>, <20>ּ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>̻<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>ϰ<EFBFBD>, <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD> <20>Ѵ<EFBFBD>.
|
||||
for(unsigned long dwUpdateCount = 0; loginPos != loginEnd; ++loginPos)
|
||||
{
|
||||
if (dwMinUpdateNum < dwUpdateCount &&
|
||||
dwCurrentTime < dwStartTime + dwMaxUseTime)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
Data* lpDBData = loginPos->second.first;
|
||||
|
||||
if(lpDBData->IsDataChanged())
|
||||
{
|
||||
lpDBData->UpdateDBData(*m_lpDBComponent);
|
||||
++dwUpdateCount;
|
||||
|
||||
dwCurrentTime = timeGetTime();
|
||||
}
|
||||
}
|
||||
|
||||
// ij<><C4B3> DB<44><42><EFBFBD><EFBFBD>. <20><><EFBFBD>κ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>Ǿ<EFBFBD> <20>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
|
||||
// <20>ֱ<EFBFBD> <20>ź<EFBFBD><C5BA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><> <20><> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD>. <20>׳<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ѹ<EFBFBD><D1B9><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
|
||||
DataMap::iterator logoutPos = m_LogoutMap.begin();
|
||||
DataMap::iterator logoutEnd = m_LogoutMap.end();
|
||||
|
||||
dwCurrentTime = timeGetTime();
|
||||
|
||||
for(unsigned long dwUpdateCount = 0; logoutPos != logoutEnd; ++logoutPos)
|
||||
{
|
||||
if (dwMinUpdateNum < dwUpdateCount &&
|
||||
dwCurrentTime < dwStartTime + dwMaxUseTime)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
Data* lpDBData = logoutPos->second.first;
|
||||
|
||||
if(lpDBData->IsDataChanged())
|
||||
{
|
||||
lpDBData->UpdateDBData(*m_lpDBComponent);
|
||||
++dwUpdateCount;
|
||||
|
||||
dwCurrentTime = timeGetTime();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template<typename Key, typename Data, typename Pred>
|
||||
void CDBDataMgr<Key, Data, Pred>::Destroy(typename DataMap::iterator first, typename DataMap::iterator last)
|
||||
{
|
||||
for(; first != last; ++first)
|
||||
{
|
||||
Data* lpData = first->second.first;
|
||||
|
||||
if(0 == m_lpDBComponent || !lpData->UpdateDBData(*m_lpDBComponent))
|
||||
{
|
||||
// TODO : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>. ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> file<6C><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
|
||||
Log(LOG_ERROR, LOG_FFL, 0, lpData->GetKey(), lpData->WriteDataToDumpFile(0)
|
||||
? "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>"
|
||||
: "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ, <20><><EFBFBD>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>");
|
||||
}
|
||||
|
||||
DeleteData(lpData);
|
||||
}
|
||||
}
|
||||
|
||||
template<typename Key, typename Data, typename Pred>
|
||||
Data* CDBDataMgr<Key, Data, Pred>::GetLogoutData(const KeyType& dataKey)
|
||||
{
|
||||
DataMap::iterator logoutPos = m_LogoutMap.find(dataKey);
|
||||
|
||||
Data* lpDBData = 0;
|
||||
|
||||
if(logoutPos == m_LogoutMap.end())
|
||||
{
|
||||
// <20>αƿ<D7BE> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
DataMap::iterator loginPos = m_LoginMap.find(dataKey);
|
||||
|
||||
if(loginPos == m_LoginMap.end())
|
||||
{
|
||||
// <20>α<EFBFBD><CEB1><EFBFBD> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>츸 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD>
|
||||
lpDBData = CreateData();
|
||||
if(0 != lpDBData)
|
||||
{
|
||||
if (lpDBData->GetFromDB(*m_lpDBComponent, dataKey) &&
|
||||
m_LogoutMap.insert(
|
||||
std::make_pair(dataKey, std::make_pair(lpDBData, timeGetTime()))).second)
|
||||
{
|
||||
Log(LOG_INFO, LOG_FFL, 0, dataKey, "<EFBFBD>αƿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD>");
|
||||
}
|
||||
else
|
||||
{
|
||||
DeleteData(lpDBData);
|
||||
lpDBData = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20>αƿ<D7BE> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
lpDBData = logoutPos->second.first;
|
||||
}
|
||||
|
||||
return lpDBData;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,34 @@
|
||||
#include "stdafx.h"
|
||||
#include "DBItemSerialMgr.h"
|
||||
|
||||
#include <DB/DBComponent.h>
|
||||
#include <DB/GameDBComponent.h>
|
||||
#include <Network/Packet/PacketStruct/ServerInfo.h>
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
|
||||
|
||||
CDBAgentItemSerialMgr& CDBAgentItemSerialMgr::GetInstance()
|
||||
{
|
||||
static CDBAgentItemSerialMgr dbAgentItemSerialMgr;
|
||||
return dbAgentItemSerialMgr;
|
||||
}
|
||||
|
||||
|
||||
void CDBAgentItemSerialMgr::SaveChangedSerial(CDBComponent& DBComponent)
|
||||
{
|
||||
if(m_dwLastChangedItemSerial != GetItemSerial())
|
||||
{
|
||||
SaveItemSerial(DBComponent, GetServerID());
|
||||
m_dwLastChangedItemSerial = GetItemSerial();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
#ifndef _RYL_DBAGENT_DB_ITEM_SERIAL_MGR_H_
|
||||
#define _RYL_DBAGENT_DB_ITEM_SERIAL_MGR_H_
|
||||
|
||||
#include <Item/ItemSerialMgr.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
class CDBAgentItemSerialMgr : public Item::CItemSerialMgr
|
||||
{
|
||||
public:
|
||||
|
||||
static CDBAgentItemSerialMgr& GetInstance();
|
||||
|
||||
unsigned long GetServerID() const { return m_dwServerID; }
|
||||
void SetServerID(unsigned long dwServerID) { m_dwServerID = dwServerID; }
|
||||
|
||||
void SaveChangedSerial(CDBComponent& DBComponent);
|
||||
|
||||
private:
|
||||
|
||||
CDBAgentItemSerialMgr() : m_dwLastChangedItemSerial(0) { }
|
||||
~CDBAgentItemSerialMgr() { }
|
||||
|
||||
unsigned __int64 m_dwLastChangedItemSerial;
|
||||
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
1363
Server/RylServerProject/RylDBAgentServer/DataStorage/SessionData.cpp
Normal file
1363
Server/RylServerProject/RylDBAgentServer/DataStorage/SessionData.cpp
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,287 @@
|
||||
#ifndef _RYL_DBAGENT_SESSION_DATA_H_
|
||||
#define _RYL_DBAGENT_SESSION_DATA_H_
|
||||
|
||||
#include <DB/DBDefine.h>
|
||||
#include <Creature/Character/CharacterClass.h>
|
||||
#include <Network/Packet/PacketStruct/UnifiedCharPacket.h>
|
||||
|
||||
#include "Billing.h"
|
||||
|
||||
#include <deque>
|
||||
|
||||
//! forward decl.
|
||||
class CDBComponent;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
//! forward decl.
|
||||
class CCharacterData;
|
||||
class CStoreData;
|
||||
|
||||
struct RequestData
|
||||
{
|
||||
enum
|
||||
{
|
||||
// edith 2008.03.17 ID,PASS <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
MaxName = 24,
|
||||
MaxPass = 36,
|
||||
};
|
||||
|
||||
unsigned long m_dwRequestKey;
|
||||
unsigned long m_dwSelectedCID;
|
||||
unsigned long m_dwServerID;
|
||||
unsigned long m_dwSessionID;
|
||||
|
||||
IN_ADDR m_PeerAddress;
|
||||
char m_szAccount[MaxName];
|
||||
|
||||
// edith 2008.01.15 <20>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>۾<EFBFBD>
|
||||
char m_szPassword[MaxPass];
|
||||
|
||||
RequestData();
|
||||
|
||||
// edith 2008.01.15 <20>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>۾<EFBFBD>
|
||||
RequestData(unsigned long dwRequestKey, unsigned long dwSelectedCID,
|
||||
unsigned long dwServerID, unsigned long dwSessionID,
|
||||
IN_ADDR peerAddr, const char* szAccountName, const char* szPassword);
|
||||
};
|
||||
|
||||
class CSessionData
|
||||
{
|
||||
public:
|
||||
|
||||
enum SessionState
|
||||
{
|
||||
SE_NONE = 0,
|
||||
SE_USER_ENABLED = 1,
|
||||
SE_USER_DISABLED = 2,
|
||||
SE_MOVE = 3,
|
||||
SE_CHAR_ENABLED = 4,
|
||||
SE_CHAR_DISABLED = 5,
|
||||
SE_MAX_STATE = 6
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
MAX_REALM_POINT = 5, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><>,.<2E><> by Minbobo.
|
||||
|
||||
REALM_POINT_TIME = 60, // 60 <20><>
|
||||
|
||||
FAME_PANELTY_VALUE_1ST = 5000,
|
||||
FAME_PANELTY_VALUE_2ND = 10000,
|
||||
};
|
||||
|
||||
struct SaveEnemy
|
||||
{
|
||||
enum
|
||||
{
|
||||
MAX_SAVING_ENEMY = 5, // <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>ִ<EFBFBD> <20><>ü <20><>
|
||||
};
|
||||
|
||||
|
||||
unsigned long m_dwCID;
|
||||
unsigned long m_dwTick;
|
||||
};
|
||||
|
||||
typedef std::deque<RequestData> RequestQueue;
|
||||
|
||||
CSessionData();
|
||||
~CSessionData();
|
||||
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD> <20>⺻ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
unsigned long GetUID() const { return m_dwUID; }
|
||||
unsigned long GetCID() const { return m_dwCID; }
|
||||
unsigned long GetSessionID() const { return m_dwSessionID; }
|
||||
unsigned long GetServerID() const { return m_dwServerID; }
|
||||
IN_ADDR GetRemoteAddress() const { return m_RemoteAddress; }
|
||||
const char* GetAccountName() const { return m_szAccount; }
|
||||
unsigned char GetAdminLevel() const { return m_cAdminLevel; }
|
||||
// WORK_LIST 2.1 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD>
|
||||
unsigned char GetAccountNation() const { return m_UserInfo.Nation; }
|
||||
void SetAccountNation(unsigned char cNation) { m_UserInfo.Nation = cNation; }
|
||||
|
||||
const USER_INFO& GetUserInfo() const { return m_UserInfo; }
|
||||
const CHAR_VIEW* GetCharView(unsigned char cIndex) const
|
||||
{ return (cIndex < USER_INFO::MAX_CHAR_NUM) ? m_CharView + cIndex : 0; }
|
||||
|
||||
bool GetCharView(unsigned long dwCID, CHAR_VIEW& charView_Out);
|
||||
|
||||
// WORK_LIST 2.3 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
bool SetCharViewGID(unsigned long dwCID, unsigned long dwGID);
|
||||
bool SetCharViewFame(unsigned long dwCID, unsigned long dwFame);
|
||||
|
||||
CBilling& GetBilling() { return m_Billing; }
|
||||
|
||||
bool HasCharacter(unsigned long dwCID) const;
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȯ <20>Լ<EFBFBD>
|
||||
SessionState GetSessionState() const { return m_eSessionState; }
|
||||
void SetSessionState(SessionState eSessionState) { m_eSessionState = eSessionState; }
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID<49><44> <20><><EFBFBD><EFBFBD>
|
||||
void SetAuthServerID();
|
||||
void SetAccountName(const char* szAccountName);
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD> Enable/Disable/Move
|
||||
bool UserEnable(CDBComponent& DBComponent, unsigned long dwUID);
|
||||
bool UserDisable();
|
||||
bool UserMove();
|
||||
|
||||
//! ij<><C4B3><EFBFBD><EFBFBD> Enable/Disable/Move
|
||||
bool LoadData(unsigned long dwCID);
|
||||
void UnloadData();
|
||||
|
||||
bool CharEnable(unsigned long dwCID, unsigned long dwServerID);
|
||||
bool CharDisable(unsigned long dwCID, unsigned long dwServerID);
|
||||
bool CharMove(unsigned long dwCID, unsigned long dwServerID);
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. (ij<><C4B3><EFBFBD><EFBFBD>)
|
||||
CCharacterData* GetCharacterData() { return m_lpCharacterData; }
|
||||
CStoreData* GetStoreData() { return m_lpStoreData; }
|
||||
|
||||
SaveEnemy* GetSaveEnemy() { return m_SaveEnemy; }
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. (â<><C3A2>)
|
||||
void SetCharacterData(CCharacterData* lpCharacterData) { m_lpCharacterData = lpCharacterData; }
|
||||
void SetStoreData(CStoreData* lpStoreData) { m_lpStoreData = lpStoreData; }
|
||||
|
||||
//! <20><> <20>̵<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
bool SetMoveZone(unsigned char cZone, const POS& Pos);
|
||||
void UpdateMoveZone();
|
||||
bool CheckCharZone(unsigned char cZone);
|
||||
|
||||
unsigned char GetCharStartZone(char cRace);
|
||||
|
||||
bool GetPlayTimeFromDB(CDBComponent& DBComponent);
|
||||
bool GetPremiumServiceFromDB(CDBComponent& DBComponent);
|
||||
|
||||
bool GetUserInfoFromDB(CDBComponent& DBComponent); //! DB<44>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>並 <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
|
||||
bool GetUnifiedDataFromDB(CDBComponent& DBComponent); //! DB<44>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ҵ<DEBC>
|
||||
void LogUserData(const char* szMessage);
|
||||
void LogCharData(const char* szMessage);
|
||||
void LogUserDataError(const char* szMessage, const char* szRoutine, const char* szFile, int nLine);
|
||||
void LogCharDataError(const char* szMessage, const char* szRoutine, const char* szFile, int nLine);
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ҵ<DEBC>
|
||||
void SetUID(unsigned long dwUID) { m_dwUID = dwUID; }
|
||||
void SetAddress(IN_ADDR addr) { m_RemoteAddress = addr; }
|
||||
|
||||
//! <20><>û ť <20><><EFBFBD><EFBFBD> (dwRequestKey<65><79> 0<≯<EFBFBD> <20><><EFBFBD><EFBFBD>)
|
||||
void PushRequest(const RequestData& reqData);
|
||||
RequestData PopRequest();
|
||||
|
||||
void SetRequestData(const RequestData& reqData);
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
unsigned char GetOldServerGroupID() const { return m_cOldServerGroupID; }
|
||||
void SetOldServerGroupID(unsigned char cOldServerGroupID) { m_cOldServerGroupID = cOldServerGroupID; }
|
||||
|
||||
const UnifiedStoreInfo* GetUnifiedStoreInfo() const { return m_UnifiedStoreInfo; }
|
||||
const UnifiedCharData* GetUnifiedCharData() const { return m_UnifiedCharData; }
|
||||
const UnifiedCharData* GetUnifiedCharData(unsigned long dwCID) const;
|
||||
|
||||
int GetUnifiedStoreInfoNum() const { return m_nUnifiedStoreInfoNum; }
|
||||
int GetUnifiedCharDataNum() const { return m_nUnifiedCharDataNum; }
|
||||
|
||||
// â<><C3A2> <20><><EFBFBD><EFBFBD> / ó<><C3B3> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
unsigned char GetFirstLogin() const { return m_UserInfo.FirstLogin; }
|
||||
void SetFirstLogin(unsigned char cFirstLogin) { m_UserInfo.FirstLogin = cFirstLogin; }
|
||||
|
||||
// <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȣ<EFBFBD><C8A3> â<><C3A2><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD>ɴ<EFBFBD>.
|
||||
bool HasUnifiedStoreInfo(unsigned char cOldServerGroupID);
|
||||
|
||||
// <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȣ<EFBFBD><C8A3> â<><C3A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȣ<EFBFBD><C8A3> <20>ٲ۴<D9B2>.
|
||||
bool ChangeUnifiedStoreInfoGroup(CDBComponent& DBComponent,
|
||||
unsigned char cOldServerGroupID, unsigned char cNewServerGroupID);
|
||||
|
||||
// UID/CID<49><44> <20><>ġ<EFBFBD>ϴ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID<49><44> <20>ٲ۴<D9B2>.
|
||||
bool ChangeUnifiedCharServerGroupID(CDBComponent& DBComponent,
|
||||
unsigned long dwUID, unsigned long dwCID, unsigned char cOldServerGroupID);
|
||||
|
||||
// <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>(ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
|
||||
bool DelUnifiedCharData(unsigned long dwCID);
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
bool UpdateCharacterBinding(CDBComponent& DBComponent,
|
||||
unsigned long dwSelectedCID[USER_INFO::MAX_CHAR_NUM]);
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> CID<49><44> <20>ָ<EFBFBD> <20><><EFBFBD>õ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
|
||||
CClass::RaceType CheckUnifiedCharRace(unsigned long dwSelectedCID[USER_INFO::MAX_CHAR_NUM]);
|
||||
|
||||
// Part1 -> Part2 ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ȸ<><C8B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
unsigned char GetTransferedCharCount(CDBComponent& DBComponent);
|
||||
bool UpdateTransferedCharCount(CDBComponent& DBComponent);
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> â<><C3A2> <20><><EFBFBD><EFBFBD>.
|
||||
bool GetUnifiedInfo(CDBComponent& DBComponent, unsigned long UserID_In);
|
||||
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ üũ.
|
||||
bool GetRealmPointCheck();
|
||||
|
||||
// <20><><EFBFBD>̽<EFBFBD>ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
|
||||
KeyInfo* GetKeyInfo(void) { return &m_KeyInfo; }
|
||||
|
||||
|
||||
unsigned int GetPlayTime() { return m_dwPlayTime; }
|
||||
long GetPremiumTime() { return m_PremiumService.lPremiumTime; }
|
||||
int GetPremiumType() { return m_PremiumService.iPremiumType; }
|
||||
|
||||
private:
|
||||
|
||||
USER_INFO m_UserInfo; //! <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
CHAR_VIEW m_CharView[USER_INFO::MAX_CHAR_NUM]; //! ij<><C4B3><EFBFBD><EFBFBD> <20><>
|
||||
|
||||
UnifiedStoreInfo m_UnifiedStoreInfo[PktUnifiedCharInfo::MAX_STORE_INFO]; // <20><><EFBFBD><EFBFBD> â<><C3A2> <20><><EFBFBD><EFBFBD>
|
||||
UnifiedCharData m_UnifiedCharData[PktUnifiedCharInfo::MAX_CHAR_DATA]; // <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
int m_nUnifiedStoreInfoNum;
|
||||
int m_nUnifiedCharDataNum;
|
||||
|
||||
char m_szAccount[CHAR_INFOST::MAX_ACCOUNT_LEN]; //! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
IN_ADDR m_RemoteAddress; //! <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ּ<EFBFBD>
|
||||
|
||||
unsigned long m_dwUID; //! <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> UID
|
||||
unsigned long m_dwCID; //! <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> CID
|
||||
unsigned long m_dwSessionID; //! <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> SessionID
|
||||
unsigned long m_dwServerID; //! <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ServerID
|
||||
|
||||
SessionState m_eSessionState; //! <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
unsigned long m_dwFlags; //! <20><><EFBFBD><EFBFBD> Flag<61><67>
|
||||
|
||||
CBilling m_Billing; //! <20><><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> ó<><C3B3>
|
||||
RequestQueue m_RequestQueue; //! <20><>û ť
|
||||
|
||||
CCharacterData* m_lpCharacterData; //! ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
CStoreData* m_lpStoreData; //! â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
unsigned char m_cAdminLevel; //! <20><EFBFBD><EEBFB5> <20><><EFBFBD><EFBFBD>
|
||||
unsigned char m_cOldServerGroupID; //! <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID : 1~10 / <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CServerSetup::AgentServerType <20><> <20><><EFBFBD><EFBFBD>.
|
||||
unsigned char m_cTransferedCharCount; //! ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ȸ<><C8B8>. <20>ʱⰪ<CAB1><E2B0AA> UCHAR_MAX <20>̰<EFBFBD>,
|
||||
//! GetTransferedCharCount<6E><74> ȣ<><C8A3><EFBFBD>ÿ<EFBFBD>, <20>ʱⰪ <20>״<EFBFBD><D7B4><EFBFBD><EFBFBD≯<EFBFBD> DB<44><42><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5>Ѵ<EFBFBD>.
|
||||
|
||||
char m_cNewZone; //! <20><> <20>̵<EFBFBD><CCB5><EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD> <20><> ǥ<><C7A5>
|
||||
POS m_NewPos; //! <20><> <20>̵<EFBFBD><CCB5><EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD> <20><>ǥ ǥ<><C7A5>
|
||||
|
||||
SaveEnemy m_SaveEnemy[SaveEnemy::MAX_SAVING_ENEMY];
|
||||
|
||||
KeyInfo m_KeyInfo;
|
||||
|
||||
unsigned int m_dwPlayTime;
|
||||
|
||||
PREMIUMSERVICE m_PremiumService;
|
||||
};
|
||||
|
||||
extern const char* g_szSessionStateString[CSessionData::SE_MAX_STATE];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,424 @@
|
||||
#include "stdafx.h"
|
||||
#include "SessionDataMgr.h"
|
||||
#include "CharacterData.h"
|
||||
|
||||
#include <DB/DBComponent.h>
|
||||
|
||||
#include <Community/Party/PartyDBInfo.h>
|
||||
#include <Community/Party/PartyDBMgr.h>
|
||||
|
||||
#include <Community/Guild/GuildDB.h>
|
||||
#include <Community/Guild/GuildDBMgr.h>
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
|
||||
#ifdef _RYL_GAME_CLIENT_
|
||||
#include "RYLNetworkData.h"
|
||||
#endif
|
||||
|
||||
#ifndef _RYL_GAME_CLIENT_
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
#endif
|
||||
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
|
||||
CSessionDataMgr& CSessionDataMgr::GetInstance()
|
||||
{
|
||||
static CSessionDataMgr sessionDataMgr;
|
||||
return sessionDataMgr;
|
||||
}
|
||||
|
||||
CSessionData* CSessionDataMgr::GetOpenSession(unsigned long dwUID)
|
||||
{
|
||||
SessionMap::iterator pos = m_uidMap.find(dwUID);
|
||||
return pos != m_uidMap.end() ? pos->second : 0;
|
||||
}
|
||||
|
||||
|
||||
CSessionData* CSessionDataMgr::GetOpenSession(const char* szAccountName,
|
||||
IN_ADDR peerAddress, bool bCheckAddress)
|
||||
{
|
||||
SessionMap::iterator pos = m_uidMap.begin();
|
||||
SessionMap::iterator end = m_uidMap.end();
|
||||
|
||||
CSessionData* lpSessionData = 0;
|
||||
CSessionData* lpResultSessionData = 0;
|
||||
|
||||
for(; pos != end; ++pos)
|
||||
{
|
||||
lpSessionData = pos->second;
|
||||
|
||||
if((bCheckAddress && lpSessionData->GetRemoteAddress().S_un.S_addr == peerAddress.S_un.S_addr) &&
|
||||
0 == strncmp(szAccountName, lpSessionData->GetAccountName(), CHAR_INFOST::MAX_ACCOUNT_LEN))
|
||||
{
|
||||
lpResultSessionData = lpSessionData;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return lpResultSessionData;
|
||||
}
|
||||
|
||||
CSessionData* CSessionDataMgr::GetCharLoadedSession(unsigned long dwCID)
|
||||
{
|
||||
SessionMap::iterator pos = m_cidMap.find(dwCID);
|
||||
return pos != m_cidMap.end() ? pos->second : 0;
|
||||
}
|
||||
|
||||
bool CSessionDataMgr::IsLoadedChar(const char* szCharName)
|
||||
{
|
||||
if (NULL != szCharName)
|
||||
{
|
||||
SessionMap::iterator pos = m_cidMap.begin();
|
||||
SessionMap::iterator end = m_cidMap.end();
|
||||
|
||||
CSessionData* lpSessionData = 0;
|
||||
CCharacterData* lpCharData = 0;
|
||||
|
||||
for(; pos != end; ++pos)
|
||||
{
|
||||
lpSessionData = pos->second;
|
||||
if(NULL != lpSessionData && NULL != (lpCharData = lpSessionData->GetCharacterData()))
|
||||
{
|
||||
if (NULL != lpCharData->GetName() &&
|
||||
0 == strncmp(lpCharData->GetName(), szCharName, CHAR_INFOST::MAX_NAME_LEN))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
CSessionData* CSessionDataMgr::SessionOpen(unsigned long dwUID)
|
||||
{
|
||||
CSessionData* lpSessionData = 0;
|
||||
|
||||
if(0 == dwUID)
|
||||
{
|
||||
SERLOG0(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20>߸<EFBFBD><DFB8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD><CCB5>Դϴ<D4B4>.");
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> DB<44><42> <20><><EFBFBD><EFBFBD> ã<><C3A3>
|
||||
SessionMap::iterator pos = m_uidMap.find(dwUID);
|
||||
if(pos != m_uidMap.end())
|
||||
{
|
||||
lpSessionData = pos->second;
|
||||
|
||||
CSessionData::SessionState eSessionState = lpSessionData->GetSessionState();
|
||||
|
||||
if (CSessionData::SE_USER_ENABLED == eSessionState ||
|
||||
CSessionData::SE_CHAR_ENABLED == eSessionState)
|
||||
{
|
||||
ERRLOG1(g_Log, "UID:%10u / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.", dwUID);
|
||||
lpSessionData = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
INFLOG1(g_Log, "UID:%10u / <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", dwUID);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lpSessionData = new CSessionData;
|
||||
|
||||
if(0 != lpSessionData)
|
||||
{
|
||||
if(m_uidMap.insert(std::make_pair(dwUID, lpSessionData)).second)
|
||||
{
|
||||
lpSessionData->SetUID(dwUID);
|
||||
INFLOG1(g_Log, "UID:%10u / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", dwUID);
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG1(g_Log, "UID:%10u / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : UID<49>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", dwUID);
|
||||
|
||||
if(lpSessionData)
|
||||
{
|
||||
delete lpSessionData;
|
||||
lpSessionData = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return lpSessionData;
|
||||
}
|
||||
|
||||
|
||||
void CSessionDataMgr::SessionClose(unsigned long dwUID, unsigned long dwSessionID)
|
||||
{
|
||||
SessionMap::iterator pos = m_uidMap.find(dwUID);
|
||||
if(pos == m_uidMap.end())
|
||||
{
|
||||
ERRLOG1(g_Log, "UID:%10u / <20><><EFBFBD><EFBFBD> <20>ݱ<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>", dwUID);
|
||||
}
|
||||
else
|
||||
{
|
||||
CSessionData* lpSessionData = pos->second;
|
||||
m_uidMap.erase(pos);
|
||||
|
||||
if(lpSessionData && lpSessionData->GetSessionID() != dwSessionID)
|
||||
{
|
||||
SERLOG3(g_Log, "UID:%10u / OldSessionID:%10u / CloseSessionID:%10u / <20><><EFBFBD><EFBFBD> <20>ݱ<EFBFBD> <20><><EFBFBD><EFBFBD> : "
|
||||
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID<49><44> <20>ٸ<EFBFBD><D9B8>ϴ<EFBFBD>", dwUID, lpSessionData->GetSessionID(), dwSessionID);
|
||||
}
|
||||
|
||||
if(lpSessionData)
|
||||
{
|
||||
delete lpSessionData;
|
||||
lpSessionData = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CSessionDataMgr::SessionCloseWithLogout(unsigned long dwUID, unsigned long dwServerID)
|
||||
{
|
||||
SessionMap::iterator pos = m_uidMap.find(dwUID);
|
||||
if(pos == m_uidMap.end())
|
||||
{
|
||||
ERRLOG1(g_Log, "UID:%10u / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ݱ<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>", dwUID);
|
||||
}
|
||||
else
|
||||
{
|
||||
CSessionData* lpSessionData = pos->second;
|
||||
|
||||
if(lpSessionData->GetServerID() != dwServerID)
|
||||
{
|
||||
SERLOG3(g_Log, "UID:%10u / ServerID:0x%08X / CloseServerID:0x%08X / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ݱ<EFBFBD> <20><><EFBFBD><EFBFBD> : "
|
||||
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ID<49><44> <20>ٸ<EFBFBD><D9B8>ϴ<EFBFBD>", dwUID, lpSessionData->GetServerID(), dwServerID);
|
||||
}
|
||||
else
|
||||
{
|
||||
SessionCloseWithLogout(pos);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CSessionDataMgr::SessionCloseWithLogout(SessionMap::iterator logoutPos)
|
||||
{
|
||||
CSessionData* lpSessionData = logoutPos->second;
|
||||
m_uidMap.erase(logoutPos);
|
||||
|
||||
CSessionData::SessionState eSessionState = lpSessionData->GetSessionState();
|
||||
|
||||
if(CSessionData::SE_USER_ENABLED == eSessionState)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> Disable
|
||||
lpSessionData->UserDisable();
|
||||
}
|
||||
else if(CSessionData::SE_CHAR_ENABLED == eSessionState)
|
||||
{
|
||||
CCharacterData* lpCharacterData = lpSessionData->GetCharacterData();
|
||||
if(0 != lpCharacterData)
|
||||
{
|
||||
unsigned long dwCID = lpCharacterData->GetCID();
|
||||
unsigned long dwPID = lpCharacterData->GetInfo().PID;
|
||||
unsigned long dwGID = lpCharacterData->GetInfo().GID;
|
||||
|
||||
// <20><>Ƽ<EFBFBD><C6BC> <20>αƿ<D7BE> <20>ϸ<EFBFBD>
|
||||
CPartyDBInfo* lpParty = CPartyDBMgr::GetInstance().OpenParty(
|
||||
CDBSingleObject::GetInstance(), dwPID);
|
||||
|
||||
if (0 != lpParty)
|
||||
{
|
||||
CPartyDBMgr::GetInstance().LogoutPartyMember(
|
||||
CDBSingleObject::GetInstance(), lpParty, dwCID);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD>忡 <20>αƿ<D7BE> <20>˸<EFBFBD>
|
||||
CGuildDB* lpGuild = static_cast<CGuildDB*>(
|
||||
CGuildDBMgr::GetInstance().GetGuild(dwGID));
|
||||
|
||||
if (0 != lpGuild)
|
||||
{
|
||||
lpGuild->SendLoginOutMember(dwCID, 0);
|
||||
}
|
||||
}
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> Disable
|
||||
lpSessionData->CharDisable(
|
||||
lpSessionData->GetCID(), lpSessionData->GetServerID());
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
|
||||
if(lpSessionData)
|
||||
{
|
||||
delete lpSessionData;
|
||||
lpSessionData = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void CSessionDataMgr::SessionCloseCurrentServer(unsigned long dwServerID)
|
||||
{
|
||||
INFLOG1(g_Log, "ServerID:0x%08X / <20><><EFBFBD><EFBFBD> <20>α<EFBFBD> <20>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>α<EFBFBD> <20>ƿ<EFBFBD> ó<><C3B3> <20><><EFBFBD><EFBFBD>", dwServerID);
|
||||
|
||||
SessionMap::iterator pos = m_uidMap.begin();
|
||||
SessionMap::iterator end = m_uidMap.end();
|
||||
|
||||
unsigned int nLogoutCount = 0;
|
||||
|
||||
for(; pos != end; )
|
||||
{
|
||||
CSessionData* lpSessionData = pos->second;
|
||||
|
||||
if(lpSessionData->GetServerID() == dwServerID)
|
||||
{
|
||||
SessionCloseWithLogout(pos++);
|
||||
++nLogoutCount;
|
||||
}
|
||||
else
|
||||
{
|
||||
++pos;
|
||||
}
|
||||
}
|
||||
|
||||
INFLOG2(g_Log, "ServerID:0x%08X / <20><><EFBFBD><EFBFBD> <20>α<EFBFBD> <20>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>α<EFBFBD> <20>ƿ<EFBFBD> ó<><C3B3> <20>Ϸ<EFBFBD> : %u<><75>",
|
||||
dwServerID, nLogoutCount);
|
||||
}
|
||||
|
||||
|
||||
bool CSessionDataMgr::AddCharLoadedSession(unsigned long dwCID, CSessionData& SessionData)
|
||||
{
|
||||
if(m_cidMap.insert(std::make_pair(dwCID, &SessionData)).second)
|
||||
{
|
||||
INFLOG1(g_Log, "CID:%10u / Ȱ<><C8B0>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD> ", dwCID);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG1(g_Log, "CID:%10u / Ȱ<><C8B0>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD> : <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>.", dwCID);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CSessionDataMgr::RemoveCharLoadedSession(unsigned long dwCID)
|
||||
{
|
||||
if(0 != m_cidMap.erase(dwCID))
|
||||
{
|
||||
INFLOG1(g_Log, "CID:%10u / Ȱ<><C8B0>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ", dwCID);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG1(g_Log, "CID:%10u / Ȱ<><C8B0>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>", dwCID);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Load <20><> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ν<EFBFBD><CEBD>Ͻ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> OFF <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
|
||||
void CSessionDataMgr::ClearGuildWarInstanceFlag()
|
||||
{
|
||||
if (m_cidMap.empty())
|
||||
return;
|
||||
|
||||
SessionMap::iterator pos = m_cidMap.begin();
|
||||
SessionMap::iterator end = m_cidMap.end();
|
||||
|
||||
CSessionData* lpSessionData = 0;
|
||||
CCharacterData* lpCharData = 0;
|
||||
|
||||
for(; pos != end; ++pos)
|
||||
{
|
||||
lpSessionData = pos->second;
|
||||
|
||||
#ifdef _RYL_GAME_CLIENT_
|
||||
if(GameRYL::GLOBAL == CRYLNetworkData::Instance()->m_eInternationalCode)
|
||||
#endif
|
||||
|
||||
#ifndef _RYL_GAME_CLIENT_
|
||||
if(GameRYL::GLOBAL == CServerSetup::GetInstance().GetNationType())
|
||||
#endif
|
||||
{
|
||||
if(NULL != lpSessionData)
|
||||
{
|
||||
if(NULL != (lpCharData = lpSessionData->GetCharacterData()))
|
||||
{
|
||||
if (Creature::WAR_INSTANCE == lpCharData->GetGuildWarFlag())
|
||||
{
|
||||
lpCharData->SetGuildWarFlag(Creature::WAR_OFF);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(NULL != lpSessionData && NULL != (lpCharData = lpSessionData->GetCharacterData()))
|
||||
{
|
||||
if (Creature::WAR_INSTANCE == lpCharData->GetGuildWarFlag())
|
||||
{
|
||||
lpCharData->SetGuildWarFlag(Creature::WAR_OFF);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CSessionDataMgr::ClearRealmWarInstanceFlag()
|
||||
{
|
||||
if (m_cidMap.empty())
|
||||
return;
|
||||
|
||||
SessionMap::iterator pos = m_cidMap.begin();
|
||||
SessionMap::iterator end = m_cidMap.end();
|
||||
|
||||
CSessionData* lpSessionData = 0;
|
||||
CCharacterData* lpCharData = 0;
|
||||
|
||||
for(; pos != end; ++pos)
|
||||
{
|
||||
lpSessionData = pos->second;
|
||||
|
||||
#ifdef _RYL_GAME_CLIENT_
|
||||
if(GameRYL::GLOBAL == CRYLNetworkData::Instance()->m_eInternationalCode)
|
||||
#endif
|
||||
|
||||
#ifndef _RYL_GAME_CLIENT_
|
||||
if(GameRYL::GLOBAL == CServerSetup::GetInstance().GetNationType())
|
||||
#endif
|
||||
{
|
||||
if(NULL != lpSessionData)
|
||||
{
|
||||
if(NULL != (lpCharData = lpSessionData->GetCharacterData()))
|
||||
{
|
||||
if (Creature::WAR_INSTANCE == lpCharData->GetRealmWarFlag())
|
||||
{
|
||||
lpCharData->SetRealmWarFlag(Creature::WAR_OFF);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(NULL != lpSessionData && NULL != (lpCharData = lpSessionData->GetCharacterData()))
|
||||
{
|
||||
if (Creature::WAR_INSTANCE == lpCharData->GetRealmWarFlag())
|
||||
{
|
||||
lpCharData->SetRealmWarFlag(Creature::WAR_OFF);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,105 @@
|
||||
#ifndef _RYL_DBAGENT_SESSION_DATA_MGR_H_
|
||||
#define _RYL_DBAGENT_SESSION_DATA_MGR_H_
|
||||
|
||||
#include "SessionData.h"
|
||||
|
||||
#include <map>
|
||||
#include <boost/pool/object_pool.hpp>
|
||||
#include <boost/pool/pool_alloc.hpp>
|
||||
|
||||
//! forward decl.
|
||||
class CDBComponent;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
class CSessionDataMgr
|
||||
{
|
||||
public:
|
||||
|
||||
static CSessionDataMgr& GetInstance();
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
CSessionData* SessionOpen(unsigned long dwUID);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> ã<><C3A3>
|
||||
CSessionData* GetOpenSession(unsigned long dwUID);
|
||||
CSessionData* GetOpenSession(const char* szAccountName, IN_ADDR peerAddress, bool bCheckAddress);
|
||||
CSessionData* GetCharLoadedSession(unsigned long dwCID);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20>ݱ<EFBFBD>
|
||||
void SessionClose(unsigned long dwUID, unsigned long dwSessionID);
|
||||
void SessionCloseWithLogout(unsigned long dwUID, unsigned long dwServerID);
|
||||
|
||||
void SessionCloseCurrentServer(unsigned long dwServerID);
|
||||
|
||||
// CharEnable / CharDisable<6C>ÿ<EFBFBD> <20><><EFBFBD><EFBFBD> / <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> CID<49><44> <20><><EFBFBD><EFBFBD>
|
||||
bool AddCharLoadedSession(unsigned long dwCID, CSessionData& SessionData);
|
||||
bool RemoveCharLoadedSession(unsigned long dwCID);
|
||||
|
||||
bool IsLoadedChar(const char* szCharName);
|
||||
|
||||
unsigned int GetSessionNum() { return static_cast<unsigned int>(m_uidMap.size()); }
|
||||
unsigned int GetCharEnabledSessionNum() { return static_cast<unsigned int>(m_cidMap.size()); }
|
||||
|
||||
// Load <20><> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ν<EFBFBD><CEBD>Ͻ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> OFF <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
|
||||
void ClearGuildWarInstanceFlag();
|
||||
void ClearRealmWarInstanceFlag();
|
||||
|
||||
template<typename FnProcess>
|
||||
void Process(FnProcess fnProcess)
|
||||
{
|
||||
SessionMap::iterator pos = m_uidMap.begin();
|
||||
SessionMap::iterator end = m_uidMap.end();
|
||||
|
||||
for(;pos != end; ++pos)
|
||||
{
|
||||
fnProcess(*pos->second);
|
||||
}
|
||||
}
|
||||
|
||||
template<typename FnProcess>
|
||||
void ProcessRealmPoint(FnProcess fnProcess, unsigned char cType)
|
||||
{
|
||||
SessionMap::iterator pos = m_uidMap.begin();
|
||||
SessionMap::iterator end = m_uidMap.end();
|
||||
|
||||
for(;pos != end; ++pos)
|
||||
{
|
||||
fnProcess(pos->second, cType);
|
||||
}
|
||||
}
|
||||
|
||||
template<typename FnProcess>
|
||||
void ProcessRealmTime(FnProcess fnProcess, TIME* pTime)
|
||||
{
|
||||
SessionMap::iterator pos = m_uidMap.begin();
|
||||
SessionMap::iterator end = m_uidMap.end();
|
||||
|
||||
for(;pos != end; ++pos)
|
||||
{
|
||||
fnProcess(pos->second, pTime);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
typedef std::map<CSessionData*, unsigned long> SessionPoolCheck;
|
||||
|
||||
typedef boost::object_pool<CSessionData> SessionPool;
|
||||
|
||||
typedef std::map<unsigned long, CSessionData*, std::less<unsigned long>,
|
||||
boost::fast_pool_allocator<std::pair<unsigned long, CSessionData*> > > SessionMap;
|
||||
|
||||
void SessionCloseWithLogout(SessionMap::iterator logoutPos);
|
||||
|
||||
SessionMap m_uidMap;
|
||||
SessionMap m_cidMap;
|
||||
|
||||
//SessionPool m_SessionPool;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,313 @@
|
||||
#include "stdafx.h"
|
||||
#include "StoreData.h"
|
||||
#include "SessionData.h"
|
||||
#include "DBDataMgr.h"
|
||||
#include "DBItemSerialMgr.h"
|
||||
|
||||
#include <DB/DBComponent.h>
|
||||
#include <DB/GameDBComponent.h>
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
#include <Utility/Debug/PerformanceCheck.h>
|
||||
|
||||
#include <Item/ItemMgr.h>
|
||||
#include <Item/Container/ContainerConstant.h>
|
||||
#include <Item/RebalanceConvert/OldItemMgr.h>
|
||||
#include <Item/RebalanceConvert/RebalanceItem.h>
|
||||
#include <Item/RebalanceConvert/ContainerChecker.h>
|
||||
|
||||
#include <mmsystem.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
|
||||
enum CHANGED_STORE_DATA
|
||||
{
|
||||
CHANGED_STORE_INFO = (1 << 0),
|
||||
CHANGED_STORE_1 = (1 << 1),
|
||||
CHANGED_STORE_2 = (1 << 2)
|
||||
};
|
||||
|
||||
|
||||
CStoreData::CStoreData()
|
||||
: m_dwUID(0), m_dwUpdateData(0), m_dwLastDBUpdateTime(0)
|
||||
{
|
||||
ClearData();
|
||||
}
|
||||
|
||||
CStoreData::~CStoreData()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void CStoreData::SetStoreInfo(const STORE_INFO& storeInfo)
|
||||
{
|
||||
if(0 != memcmp(&m_StoreInfo, &storeInfo, sizeof(STORE_INFO)))
|
||||
{
|
||||
m_StoreInfo = storeInfo;
|
||||
m_dwUpdateData |= CHANGED_STORE_INFO;
|
||||
}
|
||||
}
|
||||
|
||||
bool CStoreData::SetStore1(const char* lpData, unsigned long dwDataSize)
|
||||
{
|
||||
if(STORE::MAX_STORE_SIZE < dwDataSize)
|
||||
{
|
||||
SERLOG3(g_Log, "UID:%10u / â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> : Store1 (%u/%u)",
|
||||
GetUID(), STORE::MAX_STORE_SIZE, dwDataSize);
|
||||
|
||||
return false;
|
||||
}
|
||||
else if(m_Store1.dwSize != dwDataSize || 0 != memcmp(m_Store1.Data, lpData, dwDataSize))
|
||||
{
|
||||
memcpy(m_Store1.Data, lpData, dwDataSize);
|
||||
m_Store1.dwSize = dwDataSize;
|
||||
|
||||
m_dwUpdateData |= CHANGED_STORE_1;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CStoreData::SetStore2(const char* lpData, unsigned long dwDataSize)
|
||||
{
|
||||
if(STORE::MAX_STORE_SIZE < dwDataSize)
|
||||
{
|
||||
SERLOG3(g_Log, "UID:%10u / â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> : Store2 (%u/%u)",
|
||||
GetUID(), STORE::MAX_STORE_SIZE, dwDataSize);
|
||||
|
||||
return false;
|
||||
}
|
||||
else if(m_Store2.dwSize != dwDataSize || 0 != memcmp(m_Store2.Data, lpData, dwDataSize))
|
||||
{
|
||||
memcpy(m_Store2.Data, lpData, dwDataSize);
|
||||
m_Store2.dwSize = dwDataSize;
|
||||
|
||||
m_dwUpdateData |= CHANGED_STORE_2;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CStoreData::ClearData()
|
||||
{
|
||||
m_dwUID = 0;
|
||||
m_dwUpdateData = 0;
|
||||
m_cOldServerGroupID = 0;
|
||||
|
||||
memset(&m_StoreInfo, 0, sizeof(STORE_INFO));
|
||||
memset(&m_Store1, 0, sizeof(STORE));
|
||||
memset(&m_Store2, 0, sizeof(STORE));
|
||||
}
|
||||
|
||||
|
||||
bool CStoreData::GetFromDB(CDBComponent& DBComponent, UnifiedStoreKey storeKey)
|
||||
{
|
||||
PERFORMANCE_CHECK(FunctionTimingCheck);
|
||||
|
||||
ClearData();
|
||||
|
||||
using namespace DBComponent;
|
||||
|
||||
// â<><C3A2> <20><><EFBFBD><EFBFBD>
|
||||
if (!GameDB::GetUnifiedItemStoreInfo(DBComponent,
|
||||
storeKey.first, storeKey.second, &m_StoreInfo, true))
|
||||
{
|
||||
if (!GameDB::InsertUser(DBComponent, storeKey.first, storeKey.second, 0))
|
||||
{
|
||||
SERLOG2(g_Log, "UID:%10u / ServerGroupID:%d / â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD> : InsertUser ȣ<><C8A3> <20><><EFBFBD><EFBFBD>",
|
||||
storeKey.first, storeKey.second);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!GameDB::GetUnifiedItemStoreInfo(DBComponent,
|
||||
storeKey.first, storeKey.second, &m_StoreInfo))
|
||||
{
|
||||
SERLOG2(g_Log, "UID:%10u / ServerGroupID:%d / â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD> : GetUnifiedItemStoreInfo ȣ<><C8A3> <20><><EFBFBD><EFBFBD>",
|
||||
storeKey.first, storeKey.second);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// â<><C3A2> 1
|
||||
if (!GameDB::GetUnifiedItemStore1(DBComponent, storeKey.first, storeKey.second, &m_Store1))
|
||||
{
|
||||
SERLOG2(g_Log, "UID:%10u / ServerGroupID:%d / â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD> : GetItemStore1 ȣ<><C8A3> <20><><EFBFBD><EFBFBD>",
|
||||
storeKey.first, storeKey.second);
|
||||
return false;
|
||||
}
|
||||
|
||||
// â<><C3A2> 2
|
||||
if (!GameDB::GetUnifiedItemStore2(DBComponent, storeKey.first, storeKey.second, &m_Store2))
|
||||
{
|
||||
SERLOG2(g_Log, "UID:%10u / ServerGroupID:%d / â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD> : GetItemStore2 ȣ<><C8A3> <20><><EFBFBD><EFBFBD>",
|
||||
storeKey.first, storeKey.second);
|
||||
return false;
|
||||
}
|
||||
|
||||
m_dwUID = storeKey.first;
|
||||
m_cOldServerGroupID = storeKey.second;
|
||||
|
||||
INFLOG2(g_Log, "UID:%10u / ServerGroupID:%d / â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD> : CStoreData::GetFromDB", storeKey.first, storeKey.second);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool CStoreData::UpdateDBData(CDBComponent& DBComponent)
|
||||
{
|
||||
PERFORMANCE_CHECK(FunctionTimingCheck);
|
||||
|
||||
// <20><><EFBFBD>Ἲ <20>˻<EFBFBD>
|
||||
if (!IsVaildData())
|
||||
{
|
||||
SERLOG1(g_Log, "UID:%10u / â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : UpdateStoreToDB <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ἲ <20>˻<EFBFBD> <20><><EFBFBD><EFBFBD>", m_dwUID);
|
||||
return false;
|
||||
}
|
||||
else if(IsDataChanged())
|
||||
{
|
||||
using namespace DBComponent;
|
||||
|
||||
if ((m_dwUpdateData & CHANGED_STORE_INFO) &&
|
||||
!GameDB::SetUnifiedItemStoreInfo(DBComponent, m_dwUID, m_cOldServerGroupID, &m_StoreInfo))
|
||||
{
|
||||
// â<><C3A2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
SERLOG2(g_Log, "UID:%10u / ServerGroupID:%d / â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : SetUnifiedItemStoreInfo ȣ<><C8A3> <20><><EFBFBD><EFBFBD>",
|
||||
m_dwUID, m_cOldServerGroupID);
|
||||
return false;
|
||||
}
|
||||
else if((m_dwUpdateData & CHANGED_STORE_1) &&
|
||||
!GameDB::UpdateUnifiedItemStore1(DBComponent, m_dwUID, m_cOldServerGroupID, &m_Store1))
|
||||
{
|
||||
// â<><C3A2>1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
SERLOG2(g_Log, "UID:%10u / ServerGroupID:%d / â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : UpdateUnifiedItemStore1 ȣ<><C8A3> <20><><EFBFBD><EFBFBD>",
|
||||
m_dwUID, m_cOldServerGroupID);
|
||||
return false;
|
||||
}
|
||||
else if((m_dwUpdateData & CHANGED_STORE_2) &&
|
||||
!GameDB::UpdateUnifiedItemStore2(DBComponent, m_dwUID, m_cOldServerGroupID, &m_Store2))
|
||||
{
|
||||
// â<><C3A2>2 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
SERLOG2(g_Log, "UID:%10u / ServerGroupID:%d / â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : UpdateUnifiedItemStore2 ȣ<><C8A3> <20><><EFBFBD><EFBFBD>",
|
||||
m_dwUID, m_cOldServerGroupID);
|
||||
return false;
|
||||
}
|
||||
|
||||
m_dwUpdateData = 0;
|
||||
INFLOG2(g_Log, "UID:%10u / ServerGroupID:%d / â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : CStoreData::UpdateDBData",
|
||||
m_dwUID, m_cOldServerGroupID);
|
||||
}
|
||||
else
|
||||
{
|
||||
INFLOG2(g_Log, "UID:%10u / ServerGroupID:%d / â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20>ʾҽ<CABE><D2BD>ϴ<EFBFBD>.",
|
||||
m_dwUID, m_cOldServerGroupID);
|
||||
}
|
||||
|
||||
m_dwLastDBUpdateTime = timeGetTime();
|
||||
return true;
|
||||
}
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
bool CStoreData::ConvertToPart2Item(bool bConvertSkillToTicket)
|
||||
{
|
||||
RebalanceLib::CItemArrayChecker<
|
||||
ContainerConstant::DEPOSIT_WIDTH,
|
||||
ContainerConstant::DEPOSIT_HEIGHT,
|
||||
ContainerConstant::MAX_DEPOSIT_TAB> depositChecker(TakeType::TS_DEPOSIT);
|
||||
|
||||
RebalanceLib::SkillBookInfo skillBookInfo;
|
||||
|
||||
STORE store1;
|
||||
STORE store2;
|
||||
unsigned long dwGold = m_StoreInfo.Gold;
|
||||
|
||||
CDBAgentItemSerialMgr& dbItemSerialMgr =
|
||||
CDBAgentItemSerialMgr::GetInstance();
|
||||
|
||||
unsigned __int64 dwItemSerial = dbItemSerialMgr.GetItemSerial();
|
||||
|
||||
memset(&skillBookInfo, 0, sizeof(RebalanceLib::SkillBookInfo));
|
||||
memset(&store1, 0, sizeof(STORE));
|
||||
memset(&store2, 0, sizeof(STORE));
|
||||
|
||||
store1.dwSize = STORE::MAX_STORE_SIZE;
|
||||
store2.dwSize = STORE::MAX_STORE_SIZE;
|
||||
|
||||
if(!RebalanceLib::ConvertContainer(m_dwUID, 0, &depositChecker,
|
||||
bConvertSkillToTicket ? &skillBookInfo : 0,
|
||||
m_Store1.Data, m_Store1.dwSize, store1.Data, store1.dwSize))
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / ServerGroupID:%d / â<><C3A2>1 <20><><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>", m_dwUID, m_cOldServerGroupID);
|
||||
}
|
||||
else if(!RebalanceLib::ConvertContainer(m_dwUID, 0, &depositChecker,
|
||||
bConvertSkillToTicket ? &skillBookInfo : 0,
|
||||
m_Store2.Data, m_Store2.dwSize, store2.Data, store2.dwSize))
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / ServerGroupID:%d / â<><C3A2>2 <20><><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>", m_dwUID, m_cOldServerGroupID);
|
||||
}
|
||||
else
|
||||
{
|
||||
for(int nCount = 0; nCount < CSkillMgr::MAX_SKILL_LOCKCOUNT; ++nCount)
|
||||
{
|
||||
// 3<><33><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
skillBookInfo.m_dwBookNum[nCount] *= 3;
|
||||
}
|
||||
|
||||
if(bConvertSkillToTicket &&
|
||||
!RebalanceLib::AddSkillBook(m_dwUID, 0, "Store1", dbItemSerialMgr, dwGold,
|
||||
store1.Data, store1.dwSize, STORE::MAX_STORE_SIZE, depositChecker, skillBookInfo))
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / ServerGroupID:%d / â<><C3A2>1 <20><>ų<EFBFBD><C5B3> <20>־<EFBFBD><D6BE>ֱ <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>", m_dwUID, m_cOldServerGroupID);
|
||||
}
|
||||
else if(bConvertSkillToTicket && !skillBookInfo.IsEmpty() &&
|
||||
!RebalanceLib::AddSkillBook(m_dwUID, 0, "Store2", dbItemSerialMgr, dwGold,
|
||||
store2.Data, store2.dwSize, STORE::MAX_STORE_SIZE, depositChecker, skillBookInfo))
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / ServerGroupID:%d / â<><C3A2>2 <20><>ų<EFBFBD><C5B3> <20>־<EFBFBD><D6BE>ֱ <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>", m_dwUID, m_cOldServerGroupID);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(dwItemSerial < dbItemSerialMgr.GetItemSerial())
|
||||
{
|
||||
dbItemSerialMgr.SaveItemSerial(
|
||||
CDBSingleObject::GetInstance(), dbItemSerialMgr.GetServerID());
|
||||
}
|
||||
|
||||
m_StoreInfo.Gold = dwGold;
|
||||
m_Store1 = store1;
|
||||
m_Store2 = store2;
|
||||
}
|
||||
|
||||
if(!skillBookInfo.IsEmpty())
|
||||
{
|
||||
for(int nCount = 0; nCount < CSkillMgr::MAX_SKILL_LOCKCOUNT; ++nCount)
|
||||
{
|
||||
if(0 != skillBookInfo.m_dwBookNum[nCount])
|
||||
{
|
||||
ERRLOG3(g_Log, "UID:%10u / LockCount:%d / Num:%d / <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>",
|
||||
m_dwUID, nCount + 1, skillBookInfo.m_dwBookNum[nCount]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CStoreData::WriteDataToDumpFile(const char* szFileName)
|
||||
{
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CStoreData::ReadDataFromDumpFile(const char* szFileName)
|
||||
{
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
#ifndef _RYL_DBAGENT_USER_DATA_H_
|
||||
#define _RYL_DBAGENT_USER_DATA_H_
|
||||
|
||||
#include <DB/DBdefine.h>
|
||||
|
||||
// forward decl.
|
||||
class CDBComponent;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
typedef std::pair<unsigned long, unsigned char> UnifiedStoreKey;
|
||||
|
||||
class CStoreData
|
||||
{
|
||||
public:
|
||||
|
||||
CStoreData();
|
||||
~CStoreData();
|
||||
|
||||
UnifiedStoreKey GetKey() const { return UnifiedStoreKey(m_dwUID, m_cOldServerGroupID); }
|
||||
unsigned long GetUID() const { return m_dwUID; }
|
||||
|
||||
const STORE_INFO& GetStoreInfo() const { return m_StoreInfo; }
|
||||
const STORE& GetStore1() const { return m_Store1; }
|
||||
const STORE& GetStore2() const { return m_Store2; }
|
||||
|
||||
void SetStoreInfo(const STORE_INFO& storeInfo);
|
||||
bool SetStore1(const char* lpData, unsigned long dwDataSize);
|
||||
bool SetStore2(const char* lpData, unsigned long dwDataSize);
|
||||
|
||||
bool IsVaildData() const
|
||||
{
|
||||
return 0 != m_dwUID &&
|
||||
0 != strncmp("", m_StoreInfo.Password, STORE_INFO::MAX_PASS_LEN);
|
||||
}
|
||||
|
||||
bool IsDataChanged() const { return (0 != m_dwUpdateData); }
|
||||
|
||||
void ClearData();
|
||||
|
||||
//! DB<44><42> â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
bool UpdateDBData(CDBComponent& DBComponent);
|
||||
|
||||
//! DB<44><42> â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ѵ<EFBFBD>.
|
||||
bool ForceUpdateDBAllData(CDBComponent& DBComponent)
|
||||
{
|
||||
m_dwUpdateData = 0xFFFFFFFF;
|
||||
return UpdateDBData(DBComponent);
|
||||
}
|
||||
|
||||
unsigned long GetLastDBUpdateTime() const { return m_dwLastDBUpdateTime; }
|
||||
|
||||
//! DB<44><42><EFBFBD><EFBFBD> â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
|
||||
bool GetFromDB(CDBComponent& DBComponent, UnifiedStoreKey storeKey);
|
||||
|
||||
bool WriteDataToDumpFile(const char* szFileName);
|
||||
bool ReadDataFromDumpFile(const char* szFileName);
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
bool ConvertToPart2Item(bool bConvertSkillToTicket);
|
||||
|
||||
private:
|
||||
|
||||
unsigned long m_dwUID;
|
||||
unsigned long m_dwUpdateData;
|
||||
unsigned long m_dwLastDBUpdateTime;
|
||||
|
||||
STORE_INFO m_StoreInfo;
|
||||
STORE m_Store1;
|
||||
STORE m_Store2;
|
||||
|
||||
unsigned char m_cOldServerGroupID;
|
||||
};
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,75 @@
|
||||
#include "stdafx.h"
|
||||
#include "StoreDataMgr.h"
|
||||
#include <Log/ServerLog.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
|
||||
CStoreDataMgr& CStoreDataMgr::GetInstance()
|
||||
{
|
||||
static CStoreDataMgr storeDataMgr;
|
||||
return storeDataMgr;
|
||||
}
|
||||
|
||||
CStoreDataMgr::CStoreDataMgr()
|
||||
{
|
||||
SetManagerName("â<EFBFBD><EFBFBD>");
|
||||
}
|
||||
|
||||
|
||||
CStoreDataMgr::~CStoreDataMgr()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void CStoreDataMgr::Log(LOG_TYPE eLogType, const char* pRtn, const char* pFileName, int nLine,
|
||||
const CSessionData* lpSessionData, const UnifiedStoreKey& dataKey, const char* szErrorMsg)
|
||||
{
|
||||
switch(eLogType)
|
||||
{
|
||||
case LOG_NORMAL:
|
||||
case LOG_RULE:
|
||||
case LOG_INFO:
|
||||
|
||||
if(0 != lpSessionData)
|
||||
{
|
||||
g_Log.SimpleLog(eLogType, "UID:%10u / CID:%10u / KeyUID:%10u / KeyServerGroupID:%d / %s %s",
|
||||
lpSessionData->GetUID(), lpSessionData->GetCID(),
|
||||
dataKey.first, dataKey.second, GetManagerName(), szErrorMsg);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_Log.SimpleLog(eLogType, "KeyUID:%10u / KeyServerGroupID:%d / %s %s",
|
||||
dataKey.first, dataKey.second, GetManagerName(), szErrorMsg);
|
||||
}
|
||||
break;
|
||||
|
||||
case LOG_DETAIL:
|
||||
case LOG_SYSERR:
|
||||
case LOG_ERROR:
|
||||
case LOG_DEBUG:
|
||||
case LOG_WARN:
|
||||
|
||||
if(0 != lpSessionData)
|
||||
{
|
||||
g_Log.DetailLog(eLogType, pRtn, pFileName, nLine,
|
||||
"UID:%10u / CID:%10u / KeyUID:%10u / KeyServerGroupID:%d / %s %s",
|
||||
lpSessionData->GetUID(), lpSessionData->GetCID(),
|
||||
dataKey.first, dataKey.second, GetManagerName(), szErrorMsg);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_Log.DetailLog(eLogType, pRtn, pFileName, nLine,
|
||||
"KeyUID:%10u / KeyServerGroupID:%d / %s %s",
|
||||
dataKey.first, dataKey.second, GetManagerName(), szErrorMsg);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
#ifndef _RYL_DBAGENT_STORE_DATA_MGR_H_
|
||||
#define _RYL_DBAGENT_STORE_DATA_MGR_H_
|
||||
|
||||
#include "DBDataMgr.h"
|
||||
#include "StoreData.h"
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
// ù<><C3B9>° : UID
|
||||
// <20>ι<EFBFBD>° : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȣ
|
||||
class CStoreDataMgr : public CDBDataMgr<UnifiedStoreKey, CStoreData>
|
||||
{
|
||||
public:
|
||||
|
||||
static CStoreDataMgr& GetInstance();
|
||||
|
||||
private:
|
||||
|
||||
CStoreDataMgr();
|
||||
~CStoreDataMgr();
|
||||
|
||||
virtual void Log(LOG_TYPE eLogType, const char* pRtn, const char* pFileName, int nLine,
|
||||
const CSessionData* lpSessionData, const UnifiedStoreKey& dataKey, const char* szErrorMsg);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -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
|
||||
2243
Server/RylServerProject/RylDBAgentServer/GameTime/GameTimeDBMgr.cpp
Normal file
2243
Server/RylServerProject/RylDBAgentServer/GameTime/GameTimeDBMgr.cpp
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,179 @@
|
||||
#ifndef _RYL_DBAGENT_GAME_TIME_DB_MANAGER_H_
|
||||
#define _RYL_DBAGENT_GAME_TIME_DB_MANAGER_H_
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <GameTime/GameTimeConstants.h>
|
||||
#include <Network/Packet/PacketStruct/CastlePacket.h>
|
||||
#include <DataStorage/SessionData.h>
|
||||
|
||||
using namespace GameTime;
|
||||
using namespace DBAgent;
|
||||
|
||||
class CDBComponent;
|
||||
|
||||
class CDBComponent;
|
||||
|
||||
class CSessionData;
|
||||
|
||||
class CGameTimeDBMgr
|
||||
{
|
||||
public:
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD>ü
|
||||
struct sGameTime
|
||||
{
|
||||
unsigned long m_dwID;
|
||||
|
||||
TimeType m_eTimeType; // <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD> Ÿ<><C5B8> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
Cycle m_eTimeCycle; // <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20>ֱ<EFBFBD> (<28><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>, <20>ſ<EFBFBD>, Ư<><C6AF><EFBFBD><EFBFBD>)
|
||||
Week m_eWeek; // Cycle <20><> Weekly <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
unsigned short m_wYear; // <20>
|
||||
unsigned char m_cMonth; // <20><>
|
||||
unsigned char m_cDay; // <20><>
|
||||
unsigned char m_cHour; // <20>ð<EFBFBD>
|
||||
unsigned char m_cMinute; // <20><>
|
||||
unsigned long m_dwDuration; // <20>÷<EFBFBD><C3B7><EFBFBD> Ÿ<><C5B8> (<28><>)
|
||||
|
||||
// edith 2009.07.21 <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> <20>۾<EFBFBD><DBBE><EFBFBD>
|
||||
unsigned long m_dwValue1; // <20><>Ÿ<EFBFBD>۾<EFBFBD><DBBE><EFBFBD>
|
||||
unsigned long m_dwValue2; // <20><>Ÿ<EFBFBD>۾<EFBFBD><DBBE><EFBFBD>
|
||||
|
||||
sGameTime::sGameTime()
|
||||
{
|
||||
m_dwID = 0;
|
||||
m_eTimeType = TYPE_NONE;
|
||||
m_eTimeCycle = CYCLE_NONE;
|
||||
m_eWeek = WEEK_NONE;
|
||||
m_wYear = 0;
|
||||
m_cMonth = 0;
|
||||
m_cDay = 0;
|
||||
m_cHour = 0;
|
||||
m_cMinute = 0;
|
||||
m_dwDuration = 0;
|
||||
|
||||
m_dwValue1 = 0;
|
||||
m_dwValue2 = 0;
|
||||
}
|
||||
};
|
||||
|
||||
typedef std::map<unsigned long, sGameTime> GameTimeTable;
|
||||
|
||||
|
||||
|
||||
// <20>Ľ<EFBFBD> <20><><EFBFBD><EFBFBD>ü
|
||||
struct ParseData
|
||||
{
|
||||
typedef bool(*ParseFunc) (sGameTime& gametime, const char* szValue);
|
||||
|
||||
const char* m_szColumnName;
|
||||
ParseFunc m_fnParseFunc;
|
||||
|
||||
ParseData(const char* szColumnName, ParseFunc fnParseFunc)
|
||||
: m_szColumnName(szColumnName), m_fnParseFunc(fnParseFunc) { }
|
||||
};
|
||||
|
||||
typedef std::vector<ParseData> ParseDataArray;
|
||||
|
||||
public:
|
||||
|
||||
bool LoadGameTimeScript(const char* szFileName);
|
||||
bool Initialize(CDBComponent& DBComponent);
|
||||
void InitGameTimeValue(unsigned char cGuildTime, unsigned char cRealmTime,
|
||||
unsigned char cSiegeTime, unsigned char cMiningTime,
|
||||
unsigned char cEnterTime, unsigned char cEventTime);
|
||||
|
||||
void Process();
|
||||
void CheckGameTime();
|
||||
void SendGameTimeInfo(unsigned char cType, bool bUpdateGuildTime, bool bUpdateRealmTime, bool bUpdateSiegeTime, bool bUpdateEnterTime, bool bUpdateEventTime);
|
||||
void SendGameTimeInfo(unsigned long dwCastleID); // Ư<><C6AF> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
unsigned char GetCurrentGameTime(unsigned char cTimeType) const;
|
||||
unsigned char GetCurrentGuildTime() const;
|
||||
unsigned char GetCurrentRealmTime() const;
|
||||
unsigned char GetCurrentSiegeTime() const;
|
||||
unsigned char GetCurrentEnterTime() const;
|
||||
unsigned char GetCurrentMiningTime() const;
|
||||
|
||||
// edith 2009.07.21 <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> <20>۾<EFBFBD><DBBE><EFBFBD>
|
||||
unsigned char GetCurrentEventTime() const;
|
||||
|
||||
|
||||
bool IsGuildWarTime() const;
|
||||
bool IsRealmWarTime() const;
|
||||
bool IsSiegeWarTime() const;
|
||||
bool IsEnterTime() const;
|
||||
bool IsMiningTime() const;
|
||||
|
||||
// edith 2009.07.21 <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> <20>۾<EFBFBD><DBBE><EFBFBD>
|
||||
bool IsEventTime() const;
|
||||
|
||||
bool IsGuildWarTime(unsigned char cTime) const;
|
||||
bool IsRealmWarTime(unsigned char cTime) const;
|
||||
bool IsSiegeWarTime(unsigned char cTime) const;
|
||||
bool IsEnterTime(unsigned char cTime) const;
|
||||
bool IsMiningTime(unsigned char cTime) const;
|
||||
|
||||
// edith 2009.07.21 <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> <20>۾<EFBFBD><DBBE><EFBFBD>
|
||||
bool IsEventTime(unsigned char cTime) const;
|
||||
|
||||
bool IsRealmWarReadyTime() const;
|
||||
bool IsRealmWarReadyTime(unsigned char cTime) const;
|
||||
|
||||
const GameTimeTable& GetGameTimeTable() const { return m_GameTimeTable; }
|
||||
|
||||
static CGameTimeDBMgr& GetInstance();
|
||||
|
||||
void CheckRealmCount(CTime& startTime, unsigned long* dwRealmCount_Out); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ƚ<><C8BD><EFBFBD><EFBFBD> üũ.
|
||||
|
||||
unsigned long GetRealmDuration(void) { return m_dwRealmTime; }
|
||||
|
||||
protected:
|
||||
|
||||
CGameTimeDBMgr();
|
||||
~CGameTimeDBMgr();
|
||||
|
||||
private:
|
||||
|
||||
bool SetGameTimeParseData(ParseDataArray& parseDataArray);
|
||||
|
||||
bool IntegrityCheck(); // <20><><EFBFBD>Ἲ <20>˻<EFBFBD>
|
||||
|
||||
CTime GetTimeByCycle(sGameTime* lpGameTime, CTime nowTime = 0);
|
||||
CTime GetWeeklyTime(sGameTime* lpGameTime, CTime nowTime = 0);
|
||||
CTime GetDailyTime(sGameTime* lpGameTime, CTime nowTime = 0);
|
||||
CTime GetMonthlyTime(sGameTime* lpGameTime, CTime nowTime = 0);
|
||||
CTime GetDateTime(sGameTime* lpGameTime, CTime nowTime = 0);
|
||||
|
||||
void GetTimeInfo(unsigned char cType, TimeInfo& timeInfo);
|
||||
|
||||
void GetNextMonth(CTime* pTime);
|
||||
|
||||
private:
|
||||
|
||||
unsigned char m_cNowGuildTime; // enum GuildTime
|
||||
unsigned char m_cNowRealmTime; // enum RealmTime
|
||||
unsigned char m_cNowSiegeTime; // enum SiegeTime
|
||||
unsigned char m_cNowEnterTime; // enum EnterTime. <20><EFBFBD><D7BC><EFBFBD> <20>ű<EFBFBD><C5B1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD>
|
||||
unsigned char m_cNowMiningTime; // enum MiningTime
|
||||
|
||||
// edith 2009.07.21 <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> <20>۾<EFBFBD><DBBE><EFBFBD>
|
||||
unsigned char m_cNowEventTime; // enum EventTime
|
||||
|
||||
GameTimeTable m_GameTimeTable;
|
||||
|
||||
CDBComponent* m_lpDBComponent;
|
||||
|
||||
unsigned long m_dwRealmTime; // <20><><EFBFBD>翡 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ´<D6B4>.
|
||||
};
|
||||
|
||||
namespace RealmPoint
|
||||
{
|
||||
void AddRealmPoint(DBAgent::DataStorage::CSessionData* sessionData, unsigned char cRealmType);
|
||||
void InitRealmTime(DBAgent::DataStorage::CSessionData* sessionData, TIME* pTime);
|
||||
};
|
||||
|
||||
#endif // _RYL_DBAGENT_GAME_TIME_DB_MANAGER_H_
|
||||
@@ -0,0 +1,165 @@
|
||||
#include "StdAfx.h"
|
||||
#include "MineralVeinDBMgr.h"
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
#include <DB/DBComponent.h>
|
||||
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
#include <Network/Packet/PacketStruct/CastlePacket.h>
|
||||
#include <Network/Dispatch/GameDispatch.h>
|
||||
|
||||
#include <Castle/CastleDBComponent.h>
|
||||
|
||||
CMineralVeinDBMgr& CMineralVeinDBMgr::GetInstance()
|
||||
{
|
||||
static CMineralVeinDBMgr ms_this;
|
||||
return ms_this;
|
||||
}
|
||||
|
||||
CMineralVeinDBMgr::CMineralVeinDBMgr()
|
||||
: m_lpDBComponent(0)
|
||||
{
|
||||
}
|
||||
|
||||
CMineralVeinDBMgr::~CMineralVeinDBMgr()
|
||||
{
|
||||
Destroy();
|
||||
}
|
||||
|
||||
bool CMineralVeinDBMgr::Initialize(CDBComponent& DBComponent)
|
||||
{
|
||||
m_lpDBComponent = &DBComponent;
|
||||
|
||||
if (!ReadFertilityDB())
|
||||
{
|
||||
ERRLOG0(g_Log, "DB <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>дµ<D0B4> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CMineralVeinDBMgr::Destroy()
|
||||
{
|
||||
m_mapFertility.clear();
|
||||
}
|
||||
|
||||
bool CMineralVeinDBMgr::ReadFertilityDB()
|
||||
{
|
||||
const int MAX_ROWS = 10240;
|
||||
int nGetRows = 0;
|
||||
|
||||
char szBuffer[CDBComponent::QUERY_BUFFER_LEN];
|
||||
_snprintf(szBuffer, CDBComponent::QUERY_BUFFER_LEN - 1,
|
||||
"SELECT TblFertilityInfo.nVeinColor, "
|
||||
"TblFertilityInfo.nFertility, "
|
||||
"TblFertilityInfo.tnZone, "
|
||||
"TblFertilityInfo.tnChannel "
|
||||
"FROM TblFertilityInfo ");
|
||||
|
||||
szBuffer[CDBComponent::QUERY_BUFFER_LEN - 1] = 0;
|
||||
|
||||
if (0 == m_lpDBComponent || !m_lpDBComponent->ExecuteQuery(szBuffer))
|
||||
{
|
||||
ERRLOG0(g_Log, "Fertility DB <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>");
|
||||
return false;
|
||||
}
|
||||
|
||||
FertilityInfoDB* fertilityInfo = new FertilityInfoDB[MAX_ROWS];
|
||||
memset(fertilityInfo, 0, sizeof(FertilityInfoDB) * MAX_ROWS);
|
||||
|
||||
while (m_lpDBComponent->GetData((void**)fertilityInfo, sizeof(FertilityInfoDB), MAX_ROWS, &nGetRows))
|
||||
{
|
||||
if (0 == nGetRows) { break; }
|
||||
|
||||
for (FertilityInfoDB* lpFertilityInfo = fertilityInfo; nGetRows > 0; --nGetRows, ++lpFertilityInfo)
|
||||
{
|
||||
unsigned long dwZoneChannel = static_cast<unsigned long>(lpFertilityInfo->m_cZone << 16 | lpFertilityInfo->m_cChannel);
|
||||
|
||||
FertilityZoneMap::iterator itr = m_mapFertility.find(dwZoneChannel);
|
||||
if ( itr == m_mapFertility.end() )
|
||||
{
|
||||
FertilityInfoMap tempFertilityInfoMap;
|
||||
tempFertilityInfoMap.insert(std::make_pair(lpFertilityInfo->m_dwVeinColor, lpFertilityInfo->m_dwFertility)).second;
|
||||
|
||||
m_mapFertility.insert(std::make_pair(dwZoneChannel, tempFertilityInfoMap)).second;
|
||||
}
|
||||
else
|
||||
{
|
||||
FertilityInfoMap& tempFertilityInfoMap = itr->second;
|
||||
tempFertilityInfoMap.insert(std::make_pair(lpFertilityInfo->m_dwVeinColor, lpFertilityInfo->m_dwFertility)).second;
|
||||
}
|
||||
}
|
||||
|
||||
memset(fertilityInfo, 0, sizeof(FertilityInfoDB) * MAX_ROWS);
|
||||
}
|
||||
|
||||
delete [] fertilityInfo;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CMineralVeinDBMgr::SendFertilityInfo(CSendStream& SendStream, unsigned char cZone, unsigned char cChannel)
|
||||
{
|
||||
char szBuffer[2048];
|
||||
unsigned short usBufferSize = 0;
|
||||
unsigned long dwZoneChannel = static_cast<unsigned long>(cZone << 16 | cChannel);
|
||||
|
||||
PktFertilityInfo* lpPktFertilityInfo = reinterpret_cast<PktFertilityInfo*>(szBuffer);
|
||||
|
||||
FertilityZoneMap::iterator pos = m_mapFertility.find(dwZoneChannel);
|
||||
if ( pos != m_mapFertility.end() )
|
||||
{
|
||||
FertilityInfoMap& fertilityMap = pos->second;
|
||||
|
||||
unsigned long* lpValues = reinterpret_cast<unsigned long*>( lpPktFertilityInfo + 1 );
|
||||
|
||||
for (FertilityInfoMap::iterator itr = fertilityMap.begin(); itr != fertilityMap.end(); ++itr)
|
||||
{
|
||||
*lpValues = itr->first;
|
||||
++lpValues;
|
||||
*lpValues = itr->second;
|
||||
++lpValues;
|
||||
|
||||
usBufferSize += sizeof(unsigned long) * 2;
|
||||
}
|
||||
|
||||
lpPktFertilityInfo->m_wNum = static_cast<unsigned short>( fertilityMap.size() );
|
||||
lpPktFertilityInfo->m_wSize = usBufferSize;
|
||||
|
||||
return SendStream.WrapCompress(szBuffer, static_cast<unsigned short>(sizeof(PktFertilityInfo) + usBufferSize), CmdFertilityInfo, 0, 0);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CMineralVeinDBMgr::UpdateFertilityInfo(unsigned char cZone, unsigned char cChannel,
|
||||
unsigned short wNum, unsigned long* lpFertilityInfo)
|
||||
{
|
||||
unsigned long dwZoneChannel = static_cast<unsigned long>(cZone << 16 | cChannel);
|
||||
FertilityZoneMap::iterator pos = m_mapFertility.find(dwZoneChannel);
|
||||
if ( pos != m_mapFertility.end() )
|
||||
{
|
||||
FertilityInfoMap& fertilityMap = pos->second;
|
||||
|
||||
unsigned long dwVeinColor, dwFertility;
|
||||
|
||||
for (int i=0; i<wNum; ++i)
|
||||
{
|
||||
dwVeinColor = *lpFertilityInfo; ++lpFertilityInfo;
|
||||
dwFertility = *lpFertilityInfo; ++lpFertilityInfo;
|
||||
|
||||
FertilityInfoMap::iterator itr = fertilityMap.find( dwVeinColor );
|
||||
if ( itr != fertilityMap.end() )
|
||||
{
|
||||
if (itr->second != dwFertility)
|
||||
{
|
||||
itr->second = dwFertility;
|
||||
DBComponent::CastleDB::UpdateFertilityInfo(*m_lpDBComponent, cZone, cChannel, dwVeinColor, dwFertility);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
#ifndef __RYL_DBAGENT_MINERAL_VEIN_MANAGER_H__
|
||||
#define __RYL_DBAGENT_MINERAL_VEIN_MANAGER_H__
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <map>
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
class CSendStream;
|
||||
class CDBComponent;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD> (<28>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.)
|
||||
class CMineralVeinDBMgr
|
||||
{
|
||||
public:
|
||||
|
||||
static CMineralVeinDBMgr& GetInstance();
|
||||
|
||||
typedef std::map<unsigned long, unsigned long> FertilityInfoMap; // < VeinColor, Fertility >, Fertility Info Per Zone
|
||||
typedef std::map<unsigned long, FertilityInfoMap> FertilityZoneMap; // < ZoneChannel, FertilityInfo >, Fertility Info Of All Zone, Channel
|
||||
// ZoneChannel : Zone (16bit), Channel (16bit)
|
||||
|
||||
bool Initialize(CDBComponent& DBComponent);
|
||||
void Destroy();
|
||||
|
||||
bool SendFertilityInfo(CSendStream& SendStream, unsigned char cZone, unsigned char cChannel);
|
||||
bool UpdateFertilityInfo(unsigned char cZone, unsigned char cChannel, unsigned short wNum, unsigned long* lpFertilityInfo);
|
||||
|
||||
private:
|
||||
|
||||
CMineralVeinDBMgr();
|
||||
~CMineralVeinDBMgr();
|
||||
|
||||
bool ReadFertilityDB();
|
||||
|
||||
FertilityZoneMap m_mapFertility;
|
||||
CDBComponent* m_lpDBComponent;
|
||||
};
|
||||
|
||||
#endif // __RYL_DBAGENT_MINERAL_VEIN_MANAGER_H__
|
||||
@@ -0,0 +1,910 @@
|
||||
#include "stdafx.h"
|
||||
#include "AdminToolDispatch.h"
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
#include <Network/Address/INET_Addr.h>
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
#include <Network/Packet/PacketStruct/ServerInfo.h>
|
||||
#include <Network/Packet/PacketStruct/ServerPacket.h>
|
||||
#include <Network/Packet/PacketStruct/CharAdminPacket.h>
|
||||
#include <Network/Packet/PacketStruct/GameEventPacket.h>
|
||||
#include <Network/Packet/PacketStruct/CharLoginOutPacketStruct.h>
|
||||
|
||||
#include <Network/SendPacket/SendAdminTool.h>
|
||||
#include <Network/SendPacket/SendServerInfo.h>
|
||||
|
||||
#include <Network/Dispatch/GameDispatch.h>
|
||||
#include <Network/Dispatch/GameClient/SendCharAdmin.h>
|
||||
|
||||
#include <DataStorage/AdminDataMgr.h>
|
||||
#include <DataStorage/SessionData.h>
|
||||
#include <DataStorage/SessionDataMgr.h>
|
||||
#include <DataStorage/StoreData.h>
|
||||
#include <DataStorage/StoreDataMgr.h>
|
||||
#include <DataStorage/CharacterData.h>
|
||||
#include <DataStorage/CharacterDataMgr.h>
|
||||
|
||||
#include <DB/DBComponent.h>
|
||||
#include <DB/GameDBComponent.h>
|
||||
#include <DB/GuildDBComponent.h>
|
||||
#include <GameEvent/GameEventDBMgr.h>
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
#include <Creature/Character/CharacterClass.h>
|
||||
|
||||
#include <Network/Packet/PacketStruct/GuildPacket.h>
|
||||
|
||||
#include <Community/Guild/GuildDB.h>
|
||||
#include <Community/Guild/GuildDBMgr.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
|
||||
// forward decl.
|
||||
bool GetUIDCIDFromName(const char* szName, unsigned long& dwUID_Out,
|
||||
unsigned long& dwCID_Out, unsigned char& cOldServerGroupID);
|
||||
|
||||
|
||||
CMultiDispatch& CAdminToolDispatch::GetDispatchTable()
|
||||
{
|
||||
static CMultiDispatch gameDispatch;
|
||||
return gameDispatch;
|
||||
}
|
||||
|
||||
|
||||
CAdminToolDispatch::CAdminToolDispatch(CSession& Session)
|
||||
: CRylServerDispatch(Session, MAX_PACKET_DISPATCH_PER_PULSE),
|
||||
m_dwServerID(0)
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
CAdminToolDispatch::~CAdminToolDispatch()
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
void CAdminToolDispatch::Connected()
|
||||
{
|
||||
DETLOG3(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/AdminToolServer Connected",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string());
|
||||
}
|
||||
|
||||
void CAdminToolDispatch::Disconnected()
|
||||
{
|
||||
DETLOG3(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/AdminToolServer Disconnected",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string());
|
||||
|
||||
if(0 != m_dwServerID)
|
||||
{
|
||||
GetDispatchTable().RemoveDispatch(m_dwServerID);
|
||||
|
||||
if(0LL != m_AdminItemSerialMgr.GetItemSerial())
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> DB<44><42> <20><><EFBFBD><EFBFBD>
|
||||
m_AdminItemSerialMgr.SaveItemSerial(
|
||||
CDBSingleObject::GetInstance(), m_dwServerID);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool CAdminToolDispatch::DispatchPacket(PktBase* lpPktBase)
|
||||
{
|
||||
bool bResult = false;
|
||||
PktBase::CMDType cCmd = lpPktBase->GetCmd();
|
||||
|
||||
switch(cCmd)
|
||||
{
|
||||
case CmdSysServerLogin: bResult = ParseServerLogin(static_cast<PktSL*>(lpPktBase)); break;
|
||||
case CmdSysServerLogout: bResult = ParseServerLogout(lpPktBase); break;
|
||||
case CmdUserKill: bResult = ParseUserKill(static_cast<PktUK*>(lpPktBase)); break;
|
||||
case CmdAdminToolGetData: bResult = ParseGetData(static_cast<PktAdminToolGetData*>(lpPktBase)); break;
|
||||
case CmdAdminToolSetData: bResult = ParseSetData(static_cast<PktAdminToolSetData*>(lpPktBase)); break;
|
||||
case CmdItemQtyCheck: bResult = ParseItemQtyCheck(static_cast<PktItemQtyControl*>(lpPktBase)); break;
|
||||
case CmdGuildPosition: bResult = ParseGuildPosition(static_cast<PktGuildPosition*>(lpPktBase)); break;
|
||||
|
||||
default:
|
||||
|
||||
ERRLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/Cmd:0x%02X/ <20><EFBFBD><EEBFB5> <20><><EFBFBD><EFBFBD> <20><>Ŷ ó<><C3B3> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> Ŀ<>ǵ<EFBFBD><C7B5>Դϴ<D4B4>",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string(), cCmd);
|
||||
|
||||
bResult = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if(!bResult)
|
||||
{
|
||||
ERRLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/Cmd:0x%02X/ <20><EFBFBD><EEBFB5> <20><><EFBFBD><EFBFBD> <20><>Ŷ ó<><C3B3> <20><><EFBFBD><EFBFBD> : ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string(), cCmd);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CAdminToolDispatch::ParseServerLogin(PktSL* lpPktSL)
|
||||
{
|
||||
m_dwServerID = lpPktSL->m_dwServerID;
|
||||
|
||||
INFLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/ServerID:0x%08X/ <20><EFBFBD><EEBFB5> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>õ<EFBFBD> : <20><>Ŷ <20><><EFBFBD><EFBFBD>",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string(), m_dwServerID);
|
||||
|
||||
GET_MULTI_DISPATCH(lpAdminToolDispatch, m_dwServerID,
|
||||
CAdminToolDispatch, GetDispatchTable());
|
||||
|
||||
if(0 != lpAdminToolDispatch)
|
||||
{
|
||||
ERRLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/ServerID:0x%08X/ <20><EFBFBD><EEBFB5> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string(), m_dwServerID);
|
||||
|
||||
CloseSession();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Dispatch <20><><EFBFBD><EFBFBD>.
|
||||
GetDispatchTable().SetDispatch(m_dwServerID, this);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> <20>ε<EFBFBD>.
|
||||
if(!m_AdminItemSerialMgr.LoadItemSerial(CDBSingleObject::GetInstance(), m_dwServerID))
|
||||
{
|
||||
ERRLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/ServerID:0x%08X/ <20><EFBFBD><EEBFB5> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string(), m_dwServerID);
|
||||
|
||||
CloseSession();
|
||||
return false;
|
||||
}
|
||||
|
||||
return SendPacket::ServerLoginAck(m_SendStream,
|
||||
m_dwServerID, m_AdminItemSerialMgr.GetItemSerial());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CAdminToolDispatch::ParseServerLogout(PktBase* lpPktBase)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><>Ŷ <20>״<EFBFBD><D7B4><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ش<EFBFBD>.
|
||||
|
||||
char* lpBuffer = m_SendStream.GetBuffer(sizeof(PktBase));
|
||||
if(0 != lpBuffer)
|
||||
{
|
||||
return m_SendStream.WrapHeader(sizeof(PktBase), CmdSysServerLogout, 0, 0);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CAdminToolDispatch::ParseUserKill(PktUK* lpPktUK)
|
||||
{
|
||||
using namespace DataStorage;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> DB<44><42> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IP<49><50> <20><>ġ<EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰ſ<DFB0> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ش<EFBFBD>.
|
||||
CSessionData* lpSessionData =
|
||||
CSessionDataMgr::GetInstance().GetOpenSession(lpPktUK->m_dwUserID);
|
||||
|
||||
if(0 == lpSessionData)
|
||||
{
|
||||
ERRLOG1(g_Log, "UID:%10u / <20><EFBFBD><EEBFB5> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>", lpPktUK->m_dwUserID);
|
||||
}
|
||||
else
|
||||
{
|
||||
SERVER_ID serverID;
|
||||
serverID.dwID = lpSessionData->GetServerID();
|
||||
CSessionData::SessionState eSessionState = lpSessionData->GetSessionState();
|
||||
|
||||
if ((serverID.GetType() == CServerSetup::AuthServer && CSessionData::SE_USER_ENABLED != eSessionState) ||
|
||||
(serverID.GetType() == CServerSetup::GameServer && CSessionData::SE_CHAR_ENABLED != eSessionState))
|
||||
{
|
||||
ERRLOG3(g_Log, "UID:%10u / ServerID:0x%08X / ST:%s / <20><EFBFBD><EEBFB5> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><>Ȱ<EFBFBD><C8B0>ȭ<EFBFBD>Ǿ<EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>",
|
||||
lpPktUK->m_dwUserID, serverID.dwID, g_szSessionStateString[lpSessionData->GetSessionState()]);
|
||||
}
|
||||
else if(!SendPacket::UserKill(*lpSessionData))
|
||||
{
|
||||
ERRLOG3(g_Log, "UID:%10u / ServerID:0x%08X / ST:%s / <20><EFBFBD><EEBFB5> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
lpPktUK->m_dwUserID, serverID.dwID, g_szSessionStateString[lpSessionData->GetSessionState()]);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool CAdminToolDispatch::ParseGetData(PktBase* lpPktBase)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><>Ŷ <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD>.
|
||||
PktAdminToolGetData* lpPktAdminToolGetData = static_cast<PktAdminToolGetData*>(lpPktBase);
|
||||
|
||||
switch(lpPktAdminToolGetData->m_cType)
|
||||
{
|
||||
case PktAdminToolGetData::GET_CHAR_DATA:
|
||||
|
||||
return ParseAdminToolGetData(lpPktAdminToolGetData);
|
||||
|
||||
case PktAdminToolGetData::CHANGE_CHAR_NAME:
|
||||
|
||||
return ParseAdminToolChangeName(lpPktAdminToolGetData);
|
||||
|
||||
default:
|
||||
|
||||
ERRLOG2(g_Log, "IP:%15s / Cmd:%d / <20><> <20><> <20><><EFBFBD><EFBFBD> <20><EFBFBD><EEBFB5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŀ<>ǵ<EFBFBD><C7B5>Դϴ<D4B4>.",
|
||||
GetRemoteAddr().get_addr_string(), lpPktAdminToolGetData->m_cType);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool CAdminToolDispatch::ParseSetData(PktBase* lpPktBase)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD>. <20><>Ŷ <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
// CharLogin<69><6E> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1, â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2, â<><C3A2> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><>Ŷ <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD>.
|
||||
PktAdminToolSetData* lpPktAdminToolSetData = static_cast<PktAdminToolSetData*>(lpPktBase);
|
||||
|
||||
switch(lpPktAdminToolSetData->m_cType)
|
||||
{
|
||||
case PktAdminToolSetData::CHAR_BASIC_DATA:
|
||||
case PktAdminToolSetData::CHAR_EXTRA_DATA:
|
||||
case PktAdminToolSetData::CHAR_FRIEND_DATA:
|
||||
case PktAdminToolSetData::CHAR_BAN_DATA:
|
||||
case PktAdminToolSetData::STORE_12_DATA:
|
||||
case PktAdminToolSetData::STORE_34_DATA:
|
||||
case PktAdminToolSetData::OPEN_UPDATE_DATA:
|
||||
case PktAdminToolSetData::FINISH_UPDATE_DATA:
|
||||
|
||||
return ParseAdminToolSetData(lpPktAdminToolSetData);
|
||||
|
||||
case PktAdminToolSetData::RELOAD_ADMINLIST:
|
||||
|
||||
return DataStorage::CAdminDataMgr::GetInstance().LoadAdminList(CDBSingleObject::GetInstance());
|
||||
|
||||
default:
|
||||
|
||||
ERRLOG2(g_Log, "IP:%15s / Cmd:%d / <20><> <20><> <20><><EFBFBD><EFBFBD> <20><EFBFBD><EEBFB5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><>Ŷ Ŀ<>ǵ<EFBFBD><C7B5>Դϴ<D4B4>",
|
||||
GetRemoteAddr().get_addr_string(), lpPktAdminToolSetData->m_cType);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CAdminToolDispatch::ParseAdminToolGetData(PktAdminToolGetData* lpPktAdminToolGetData)
|
||||
{
|
||||
// DBRequestKey.
|
||||
unsigned long dwRequestKey = lpPktAdminToolGetData->m_dwRequestKey;
|
||||
unsigned long dwUID = lpPktAdminToolGetData->m_dwUID;
|
||||
unsigned long dwCID = lpPktAdminToolGetData->m_dwCID;
|
||||
unsigned char cOldServerGroupID = 0;
|
||||
|
||||
if (UnifiedConst::Part2Selectable == CServerSetup::GetInstance().GetAgentServerType())
|
||||
{
|
||||
cOldServerGroupID = lpPktAdminToolGetData->m_cOldServerGroupID;
|
||||
}
|
||||
else
|
||||
{
|
||||
cOldServerGroupID = static_cast<unsigned char>(
|
||||
CServerSetup::GetInstance().GetAgentServerType());
|
||||
}
|
||||
|
||||
PktAdminToolGetData::GetDataType eDataType =
|
||||
static_cast<PktAdminToolGetData::GetDataType>(lpPktAdminToolGetData->m_cType);
|
||||
|
||||
unsigned short wError = 0;
|
||||
|
||||
if(eDataType != PktAdminToolGetData::GET_CHAR_DATA)
|
||||
{
|
||||
// <20>߸<EFBFBD><DFB8><EFBFBD> <20><>Ŷ<EFBFBD><C5B6>
|
||||
wError = PktAdminToolGetData::INVALID_REQUEST;
|
||||
}
|
||||
else
|
||||
{
|
||||
// UID, CID<49><44> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UID<49><44> CID<49><44> <20><><EFBFBD><EFBFBD> <20>´<EFBFBD>.
|
||||
if(0 == dwUID || 0 == dwCID || 0 == cOldServerGroupID)
|
||||
{
|
||||
if(!GetUIDCIDFromName(lpPktAdminToolGetData->m_szName,
|
||||
dwUID, dwCID, cOldServerGroupID))
|
||||
{
|
||||
// DB Query <20><><EFBFBD><EFBFBD>.
|
||||
wError = PktAdminToolGetData::GET_UIDCID_QUERY_FAILED;
|
||||
}
|
||||
|
||||
if(0 == dwUID || 0 == dwCID || 0 == cOldServerGroupID)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20>̻<EFBFBD><CCBB><EFBFBD>.
|
||||
wError = PktAdminToolGetData::INVALID_UID_CID_DATA;
|
||||
}
|
||||
}
|
||||
|
||||
DETLOG4(g_Log, "UID:%10u / ServerGroupID:%d / CID:%10u / IP:%15s / <20><EFBFBD><EEBFB5><EFBFBD>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û <20><><EFBFBD><EFBFBD>",
|
||||
dwUID, cOldServerGroupID, dwCID, GetRemoteAddr().get_addr_string());
|
||||
|
||||
if(0 == wError)
|
||||
{
|
||||
using namespace DataStorage;
|
||||
|
||||
CStoreData* lpStoreData = 0;
|
||||
CCharacterData* lpCharacterData = 0;
|
||||
|
||||
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession(dwUID);
|
||||
|
||||
if(0 != lpSessionData)
|
||||
{
|
||||
// <20>̹<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD>ǿ<EFBFBD><C7BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
if(dwUID == lpSessionData->GetUID())
|
||||
{
|
||||
lpStoreData = lpSessionData->GetStoreData();
|
||||
}
|
||||
|
||||
if(dwCID == lpSessionData->GetCID())
|
||||
{
|
||||
lpCharacterData = lpSessionData->GetCharacterData();
|
||||
}
|
||||
}
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD>. ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, DB<44><42><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5>ؼ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20>߰<EFBFBD>.
|
||||
if(0 == lpStoreData)
|
||||
{
|
||||
lpStoreData = CStoreDataMgr::GetInstance().GetLogoutData(
|
||||
UnifiedStoreKey(dwUID, cOldServerGroupID));
|
||||
}
|
||||
|
||||
if(0 == lpCharacterData)
|
||||
{
|
||||
lpCharacterData = CCharacterDataMgr::GetInstance().GetLogoutData(dwCID);
|
||||
}
|
||||
|
||||
|
||||
if(0 == lpStoreData)
|
||||
{
|
||||
wError = PktAdminToolGetData::GET_STORE_QUERY_FAILED;
|
||||
}
|
||||
else if(0 == lpCharacterData)
|
||||
{
|
||||
wError = PktAdminToolGetData::GET_CHAR_DATA_QUERY_FAILED;
|
||||
}
|
||||
else
|
||||
{
|
||||
SendPacket::TotalDataToAdminTool(GetSendStream(), dwRequestKey,
|
||||
GetRemoteAddr().get_addr_in().sin_addr, *lpStoreData, *lpCharacterData);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
return SendPacket::AdminToolGetDataAck(GetSendStream(),
|
||||
PktAdminToolGetData::FINISH_GET_DATA, dwRequestKey, dwUID, dwCID, 0, 0, wError, cOldServerGroupID);
|
||||
}
|
||||
|
||||
bool CAdminToolDispatch::ParseAdminToolSetData(PktAdminToolSetData* lpPktAdminToolSetData)
|
||||
{
|
||||
SERVER_ID serverID;
|
||||
serverID.dwID = m_dwServerID;
|
||||
|
||||
unsigned long dwUID = lpPktAdminToolSetData->m_dwUID;
|
||||
unsigned long dwCID = lpPktAdminToolSetData->m_dwCID;
|
||||
unsigned long dwRequestKey = lpPktAdminToolSetData->m_dwRequestKey;
|
||||
unsigned long dwDataSize = lpPktAdminToolSetData->GetLen() - sizeof(PktAdminToolSetData);
|
||||
unsigned char cType = lpPktAdminToolSetData->m_cType;
|
||||
unsigned char cOldServerGroupID = 0;
|
||||
|
||||
if (UnifiedConst::Part2Selectable == CServerSetup::GetInstance().GetAgentServerType())
|
||||
{
|
||||
cOldServerGroupID = lpPktAdminToolSetData->m_cOldServerGroupID;
|
||||
}
|
||||
else
|
||||
{
|
||||
cOldServerGroupID = static_cast<unsigned char>(
|
||||
CServerSetup::GetInstance().GetAgentServerType());
|
||||
}
|
||||
|
||||
unsigned short wError = 0;
|
||||
|
||||
if(0 == dwUID || 0 == dwCID)
|
||||
{
|
||||
wError = PktAdminToolSetData::INVALID_UID_CID_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
DETLOG3(g_Log, "UID:%10u / CID:%10u / IP:%15s / <20><EFBFBD>ڰ<EFBFBD> <20><EFBFBD><EEBFB5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>õ<EFBFBD>",
|
||||
dwUID, dwCID, GetRemoteAddr().get_addr_string());
|
||||
|
||||
using namespace DataStorage;
|
||||
|
||||
CStoreData* lpStoreData = 0;
|
||||
CCharacterData* lpCharacterData = 0;
|
||||
|
||||
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession(dwUID);
|
||||
|
||||
if(0 != lpSessionData)
|
||||
{
|
||||
if(CSessionData::SE_USER_ENABLED == lpSessionData->GetSessionState() ||
|
||||
CSessionData::SE_CHAR_ENABLED == lpSessionData->GetSessionState())
|
||||
{
|
||||
// Ȱ<><C8B0>ȭ<EFBFBD><C8AD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
wError = PktAdminToolSetData::LOGIN_ANOTHER_GAMESERVER;
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20>̹<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD>ǿ<EFBFBD><C7BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
if(dwUID == lpSessionData->GetUID())
|
||||
{
|
||||
lpStoreData = lpSessionData->GetStoreData();
|
||||
}
|
||||
|
||||
if(dwCID == lpSessionData->GetCID())
|
||||
{
|
||||
lpCharacterData = lpSessionData->GetCharacterData();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(0 == wError)
|
||||
{
|
||||
// ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD>. ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, DB<44><42><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5>ؼ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20>߰<EFBFBD>.
|
||||
if(0 == lpStoreData)
|
||||
{
|
||||
lpStoreData = CStoreDataMgr::GetInstance().GetLogoutData(
|
||||
UnifiedStoreKey(dwUID, cOldServerGroupID));
|
||||
}
|
||||
|
||||
if(0 == lpCharacterData)
|
||||
{
|
||||
lpCharacterData = CCharacterDataMgr::GetInstance().GetLogoutData(dwCID);
|
||||
}
|
||||
|
||||
if(0 != lpStoreData && 0 != lpCharacterData)
|
||||
{
|
||||
switch(lpPktAdminToolSetData->m_cType)
|
||||
{
|
||||
case PktAdminToolSetData::OPEN_UPDATE_DATA:
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> DB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ϸ<EFBFBD> <20>õ<EFBFBD><C3B5>Ѵ<EFBFBD>. : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD>. <20>׳<EFBFBD> <20>Ѵ<EFBFBD>.
|
||||
break;
|
||||
|
||||
case PktAdminToolSetData::FINISH_UPDATE_DATA:
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ݴ´<DDB4>. : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD>. <20>׳<EFBFBD> <20>Ѵ<EFBFBD>.
|
||||
break;
|
||||
|
||||
case PktAdminToolSetData::CHAR_BASIC_DATA: // ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>.
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EEBFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD>Ѵ<EFBFBD>. <20><EFBFBD><EEBFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
{
|
||||
unsigned short* lpSizeArray = reinterpret_cast<unsigned short*>(lpPktAdminToolSetData + 1);
|
||||
char* lpData = reinterpret_cast<char*>(lpSizeArray + DBUpdateData::MAX_UPDATE_DB);
|
||||
|
||||
if(!lpCharacterData->SerializeIn(lpData, lpSizeArray,
|
||||
dwDataSize - sizeof(unsigned short) * DBUpdateData::MAX_UPDATE_DB, DBUpdateData::MAX_UPDATE_DB))
|
||||
{
|
||||
ERRLOG3(g_Log, "UID:%10u / CID:%10u / IP:%15s / <20><EFBFBD><EEBFB5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : CHAR_BASIC_DATA",
|
||||
dwUID, dwCID, GetRemoteAddr().get_addr_string());
|
||||
|
||||
wError = PktAdminToolSetData::SETTING_DATA_FAILED;
|
||||
}
|
||||
else
|
||||
{
|
||||
INFLOG3(g_Log, "UID:%10u / CID:%10u / IP:%15s / <20><EFBFBD><EEBFB5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : CHAR_BASIC_DATA",
|
||||
dwUID, dwCID, GetRemoteAddr().get_addr_string());
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case PktAdminToolSetData::CHAR_EXTRA_DATA: // ij<><C4B3><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>.
|
||||
|
||||
{
|
||||
unsigned long dwExpectDataSize = sizeof(CHAR_INFOEX) + sizeof(QUEST) +
|
||||
sizeof(HISTORY) + sizeof(CONFIG) + sizeof(STORE_INFO);
|
||||
|
||||
if(dwDataSize == dwExpectDataSize)
|
||||
{
|
||||
char* lpCharDataExPos = reinterpret_cast<char*>(lpPktAdminToolSetData + 1);
|
||||
|
||||
// CHAR_INFOEX : ij<><C4B3><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
lpCharacterData->SetInfoEx(*reinterpret_cast<CHAR_INFOEX*>(lpCharDataExPos));
|
||||
lpCharDataExPos += sizeof(CHAR_INFOEX);
|
||||
|
||||
// QUEST : <20><><EFBFBD><EFBFBD>Ʈ
|
||||
lpCharacterData->SetQuest(*reinterpret_cast<QUEST*>(lpCharDataExPos));
|
||||
lpCharDataExPos += sizeof(QUEST);
|
||||
|
||||
// HISTORY : <20><><EFBFBD><EFBFBD><EFBFBD>丮
|
||||
lpCharacterData->SetHistory(*reinterpret_cast<HISTORY*>(lpCharDataExPos));
|
||||
lpCharDataExPos += sizeof(HISTORY);
|
||||
|
||||
// CONFIG : <20><><EFBFBD><EFBFBD>
|
||||
lpCharacterData->SetConfig(*reinterpret_cast<CONFIG*>(lpCharDataExPos));
|
||||
lpCharDataExPos += sizeof(CONFIG);
|
||||
|
||||
// STORE_INFO : â<><C3A2> <20><><EFBFBD><EFBFBD>
|
||||
lpStoreData->SetStoreInfo(*reinterpret_cast<STORE_INFO*>(lpCharDataExPos));
|
||||
lpCharDataExPos += sizeof(STORE_INFO);
|
||||
}
|
||||
else
|
||||
{
|
||||
wError = PktAdminToolSetData::SETTING_DATA_FAILED;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case PktAdminToolSetData::CHAR_FRIEND_DATA: // ij<><C4B3><EFBFBD><EFBFBD> ģ<><C4A3> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
if(!lpCharacterData->FriendSerializeIn(
|
||||
reinterpret_cast<char*>(lpPktAdminToolSetData + 1), dwDataSize))
|
||||
{
|
||||
wError = PktAdminToolSetData::SETTING_DATA_FAILED;
|
||||
}
|
||||
break;
|
||||
|
||||
case PktAdminToolSetData::CHAR_BAN_DATA: // ij<><C4B3><EFBFBD><EFBFBD> <20>ź<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
if(!lpCharacterData->BanSerializeIn(
|
||||
reinterpret_cast<char*>(lpPktAdminToolSetData + 1), dwDataSize))
|
||||
{
|
||||
wError = PktAdminToolSetData::SETTING_DATA_FAILED;
|
||||
}
|
||||
break;
|
||||
|
||||
case PktAdminToolSetData::STORE_12_DATA: // â<><C3A2> 1, 2<><32> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
if(dwDataSize == sizeof(STORE))
|
||||
{
|
||||
const STORE& store1 = *reinterpret_cast<STORE*>(lpPktAdminToolSetData + 1);
|
||||
lpStoreData->SetStore1(store1.Data, store1.dwSize);
|
||||
}
|
||||
else
|
||||
{
|
||||
wError = PktAdminToolSetData::SETTING_DATA_FAILED;
|
||||
}
|
||||
break;
|
||||
|
||||
case PktAdminToolSetData::STORE_34_DATA: // â<><C3A2> 3, 4<><34> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
if(dwDataSize == sizeof(STORE))
|
||||
{
|
||||
const STORE& store2 = *reinterpret_cast<STORE*>(lpPktAdminToolSetData + 1);
|
||||
lpStoreData->SetStore2(store2.Data, store2.dwSize);
|
||||
}
|
||||
else
|
||||
{
|
||||
wError = PktAdminToolSetData::SETTING_DATA_FAILED;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ItemSerial <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
if(m_AdminItemSerialMgr.SetItemSerial(lpPktAdminToolSetData->m_dwSerial))
|
||||
{
|
||||
m_AdminItemSerialMgr.SaveItemSerial(CDBSingleObject::GetInstance(), m_dwServerID);
|
||||
}
|
||||
|
||||
return SendPacket::AdminToolSetDataAck(
|
||||
GetSendStream(), dwRequestKey, dwUID, dwCID, cType, wError);
|
||||
}
|
||||
|
||||
|
||||
bool CAdminToolDispatch::ParseGuildPosition(PktGuildPosition* lpPktGuildPosition)
|
||||
{
|
||||
using namespace DataStorage;
|
||||
|
||||
unsigned short wError = PktBase::NO_SERVER_ERR;
|
||||
|
||||
unsigned long dwGID = lpPktGuildPosition->m_dwGID;
|
||||
unsigned long dwCID = lpPktGuildPosition->m_dwCID;
|
||||
unsigned char cPosition = lpPktGuildPosition->m_cPosition;
|
||||
unsigned char cType = lpPktGuildPosition->m_cType;
|
||||
|
||||
using namespace Guild;
|
||||
|
||||
CGuildDB* lpGuild = static_cast<CGuildDB*>(CGuildDBMgr::GetInstance().GetGuild(dwGID));
|
||||
|
||||
char* lpBuffer = GetSendStream().GetBuffer(sizeof(PktGuildPosition));
|
||||
|
||||
PktGuildPosition* pktSendPacket = NULL;
|
||||
|
||||
if(lpBuffer)
|
||||
{
|
||||
pktSendPacket = reinterpret_cast<PktGuildPosition*>(lpBuffer);
|
||||
|
||||
pktSendPacket->m_cPosition = lpPktGuildPosition->m_cPosition;
|
||||
pktSendPacket->m_dwCID = lpPktGuildPosition->m_dwCID;
|
||||
pktSendPacket->m_dwGID = lpPktGuildPosition->m_dwGID;
|
||||
pktSendPacket->m_cType = lpPktGuildPosition->m_cType;
|
||||
}
|
||||
|
||||
if(!lpGuild)
|
||||
{
|
||||
wError = PktGuildPosition::FAIL_GUILD;
|
||||
}
|
||||
else
|
||||
{
|
||||
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(dwCID);
|
||||
|
||||
if(lpSessionData)
|
||||
{
|
||||
wError = PktGuildPosition::FAIL_CONNECT_CHAR;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(cType==PktGuildPosition::TYPE_POSITION)
|
||||
{
|
||||
lpGuild->SetTitle(dwCID, cPosition);
|
||||
|
||||
SYSTEMTIME systemTime;
|
||||
::memset(&systemTime, 0, sizeof(SYSTEMTIME));
|
||||
GetLocalTime(&systemTime);
|
||||
|
||||
if(!DBComponent::GuildDB::UpdateMemberTitle(CDBSingleObject::GetInstance(), dwCID, cPosition, systemTime))
|
||||
{
|
||||
wError = PktGuildPosition::FAIL_DB_UPDATE;
|
||||
}
|
||||
}
|
||||
else if(cType==PktGuildPosition::TYPE_MEMBERDELETE)
|
||||
{
|
||||
if(!lpGuild->LeaveMember(dwCID))
|
||||
{
|
||||
wError = PktGuildPosition::FAIL_MEMBER_DELETE;
|
||||
}
|
||||
else
|
||||
{
|
||||
using namespace DBAgent::DataStorage;
|
||||
|
||||
DBComponent::GameDB::UpdateGuildWarFlag(CDBSingleObject::GetInstance(), dwCID, Creature::WAR_OFF);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return GetSendStream().WrapHeader(sizeof(PktGuildPosition), CmdGuildPosition, 0, wError);
|
||||
}
|
||||
|
||||
bool CAdminToolDispatch::ParseItemQtyCheck(PktItemQtyControl* lpPktItemQtyControl)
|
||||
{
|
||||
tm* lpTm = localtime(&lpPktItemQtyControl->m_tStartTime);
|
||||
if(0 == lpTm)
|
||||
{
|
||||
ERRLOG2(g_Log, "IP:%15s / StartTime:%d / <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>",
|
||||
GetRemoteAddr().get_addr_string(), lpPktItemQtyControl->m_tStartTime);
|
||||
}
|
||||
else
|
||||
{
|
||||
tm tStartTime = *lpTm;
|
||||
|
||||
lpTm = localtime(&lpPktItemQtyControl->m_tEndTime);
|
||||
if(0 == lpTm)
|
||||
{
|
||||
ERRLOG2(g_Log, "IP:%15s / EndTime:%d / <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>",
|
||||
GetRemoteAddr().get_addr_string(), lpPktItemQtyControl->m_tEndTime);
|
||||
}
|
||||
else
|
||||
{
|
||||
tm tEndTime = *lpTm;
|
||||
|
||||
if(lpPktItemQtyControl->m_cGroup != CServerSetup::GetInstance().GetServerGroup())
|
||||
{
|
||||
ERRLOG3(g_Log, "IP:%15s / CurrentServerGroup:%d / ReceivedServerGroup:%d / <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> <20><EFBFBD><D7B7><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>",
|
||||
GetRemoteAddr().get_addr_string(), CServerSetup::GetInstance().GetServerGroup(), lpPktItemQtyControl->m_cGroup);
|
||||
}
|
||||
else
|
||||
{
|
||||
bool bResult = false;
|
||||
|
||||
switch(lpPktItemQtyControl->m_cType)
|
||||
{
|
||||
case PktItemQtyControl::ADD:
|
||||
|
||||
bResult = CGameEventDBMgr::GetInstance().InsertDropItem(
|
||||
static_cast<unsigned short>(lpPktItemQtyControl->m_dwItemTypeID),
|
||||
static_cast<unsigned short>(lpPktItemQtyControl->m_dwItemQty),
|
||||
tStartTime, tEndTime);
|
||||
|
||||
DETLOG5(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD> %s : ID:%u/Qty:%u/StartTime:%d/EndTime:%d",
|
||||
bResult ? "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>" : "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
|
||||
lpPktItemQtyControl->m_dwItemTypeID, lpPktItemQtyControl->m_dwItemQty,
|
||||
lpPktItemQtyControl->m_tStartTime, lpPktItemQtyControl->m_tEndTime);
|
||||
|
||||
SendPacket::ItemQtyCheck(lpPktItemQtyControl->m_dwItemTypeID,
|
||||
lpPktItemQtyControl->m_dwItemQty, 0,
|
||||
lpPktItemQtyControl->m_tStartTime,
|
||||
lpPktItemQtyControl->m_tEndTime,
|
||||
PktItemQtyControl::ADD, bResult ? 0 : 1);
|
||||
break;
|
||||
|
||||
case PktItemQtyControl::DEL:
|
||||
|
||||
bResult = CGameEventDBMgr::GetInstance().EraseDropItem(
|
||||
static_cast<unsigned short>(lpPktItemQtyControl->m_dwItemTypeID));
|
||||
|
||||
DETLOG5(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> %s : ID:%u/Qty:%u/StartTime:%d/EndTime:%d",
|
||||
bResult ? "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>" : "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
|
||||
lpPktItemQtyControl->m_dwItemTypeID, lpPktItemQtyControl->m_dwItemQty,
|
||||
lpPktItemQtyControl->m_tStartTime, lpPktItemQtyControl->m_tEndTime);
|
||||
|
||||
SendPacket::ItemQtyCheck(lpPktItemQtyControl->m_dwItemTypeID,
|
||||
lpPktItemQtyControl->m_dwItemQty, 0,
|
||||
lpPktItemQtyControl->m_tStartTime, lpPktItemQtyControl->m_tEndTime,
|
||||
PktItemQtyControl::DEL, bResult ? 0 : 1);
|
||||
break;
|
||||
|
||||
case PktItemQtyControl::STATUS_REQUEST:
|
||||
|
||||
DETLOG0(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>û");
|
||||
CGameEventDBMgr::GetInstance().SendDropItemInfo();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
class CSendNameChanged
|
||||
{
|
||||
public:
|
||||
|
||||
CSendNameChanged(unsigned long dwUID, unsigned long dwCID, const char* szChangedName,
|
||||
unsigned char cNameChangeCount, unsigned short usError)
|
||||
: m_dwUID(dwUID), m_dwCID(dwCID),
|
||||
m_cNameChangeCount(cNameChangeCount),
|
||||
m_usError(usError)
|
||||
{
|
||||
strncpy(m_szChangedName, szChangedName, CHAR_INFOST::MAX_NAME_LEN);
|
||||
m_szChangedName[ CHAR_INFOST::MAX_NAME_LEN - 1 ] = 0;
|
||||
}
|
||||
|
||||
bool operator () (unsigned long dwServerID, CPacketDispatch& dispatch)
|
||||
{
|
||||
return GameClientSendPacket::SendCharNameChange(
|
||||
static_cast<CRylServerDispatch&>(dispatch).GetSendStream(),
|
||||
m_dwUID, m_dwCID, m_szChangedName, m_cNameChangeCount, NULL, m_usError);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
unsigned long m_dwUID;
|
||||
unsigned long m_dwCID;
|
||||
unsigned char m_cNameChangeCount;
|
||||
unsigned short m_usError;
|
||||
|
||||
char m_szChangedName[CHAR_INFOST::MAX_NAME_LEN];
|
||||
};
|
||||
|
||||
bool CAdminToolDispatch::ParseAdminToolChangeName(PktAdminToolGetData* lpPktAdminToolGetData)
|
||||
{
|
||||
unsigned long dwUID = lpPktAdminToolGetData->m_dwUID;
|
||||
unsigned long dwCID = lpPktAdminToolGetData->m_dwCID;
|
||||
unsigned long dwRequestKey = lpPktAdminToolGetData->m_dwRequestKey;
|
||||
const char* szChangeName = lpPktAdminToolGetData->m_szName;
|
||||
|
||||
unsigned short usError = 0;
|
||||
|
||||
using namespace DBAgent::DataStorage;
|
||||
|
||||
CSessionData* lpSessionData =
|
||||
CSessionDataMgr::GetInstance().GetCharLoadedSession(dwCID);
|
||||
|
||||
CCharacterData* lpCharacterData = 0;
|
||||
|
||||
if (0 == lpSessionData ||
|
||||
lpSessionData->GetUID() != dwUID ||
|
||||
lpSessionData->GetCID() != dwCID ||
|
||||
(0 == (lpCharacterData = lpSessionData->GetCharacterData())) ||
|
||||
dwCID != lpCharacterData->GetCID())
|
||||
{
|
||||
lpCharacterData = CCharacterDataMgr::GetInstance().GetLogoutData(dwCID);
|
||||
}
|
||||
|
||||
if (0 != lpCharacterData)
|
||||
{
|
||||
unsigned long dwResult = 0;
|
||||
|
||||
if (DBComponent::GameDB::ChangeCharName(
|
||||
CDBSingleObject::GetInstance(), dwCID, szChangeName, dwResult))
|
||||
{
|
||||
if (0 == dwResult)
|
||||
{
|
||||
// <20≯<EFBFBD><CCB8><EFBFBD> <20>ٲ۴<D9B2>.
|
||||
CHAR_INFOST charInfoST = lpCharacterData->GetInfo();
|
||||
|
||||
strncpy(charInfoST.Name, szChangeName, CHAR_INFOST::MAX_NAME_LEN);
|
||||
charInfoST.Name[CHAR_INFOST::MAX_NAME_LEN - 1] = 0;
|
||||
|
||||
lpCharacterData->SetInfo(charInfoST, true);
|
||||
}
|
||||
else if(1 == dwResult)
|
||||
{
|
||||
ERRLOG3(g_Log, "UID:%10u / CID:%10u / ChangeName:%s / <20><EFBFBD><EEBFB5><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20≯<EFBFBD> <20>ٲٱ<D9B2> <20><><EFBFBD><EFBFBD> : <20≯<EFBFBD><CCB8><EFBFBD> <20>̹<EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>",
|
||||
dwUID, dwCID, szChangeName);
|
||||
|
||||
usError = PktCharNameChange::ERR_ALREADY_USE_NAME;
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG4(g_Log, "UID:%10u / CID:%10u / ChangeName:%s / dwResult:%10u / <20><EFBFBD><EEBFB5><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20≯<EFBFBD> <20>ٲٱ<D9B2> <20><><EFBFBD><EFBFBD> : <20><> <20><> <20><><EFBFBD><EFBFBD> dwResult<6C><74><EFBFBD>Դϴ<D4B4>",
|
||||
dwUID, dwCID, szChangeName, dwResult);
|
||||
|
||||
usError = PktCharNameChange::ERR_SERVER;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG3(g_Log, "UID:%10u / CID:%10u / ChangeName:%s / <20><EFBFBD><EEBFB5><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20≯<EFBFBD> <20>ٲٱ<D9B2> <20><><EFBFBD><EFBFBD> : DBȣ<42><C8A3> <20><><EFBFBD><EFBFBD>",
|
||||
dwUID, dwCID, szChangeName);
|
||||
|
||||
usError = PktCharNameChange::ERR_SERVER;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG3(g_Log, "UID:%10u / CID:%10u / ChangeName:%s / "
|
||||
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20≯<EFBFBD> <20>ٲٱ<D9B2> <20><><EFBFBD><EFBFBD> : <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> ã<><C3A3> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.", dwUID, dwCID, szChangeName);
|
||||
|
||||
usError = PktCharNameChange::ERR_CANNOT_FIND_CHARACTER;
|
||||
}
|
||||
|
||||
if (0 != lpSessionData && 0 != lpCharacterData && 0 == usError)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(
|
||||
CSendNameChanged(dwUID, dwCID, szChangeName,
|
||||
lpCharacterData->GetInfoEx().cNameChangeCount, usError));
|
||||
}
|
||||
|
||||
// <20><EFBFBD><EEBFB5><EFBFBD><EFBFBD> Ack<63><6B> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
return SendPacket::AdminToolGetDataAck(GetSendStream(),
|
||||
PktAdminToolGetData::CHANGE_CHAR_NAME, dwRequestKey, dwUID, dwCID, 0, 0, usError);
|
||||
}
|
||||
|
||||
|
||||
bool GetUIDCIDFromName(const char* szName, unsigned long& dwUID_Out,
|
||||
unsigned long& dwCID_Out, unsigned char& cOldServerGroupID)
|
||||
{
|
||||
#pragma pack(1)
|
||||
|
||||
struct UIDCID
|
||||
{
|
||||
unsigned long dwUID;
|
||||
unsigned long dwCID;
|
||||
unsigned char cOldServerGroupID;
|
||||
};
|
||||
|
||||
#pragma pack()
|
||||
|
||||
UIDCID uidcid;
|
||||
|
||||
uidcid.dwUID = 0;
|
||||
uidcid.dwCID = 0;
|
||||
|
||||
const int MAX_BUFFER = 1024;
|
||||
char szQuery[MAX_BUFFER] = { 0, };
|
||||
|
||||
int nLength = _snprintf(szQuery, MAX_BUFFER - 1, "dbo.GetUIDCIDFromName '%s'", szName);
|
||||
szQuery[MAX_BUFFER - 1] = 0;
|
||||
|
||||
if(0 < nLength)
|
||||
{
|
||||
szQuery[nLength] = 0;
|
||||
if(CDBSingleObject::GetInstance().ExecuteQueryGetData(szQuery, &uidcid))
|
||||
{
|
||||
dwUID_Out = uidcid.dwUID;
|
||||
dwCID_Out = uidcid.dwCID;
|
||||
cOldServerGroupID = uidcid.cOldServerGroupID;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
ERRLOG2(g_Log, "ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD><EFBFBD><EFBFBD> UID / CID <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>. %s : %s",
|
||||
CDBSingleObject::GetInstance().GetErrorString(), szQuery);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
#ifndef _DBAGENT_SERVER_ADMIN_TOOL_DISPATCH_H_
|
||||
#define _DBAGENT_SERVER_ADMIN_TOOL_DISPATCH_H_
|
||||
|
||||
#include <Network/Dispatch/RylServerDispatch.h>
|
||||
#include <Network/Dispatch/MultiDispatchStorage.h>
|
||||
|
||||
#include <Item/ItemSerialMgr.h>
|
||||
|
||||
// forward decl.
|
||||
struct PktSL;
|
||||
struct PktUK;
|
||||
struct PktItemQtyControl;
|
||||
struct PktAdminToolGetData;
|
||||
struct PktAdminToolSetData;
|
||||
struct PktGuildPosition;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
class CAdminToolDispatch : public CRylServerDispatch
|
||||
{
|
||||
public:
|
||||
|
||||
static CMultiDispatch& GetDispatchTable();
|
||||
|
||||
enum Const
|
||||
{
|
||||
MAX_PACKET_DISPATCH_PER_PULSE = 100,
|
||||
MAX_STREAM_BUFFER_SIZE = 16000
|
||||
};
|
||||
|
||||
CAdminToolDispatch(CSession& Session);
|
||||
virtual ~CAdminToolDispatch();
|
||||
|
||||
virtual void Connected();
|
||||
virtual void Disconnected();
|
||||
virtual bool DispatchPacket(PktBase* lpPktBase);
|
||||
|
||||
private:
|
||||
|
||||
bool ParseServerLogin(PktSL* lpPktSL);
|
||||
bool ParseServerLogout(PktBase* lpPktBase);
|
||||
bool ParseUserKill(PktUK* lpPktUK);
|
||||
|
||||
bool ParseGetData(PktBase* lpPktBase);
|
||||
bool ParseSetData(PktBase* lpPktBase);
|
||||
bool ParseItemQtyCheck(PktItemQtyControl* lpPktItemQtyControl); // <20>̺<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ŷ
|
||||
|
||||
bool ParseAdminToolGetData(PktAdminToolGetData* lpPktAdminToolGetData); // <20><><EFBFBD><EFBFBD> <20><EFBFBD><EEBFB5>(AdminTool)
|
||||
bool ParseAdminToolSetData(PktAdminToolSetData* lpPktAdminToolSetData); // <20><><EFBFBD><EFBFBD> <20><EFBFBD><EEBFB5>(AdminTool)
|
||||
|
||||
bool ParseAdminToolChangeName(PktAdminToolGetData* lpPktAdminToolGetData); // <20><EFBFBD><EEBFB5><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20≯<EFBFBD> <20>ٲٱ<D9B2>
|
||||
|
||||
bool ParseGuildPosition(PktGuildPosition* lpPktGuildPosition); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
|
||||
Item::CItemSerialMgr m_AdminItemSerialMgr;
|
||||
|
||||
unsigned long m_dwServerID;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,232 @@
|
||||
#include "stdafx.h"
|
||||
#include "AuthDispatch.h"
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
#include <Network/Address/INET_Addr.h>
|
||||
#include <Network/SendPacket/SendServerInfo.h>
|
||||
#include <Network/SendPacket/SendLoginout.h>
|
||||
|
||||
#include <Network/ParsePacket/ParseCharManage.h>
|
||||
#include <Network/ParsePacket/ParseGuild.h>
|
||||
#include <Network/ParsePacket/ParseParty.h>
|
||||
#include <Network/ParsePacket/ParseMoveZone.h>
|
||||
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
|
||||
#include <Network/Dispatch/LoginDispatch.h>
|
||||
|
||||
#include <DB/DBComponent.h>
|
||||
#include <DB/GameDBComponent.h>
|
||||
|
||||
#include <DataStorage/SessionData.h>
|
||||
#include <DataStorage/SessionDataMgr.h>
|
||||
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
|
||||
CSingleDispatch& CAuthDispatch::GetDispatchTable()
|
||||
{
|
||||
static CSingleDispatch authDispatch;
|
||||
return authDispatch;
|
||||
}
|
||||
|
||||
|
||||
CAuthDispatch::CAuthDispatch(CSession& Session)
|
||||
: CRylServerDispatch(Session, MAX_PACKET_DISPATCH_PER_PULSE),
|
||||
m_dwServerID(0),
|
||||
m_nUserNum(1)
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
CAuthDispatch::~CAuthDispatch()
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
void CAuthDispatch::Connected()
|
||||
{
|
||||
DETLOG3(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/AuthServer Connected",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string());
|
||||
}
|
||||
|
||||
void CAuthDispatch::Disconnected()
|
||||
{
|
||||
DETLOG3(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/AuthServer Disconnected",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string());
|
||||
|
||||
if(0 != m_dwServerID)
|
||||
{
|
||||
GetDispatchTable().RemoveDispatch(this);
|
||||
|
||||
if(0LL != m_AuthItemSerialMgr.GetItemSerial())
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> DB<44><42> <20><><EFBFBD><EFBFBD>
|
||||
m_AuthItemSerialMgr.SaveItemSerial(
|
||||
CDBSingleObject::GetInstance(), m_dwServerID);
|
||||
}
|
||||
|
||||
GET_SINGLE_DISPATCH(lpLoginDispatch, CLoginDispatch,
|
||||
CLoginDispatch::GetDispatchTable());
|
||||
|
||||
if(0 != lpLoginDispatch)
|
||||
{
|
||||
// <20>α<EFBFBD><CEB1>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
SendPacket::UpdateServerVersion(lpLoginDispatch->GetSendStream());
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1>ε<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
DataStorage::CSessionDataMgr::GetInstance().SessionCloseCurrentServer(m_dwServerID);
|
||||
}
|
||||
}
|
||||
|
||||
bool CAuthDispatch::DispatchPacket(PktBase* lpPktBase)
|
||||
{
|
||||
// Auth <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> ó<><C3B3><EFBFBD>ϴ<EFBFBD> <20>κ<EFBFBD><CEBA>̴<EFBFBD>.
|
||||
|
||||
bool bResult = false;
|
||||
PktBase::CMDType cCmd = lpPktBase->GetCmd();
|
||||
|
||||
switch(cCmd)
|
||||
{
|
||||
case CmdSysServerLogin: bResult = ParseServerLogin(static_cast<PktSL*>(lpPktBase)); break;
|
||||
case CmdSysServerLogout: bResult = ParseServerLogout(lpPktBase); break;
|
||||
case CmdUserKill: bResult = ParseUserKill(static_cast<PktUK*>(lpPktBase)); break;
|
||||
|
||||
case CmdDBGetData:
|
||||
{
|
||||
PktDD* pkDD = static_cast<PktDD*>(lpPktBase);
|
||||
|
||||
// DETLOG4(g_Log, "SS:0x%08x/DP:0x%08x/Len:0x%08x/CMD:0x%04x : CmdDBGetData", &GetSession(), this, pkDD->GetLen(), pkDD->m_wCmd);
|
||||
|
||||
bResult = ParseCharManage::Parse(GetSendStream(), m_dwServerID,
|
||||
m_AuthItemSerialMgr, pkDD);
|
||||
}
|
||||
break;
|
||||
|
||||
case CmdAgentZone: bResult = ParseMoveZone::Parse(GetSendStream(), static_cast<PktDD*>(lpPktBase)); break;
|
||||
case CmdAgentParty: bResult = ParseParty::Parse(GetSendStream(), lpPktBase); break;
|
||||
case CmdGuildCmd: bResult = ParseGuild::GuildCmd(GetSendStream(), lpPktBase); break;
|
||||
|
||||
|
||||
case CmdUnifiedCharSelect:
|
||||
bResult = ParseCharManage::UnifiedCharSelect(GetSendStream(), lpPktBase);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
ERRLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/Cmd:0x%02X/ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ ó<><C3B3> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> Ŀ<>ǵ<EFBFBD><C7B5>Դϴ<D4B4>",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string(), cCmd);
|
||||
|
||||
bResult = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if(!bResult)
|
||||
{
|
||||
ERRLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/Cmd:0x%02X/ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ ó<><C3B3> <20><><EFBFBD><EFBFBD> : ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string(), cCmd);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool CAuthDispatch::ParseServerLogin(PktSL* lpPktSL)
|
||||
{
|
||||
m_dwServerID = lpPktSL->m_dwServerID;
|
||||
|
||||
INFLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/ServerID:0x%08X/ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>õ<EFBFBD> : <20><>Ŷ <20><><EFBFBD><EFBFBD>",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string(), m_dwServerID);
|
||||
|
||||
GET_SINGLE_DISPATCH(lpAuthDispatch,
|
||||
CAuthDispatch, GetDispatchTable());
|
||||
|
||||
if(0 != lpAuthDispatch)
|
||||
{
|
||||
ERRLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/ServerID:0x%08X/ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string(), m_dwServerID);
|
||||
|
||||
CloseSession();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Dispatch <20><><EFBFBD><EFBFBD>.
|
||||
GetDispatchTable().SetDispatch(this);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> <20>ε<EFBFBD>.
|
||||
if(!m_AuthItemSerialMgr.LoadItemSerial(CDBSingleObject::GetInstance(), m_dwServerID))
|
||||
{
|
||||
ERRLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/ServerID:0x%08X/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string(), m_dwServerID);
|
||||
|
||||
CloseSession();
|
||||
return false;
|
||||
}
|
||||
|
||||
GET_SINGLE_DISPATCH(lpLoginDispatch, CLoginDispatch,
|
||||
CLoginDispatch::GetDispatchTable());
|
||||
|
||||
if(0 != lpLoginDispatch)
|
||||
{
|
||||
// <20>α<EFBFBD><CEB1>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
SendPacket::UpdateServerVersion(lpLoginDispatch->GetSendStream());
|
||||
}
|
||||
|
||||
return SendPacket::ServerLoginAck(m_SendStream,
|
||||
m_dwServerID, m_AuthItemSerialMgr.GetItemSerial());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CAuthDispatch::ParseServerLogout(PktBase* lpPktBase)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><>Ŷ <20>״<EFBFBD><D7B4><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ش<EFBFBD>.
|
||||
|
||||
char* lpBuffer = m_SendStream.GetBuffer(sizeof(PktBase));
|
||||
if(0 != lpBuffer)
|
||||
{
|
||||
return m_SendStream.WrapHeader(sizeof(PktBase), CmdSysServerLogout, 0, 0);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CAuthDispatch::ParseUserKill(PktUK* lpPktUK)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̱⸦ <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD>, Ack<63><6B> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
||||
|
||||
if(2 == lpPktUK->GetError())
|
||||
{
|
||||
DataStorage::CSessionData* lpSessionData =
|
||||
DataStorage::CSessionDataMgr::GetInstance().GetOpenSession(lpPktUK->m_dwUserID);
|
||||
|
||||
if(0 != lpSessionData &&
|
||||
DataStorage::CSessionData::SE_USER_ENABLED == lpSessionData->GetSessionState())
|
||||
{
|
||||
if(lpSessionData->GetServerID() == lpPktUK->m_dwServerID)
|
||||
{
|
||||
DataStorage::CSessionDataMgr::GetInstance().SessionCloseWithLogout(
|
||||
lpPktUK->m_dwUserID, lpPktUK->m_dwServerID);
|
||||
|
||||
ERRLOG2(g_Log, "UID:%10u / ServerID:0x%08X / <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD>̱<EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
lpPktUK->m_dwUserID, lpPktUK->m_dwServerID);
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG3(g_Log, "UID:%10u / FromServerID:0x%08X / TargetServerID:0x%08X / "
|
||||
"<EFBFBD><EFBFBD><EFBFBD>Ӽ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̱<EFBFBD> <20><>û <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD>",
|
||||
lpPktUK->m_dwUserID, lpPktUK->m_dwServerID, lpSessionData->GetServerID());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
#ifndef _DBAGENT_SERVER_AUTH_DISPATCH_H_
|
||||
#define _DBAGENT_SERVER_AUTH_DISPATCH_H_
|
||||
|
||||
#include <Network/Dispatch/RylServerDispatch.h>
|
||||
#include <Network/Dispatch/SingleDispatchStorage.h>
|
||||
|
||||
#include <Item/ItemSerialMgr.h>
|
||||
|
||||
// forward decl.
|
||||
struct PktSL;
|
||||
struct PktUK;
|
||||
struct PktDD;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
class CAuthDispatch : public CRylServerDispatch
|
||||
{
|
||||
public:
|
||||
|
||||
static CSingleDispatch& GetDispatchTable();
|
||||
|
||||
enum Const
|
||||
{
|
||||
MAX_PACKET_DISPATCH_PER_PULSE = 100,
|
||||
MAX_STREAM_BUFFER_SIZE = 16000
|
||||
};
|
||||
|
||||
CAuthDispatch(CSession& Session);
|
||||
virtual ~CAuthDispatch();
|
||||
|
||||
virtual void Connected();
|
||||
virtual void Disconnected();
|
||||
virtual bool DispatchPacket(PktBase* lpPktBase);
|
||||
|
||||
void IncUserNum() { ++m_nUserNum; }
|
||||
void DecUserNum() { --m_nUserNum; }
|
||||
|
||||
int GetUserNum() const { return (m_nUserNum < 1) ? 1 : m_nUserNum; }
|
||||
|
||||
private:
|
||||
|
||||
bool ParseServerLogin(PktSL* lpPktSL);
|
||||
bool ParseServerLogout(PktBase* lpPktBase);
|
||||
bool ParseUserKill(PktUK* lpPktUK);
|
||||
|
||||
unsigned long m_dwServerID;
|
||||
int m_nUserNum;
|
||||
Item::CItemSerialMgr m_AuthItemSerialMgr;
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,126 @@
|
||||
#include "stdafx.h"
|
||||
#include "ChatDispatch.h"
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
#include <Network/Address/INET_Addr.h>
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
#include <Network/SendPacket/SendServerInfo.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
|
||||
CSingleDispatch& CChatDispatch::GetDispatchTable()
|
||||
{
|
||||
static CSingleDispatch chatDispatch;
|
||||
return chatDispatch;
|
||||
}
|
||||
|
||||
CChatDispatch::CChatDispatch(CSession& Session)
|
||||
: CRylServerDispatch(Session, MAX_PACKET_DISPATCH_PER_PULSE)
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
CChatDispatch::~CChatDispatch()
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
void CChatDispatch::Connected()
|
||||
{
|
||||
DETLOG3(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/ChatServer Connected",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string());
|
||||
}
|
||||
|
||||
void CChatDispatch::Disconnected()
|
||||
{
|
||||
DETLOG3(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/ChatServer Disconnected",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string());
|
||||
|
||||
if(0 != m_dwServerID)
|
||||
{
|
||||
GetDispatchTable().RemoveDispatch(this);
|
||||
}
|
||||
}
|
||||
|
||||
bool CChatDispatch::DispatchPacket(PktBase* lpPktBase)
|
||||
{
|
||||
bool bResult = false;
|
||||
PktBase::CMDType cCmd = lpPktBase->GetCmd();
|
||||
|
||||
switch(cCmd)
|
||||
{
|
||||
case CmdSysServerLogin:
|
||||
bResult = ParseServerLogin(static_cast<PktSL*>(lpPktBase));
|
||||
break;
|
||||
|
||||
case CmdSysServerLogout:
|
||||
bResult = ParseServerLogout(lpPktBase);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
ERRLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/Cmd:0x%02X/ ä<>ü<EFBFBD><C3BC><EFBFBD> <20><>Ŷ ó<><C3B3> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> Ŀ<>ǵ<EFBFBD><C7B5>Դϴ<D4B4>",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string(), cCmd);
|
||||
|
||||
bResult = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if(!bResult)
|
||||
{
|
||||
ERRLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/Cmd:0x%02X/ ä<>ü<EFBFBD><C3BC><EFBFBD> <20><>Ŷ ó<><C3B3> <20><><EFBFBD><EFBFBD> : ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string(), cCmd);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool CChatDispatch::ParseServerLogin(PktSL* lpPktSL)
|
||||
{
|
||||
m_dwServerID = lpPktSL->m_dwServerID;
|
||||
|
||||
INFLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/ServerID:0x%08X/ ä<>ü<EFBFBD><C3BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20>õ<EFBFBD> : <20><>Ŷ <20><><EFBFBD><EFBFBD>",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string(), m_dwServerID);
|
||||
|
||||
GET_SINGLE_DISPATCH(lpChatDispatch,
|
||||
CChatDispatch, GetDispatchTable());
|
||||
|
||||
if(0 != lpChatDispatch)
|
||||
{
|
||||
ERRLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/ServerID:0x%08X/ ä<>ü<EFBFBD><C3BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string(), m_dwServerID);
|
||||
|
||||
CloseSession();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Dispatch <20><><EFBFBD><EFBFBD>.
|
||||
GetDispatchTable().SetDispatch(this);
|
||||
return SendPacket::ServerLoginAck(m_SendStream, m_dwServerID, 0LL);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CChatDispatch::ParseServerLogout(PktBase* lpPktBase)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><>Ŷ <20>״<EFBFBD><D7B4><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ش<EFBFBD>.
|
||||
|
||||
char* lpBuffer = m_SendStream.GetBuffer(sizeof(PktBase));
|
||||
if(0 != lpBuffer)
|
||||
{
|
||||
return m_SendStream.WrapHeader(sizeof(PktBase), CmdSysServerLogout, 0, 0);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
#ifndef _DBAGENT_SERVER_CHAT_DISPATCH_H_
|
||||
#define _DBAGENT_SERVER_CHAT_DISPATCH_H_
|
||||
|
||||
#include <Network/Dispatch/RylServerDispatch.h>
|
||||
#include <Network/Dispatch/SingleDispatchStorage.h>
|
||||
|
||||
// forward decl.
|
||||
struct PktSL;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
class CChatDispatch : public CRylServerDispatch
|
||||
{
|
||||
public:
|
||||
|
||||
static CSingleDispatch& GetDispatchTable();
|
||||
|
||||
enum Const
|
||||
{
|
||||
MAX_PACKET_DISPATCH_PER_PULSE = 100,
|
||||
MAX_STREAM_BUFFER_SIZE = 16000
|
||||
};
|
||||
|
||||
CChatDispatch(CSession& Session);
|
||||
virtual ~CChatDispatch();
|
||||
|
||||
virtual void Connected();
|
||||
virtual void Disconnected();
|
||||
virtual bool DispatchPacket(PktBase* lpPktBase);
|
||||
|
||||
private:
|
||||
|
||||
bool ParseServerLogin(PktSL* lpPktSL);
|
||||
bool ParseServerLogout(PktBase* lpPktBase);
|
||||
|
||||
unsigned long m_dwServerID;
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,827 @@
|
||||
#include "stdafx.h"
|
||||
#include "GameDispatch.h"
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
|
||||
#include <Network/Address/INET_Addr.h>
|
||||
#include <Network/Stream/SendStream.h>
|
||||
#include <Network/Packet/PacketDispatchTable.h>
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
#include <Network/Packet/WrapPacket.h>
|
||||
#include <Network/Packet/PacketStruct/ServerInfo.h>
|
||||
#include <Network/Packet/PacketStruct/ServerPacket.h>
|
||||
#include <Network/Packet/PacketStruct/ServerLogPacket.h>
|
||||
#include <Network/Packet/PacketStruct/CharAdminPacket.h>
|
||||
|
||||
#include <Network/ParsePacket/ParseMoveZone.h>
|
||||
#include <Network/ParsePacket/ParseCharManage.h>
|
||||
#include <Network/ParsePacket/ParseCharUpdate.h>
|
||||
#include <Network/ParsePacket/ParseParty.h>
|
||||
#include <Network/ParsePacket/ParseCastle.h>
|
||||
#include <Network/ParsePacket/ParseGuild.h>
|
||||
|
||||
#include <Network/SendPacket/SendServerInfo.h>
|
||||
#include <Network/Dispatch/GameClient/SendCharAdmin.h>
|
||||
|
||||
#include <Creature/Character/CharacterClass.h>
|
||||
#include <Creature/StatueDBMgr.h>
|
||||
|
||||
#include <DB/DBComponent.h>
|
||||
#include <DB/GameDBComponent.h>
|
||||
#include <DataStorage/SessionData.h>
|
||||
#include <DataStorage/SessionDataMgr.h>
|
||||
|
||||
#include <Castle/CastleDBMgr.h>
|
||||
#include <GameTime/GameTimeDBMgr.h>
|
||||
#include <Creature/Siege/SiegeObjectDBMgr.h>
|
||||
#include <Community/Guild/GuildDBMgr.h>
|
||||
#include <Ranking/RankingDBMgr.h>
|
||||
#include <GameEvent/GiveItemMgr.h>
|
||||
|
||||
#include <DataStorage/SessionDataMgr.h>
|
||||
#include <DataStorage/CharacterDataMgr.h>
|
||||
|
||||
#include <Map/FieldMap/MineralVeinDBMgr.h>
|
||||
|
||||
#include <Ranking/RankingMgr.h>
|
||||
|
||||
#include <Community/Party/PartyDBMgr.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
|
||||
typedef bool (*GameDispatchFunc) (CSendStream& SendStream, PktBase* lpPktBase);
|
||||
|
||||
|
||||
// forward delc.
|
||||
bool ParseServerLog(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
|
||||
|
||||
class CGameDispatchTable : public CPacketDispatchTable<GameDispatchFunc>
|
||||
{
|
||||
public:
|
||||
|
||||
static CGameDispatchTable& GetInstance();
|
||||
|
||||
private:
|
||||
|
||||
CGameDispatchTable();
|
||||
};
|
||||
|
||||
|
||||
CGameDispatchTable& CGameDispatchTable::GetInstance()
|
||||
{
|
||||
static CGameDispatchTable gameDispatchTable;
|
||||
return gameDispatchTable;
|
||||
}
|
||||
|
||||
CGameDispatchTable::CGameDispatchTable()
|
||||
: CPacketDispatchTable<GameDispatchFunc>(UCHAR_MAX)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
|
||||
AddDispatch(CmdDepositUpdate, ParseCharUpdate::UpdateDepositDB);
|
||||
AddDispatch(CmdDeposit, ParseCharUpdate::UpdateDeposit);
|
||||
AddDispatch(CmdFriendDB, ParseCharUpdate::UpdateFriendDB);
|
||||
AddDispatch(CmdQuestDB, ParseCharUpdate::UpdateQuestDB);
|
||||
AddDispatch(CmdConfigInfoDB, ParseCharUpdate::UpdateConfigInfoDB);
|
||||
|
||||
// <20><><EFBFBD>̵<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
AddDispatch(CmdAgentZone, ParseMoveZone::Parse);
|
||||
|
||||
// <20><>Ƽ <20><><EFBFBD><EFBFBD>
|
||||
AddDispatch(CmdAgentParty, ParseParty::Parse);
|
||||
|
||||
// <20><>Ʋ<EFBFBD><EFBFBD><D7B6><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
AddDispatch(CmdBGServerCharSlot, ParseCharManage::BGServerCharSlot);
|
||||
|
||||
// <20>α<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
AddDispatch(CmdServerLog, ParseServerLog);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
AddDispatch(CmdCreateGuild, ParseGuild::CreateGuild);
|
||||
AddDispatch(CmdGuildCmd, ParseGuild::GuildCmd);
|
||||
AddDispatch(CmdGuildMark, ParseGuild::GuildMark);
|
||||
AddDispatch(CmdGuildLevel, ParseGuild::GuildLevel);
|
||||
AddDispatch(CmdGuildRelation, ParseGuild::GuildRelation);
|
||||
AddDispatch(CmdGuildInclination, ParseGuild::GuildInclination);
|
||||
AddDispatch(CmdGuildRight, ParseGuild::SetGuildRight);
|
||||
AddDispatch(CmdGuildSafe, ParseGuild::GuildSafe);
|
||||
AddDispatch(CmdGuildMemberInfoUpdate, ParseGuild::GuildMemberInfoUpdate);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
AddDispatch(CmdCreateCamp, ParseCastle::CreateCamp);
|
||||
AddDispatch(CmdCreateSiegeArms, ParseCastle::CreateSiegeArms);
|
||||
AddDispatch(CmdCastleCmd, ParseCastle::CastleCmd);
|
||||
AddDispatch(CmdCampCmd, ParseCastle::CampCmd);
|
||||
AddDispatch(CmdSiegeArmsCmd, ParseCastle::SiegeArmsCmd);
|
||||
AddDispatch(CmdCastleRight, ParseCastle::SetCastleRight);
|
||||
AddDispatch(CmdCampRight, ParseCastle::SetCampRight);
|
||||
AddDispatch(CmdCampMessage, ParseCastle::CampMessage);
|
||||
AddDispatch(CmdMiningCampMineralInfo, ParseCastle::MiningCampMineralInfo);
|
||||
AddDispatch(CmdFertilityInfo, ParseCastle::FertilityInfo);
|
||||
AddDispatch(CmdCampShopInfo, ParseCastle::CampShopInfo);
|
||||
AddDispatch(CmdCastleTaxMove, ParseCastle::CastleTaxMove);
|
||||
AddDispatch(CmdCastleMineralInfo, ParseCastle::CastleMineralInfo);
|
||||
AddDispatch(CmdWarOnOff, ParseCastle::WarOnOff);
|
||||
AddDispatch(CmdStatueCmd, ParseCastle::StatueCmd);
|
||||
|
||||
AddDispatch(CmdAdminCommandLog, ParseCharAdmin::AdminCommandLog);
|
||||
|
||||
AddDispatch(CmdRealmPoint, ParseCastle::RealmPoint);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
AddDispatch(CmdSaveEnemy, ParseCharUpdate::SaveEnemy);
|
||||
|
||||
// <20><><EFBFBD>̽<EFBFBD>ƽ <20><><EFBFBD><EFBFBD>.
|
||||
AddDispatch(CmdKeyInfo, ParseCharUpdate::UpdateKeyInfo);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
AddDispatch(CmdCharUseCashItem, ParseCharUpdate::UseCashItem);
|
||||
AddDispatch(CmdExtraEvent, ParseCharUpdate::ExtraEvent);
|
||||
}
|
||||
|
||||
|
||||
CMultiDispatch& CGameDispatch::GetDispatchTable()
|
||||
{
|
||||
static CMultiDispatch gameDispatch;
|
||||
return gameDispatch;
|
||||
}
|
||||
|
||||
|
||||
CGameDispatch::CGameDispatch(CSession& Session)
|
||||
: CRylServerDispatch(Session, MAX_PACKET_DISPATCH_PER_PULSE),
|
||||
m_nHumanNum(1),
|
||||
m_nAkhanNum(1),
|
||||
m_dwServerID(0)
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
CGameDispatch::~CGameDispatch()
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
void CGameDispatch::Connected()
|
||||
{
|
||||
DETLOG3(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/GameServer Connected",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string());
|
||||
}
|
||||
|
||||
void CGameDispatch::Disconnected()
|
||||
{
|
||||
DETLOG3(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/GameServer Disconnected",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string());
|
||||
|
||||
if(0 != m_dwServerID)
|
||||
{
|
||||
GetDispatchTable().RemoveDispatch(m_dwServerID);
|
||||
|
||||
if(0LL != m_GameItemSerialMgr.GetItemSerial())
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> DB<44><42> <20><><EFBFBD><EFBFBD>
|
||||
m_GameItemSerialMgr.SaveItemSerial(
|
||||
CDBSingleObject::GetInstance(), m_dwServerID);
|
||||
}
|
||||
|
||||
// ä<><C3A4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
DBAgent::SendPacket::UpdateChannelAllServer();
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1>ε<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
DataStorage::CSessionDataMgr::GetInstance().SessionCloseCurrentServer(m_dwServerID);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool CGameDispatch::DispatchPacket(PktBase* lpPktBase)
|
||||
{
|
||||
// <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DBAgent<6E><74> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD>
|
||||
|
||||
PktBase::CMDType cCmd =lpPktBase->GetCmd();
|
||||
|
||||
bool bResult = false;
|
||||
GameDispatchFunc lpDispatchFunc = 0;
|
||||
|
||||
|
||||
CSendStream& SendStream = GetSendStream();
|
||||
|
||||
switch(cCmd)
|
||||
{
|
||||
// <20>α<EFBFBD><CEB1><EFBFBD> / <20>αƿ<D7BE> / <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
case CmdDBUpdateData:
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD>ϰų<CFB0> <20>αƿ<D7BE><C6BF>Ҷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><DEBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
// <20><><EFBFBD>⼭ Ÿ<><C5B8>DB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>ϰų<CFB0> <20>Ѵ<EFBFBD>.
|
||||
bResult = ParseCharUpdate::Parse(SendStream, m_dwServerID,
|
||||
m_GameItemSerialMgr, static_cast<PktDBUpdate*>(lpPktBase));
|
||||
break;
|
||||
|
||||
case CmdSysServerLogin: bResult = ServerLogin(lpPktBase); break; // <20><><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD>
|
||||
case CmdSysServerLogout: bResult = ServerLogout(lpPktBase); break; // <20><><EFBFBD><EFBFBD> <20>αƿ<D7BE>
|
||||
case CmdUserKill: bResult = UserKillAck(lpPktBase); break; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̱<EFBFBD>
|
||||
case CmdCharAdminCmd: bResult = CharAdminCmd(lpPktBase); break; // <20><EFBFBD><EEBFB5> <20><><EFBFBD><EFBFBD>
|
||||
case CmdGiveItemToTempInven: bResult = GiveItemToTempInven(lpPktBase); break; // <20>ӽ<EFBFBD><D3BD>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֱ<EFBFBD>
|
||||
case CmdCharNameChange: bResult = ChangeName(lpPktBase); break; // ij<><C4B3><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20>ٲ۴<D9B2>
|
||||
|
||||
default:
|
||||
|
||||
// <20><>Ÿ <20><><EFBFBD><EFBFBD>(<28><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD>)
|
||||
lpDispatchFunc = CGameDispatchTable::GetInstance().GetDispatch(cCmd);
|
||||
if(0 != lpDispatchFunc)
|
||||
{
|
||||
bResult = lpDispatchFunc(SendStream, lpPktBase);
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG5(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/Cmd:0x%02X/ServerID:0x%08X / "
|
||||
"<EFBFBD><EFBFBD><EFBFBD>Ӽ<EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ ó<><C3B3> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> Ŀ<>ǵ<EFBFBD><C7B5>Դϴ<D4B4>",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string(), cCmd, m_dwServerID);
|
||||
|
||||
bResult = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if(!bResult)
|
||||
{
|
||||
ERRLOG5(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/Cmd:0x%02X/ServerID:0x%08X / <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> <20><>Ŷ ó<><C3B3> <20><><EFBFBD><EFBFBD> : ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string(), cCmd, m_dwServerID);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
bool CGameDispatch::ServerLogin(PktBase* lpPktBase)
|
||||
{
|
||||
PktSL* lpPktSL = static_cast<PktSL*>(lpPktBase);
|
||||
|
||||
m_dwServerID = lpPktSL->m_dwServerID;
|
||||
|
||||
INFLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/ServerID:0x%08X/<2F><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20>õ<EFBFBD> : <20><>Ŷ <20><><EFBFBD><EFBFBD>",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string(), m_dwServerID);
|
||||
|
||||
GET_MULTI_DISPATCH(lpGameDispatch, m_dwServerID,
|
||||
CGameDispatch, GetDispatchTable());
|
||||
|
||||
if(0 != lpGameDispatch)
|
||||
{
|
||||
ERRLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/ServerID:0x%08X/<2F><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string(), m_dwServerID);
|
||||
|
||||
CloseSession();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Dispatch <20><><EFBFBD><EFBFBD>.
|
||||
GetDispatchTable().SetDispatch(m_dwServerID, this);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> <20>ε<EFBFBD>.
|
||||
if(!m_GameItemSerialMgr.LoadItemSerial(CDBSingleObject::GetInstance(), m_dwServerID))
|
||||
{
|
||||
ERRLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/ServerID:0x%08X/<2F><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string(), m_dwServerID);
|
||||
|
||||
CloseSession();
|
||||
return false;
|
||||
}
|
||||
|
||||
CSendStream& SendStream = GetSendStream();
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
Guild::CGuildDBMgr::GetInstance().SendGuildDBList(SendStream);
|
||||
|
||||
SERVER_ID serverID;
|
||||
serverID.dwID = m_dwServerID;
|
||||
|
||||
/// <20><> <20><> ķ<><C4B7>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ.
|
||||
Castle::CCastleDBMgr::GetInstance().SendCastleInfo(SendStream, serverID.GetZone(), serverID.GetChannel());
|
||||
CGameTimeDBMgr::GetInstance().SendGameTimeInfo(GameTime::TYPE_GAMESERVER_LOGIN, true, true, true, true, true);
|
||||
CSiegeObjectDBMgr::GetInstance().SendWorldWeaponInfo(SendStream, serverID.GetZone(), serverID.GetChannel());
|
||||
CSiegeObjectDBMgr::GetInstance().SendCampInfo(SendStream, serverID.GetZone(), serverID.GetChannel());
|
||||
CSiegeObjectDBMgr::GetInstance().SendSiegeArmsInfo(SendStream, serverID.GetZone(), serverID.GetChannel());
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <20><>ũ ī<><C4AB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
if (true == CServerSetup::GetInstance().UseContents(GameRYL::STONE_BATTLE))
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
// <20><><EFBFBD><EFBFBD> : <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.!!
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>æƮ ȿ<><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ޱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.!!
|
||||
if (SERVER_ID::STONE_WAR1 <= serverID.GetZone() && serverID.GetZone() <= SERVER_ID::STONE_WAR3)
|
||||
{
|
||||
CStatueDBMgr::GetInstance().SendStatueInfo(SendStream, serverID.GetChannel());
|
||||
}
|
||||
}
|
||||
/*
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <20>ű<EFBFBD><C5B1><EFBFBD>
|
||||
if (true == CServerSetup::GetInstance().UseContents(GameRYL::NEWZONE_ZONE9))
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
// <20><><EFBFBD><EFBFBD> : <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.!!
|
||||
if (serverID.GetZone() == SERVER_ID::ZONE9)
|
||||
{
|
||||
CStatueDBMgr::GetInstance().SendStatueInfo(SendStream, serverID.GetChannel());
|
||||
}
|
||||
}
|
||||
*/
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
CMineralVeinDBMgr::GetInstance().SendFertilityInfo(SendStream, serverID.GetZone(), serverID.GetChannel());
|
||||
|
||||
// ä<><C3A4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
DBAgent::SendPacket::UpdateChannelAllServer();
|
||||
|
||||
// <20><>ŷ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
CRankingDBMgr::GetInstance().SendRankingInfo(SendStream);
|
||||
|
||||
// <20><>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD> //
|
||||
CPartyDBMgr::GetInstance().SendToGameServerPartyData(SendStream);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> Ack<63><6B><EFBFBD><EFBFBD>.
|
||||
return SendPacket::ServerLoginAck(m_SendStream,
|
||||
m_dwServerID, m_GameItemSerialMgr.GetItemSerial());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CGameDispatch::ServerLogout(PktBase* lpPktBase)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><>Ŷ <20>״<EFBFBD><D7B4><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ش<EFBFBD>.
|
||||
|
||||
char* lpBuffer = m_SendStream.GetBuffer(sizeof(PktBase));
|
||||
if(0 != lpBuffer)
|
||||
{
|
||||
return m_SendStream.WrapHeader(sizeof(PktBase), CmdSysServerLogout, 0, 0);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool CGameDispatch::UserKillAck(PktBase* lpPktBase)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̱⸦ <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD>, Ack<63><6B> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
||||
|
||||
PktUK* lpPktUK = static_cast<PktUK*>(lpPktBase);
|
||||
|
||||
if(2 == lpPktUK->GetError())
|
||||
{
|
||||
using namespace DataStorage;
|
||||
|
||||
CSessionData* lpSessionData =
|
||||
CSessionDataMgr::GetInstance().GetOpenSession(lpPktUK->m_dwUserID);
|
||||
|
||||
if(0 != lpSessionData &&
|
||||
CSessionData::SE_CHAR_ENABLED == lpSessionData->GetSessionState())
|
||||
{
|
||||
if(lpSessionData->GetServerID() == lpPktUK->m_dwServerID)
|
||||
{
|
||||
CSessionDataMgr::GetInstance().SessionCloseWithLogout(
|
||||
lpPktUK->m_dwUserID, lpPktUK->m_dwServerID);
|
||||
|
||||
ERRLOG2(g_Log, "UID:%10u / ServerID:0x%08X / <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̱<EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
lpPktUK->m_dwUserID, lpPktUK->m_dwServerID);
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG3(g_Log, "UID:%10u / FromServerID:0x%08X / TargetServerID:0x%08X / "
|
||||
"<EFBFBD><EFBFBD><EFBFBD>Ӽ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̱<EFBFBD> <20><>û <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD>",
|
||||
lpPktUK->m_dwUserID, lpPktUK->m_dwServerID, lpSessionData->GetServerID());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool CGameDispatch::CharAdminCmd(PktBase* lpPktBase)
|
||||
{
|
||||
PktAdmin* lpPktAdmin = static_cast<PktAdmin*>(lpPktBase);
|
||||
|
||||
PktAdmin pktSendAdmin;
|
||||
|
||||
// <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>״<EFBFBD><D7B4><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
memcpy(&pktSendAdmin, lpPktAdmin, sizeof(PktAdmin));
|
||||
|
||||
// <20>߰輭<DFB0><E8BCAD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
/*if(lpPktAdmin->m_usCmd == PktAdmin::DBAGENT_KILL)
|
||||
{
|
||||
int nZero = 0;
|
||||
int nError = 10 / nZero;
|
||||
*reinterpret_cast<int*>(nError) = 0xFFFFFFFF;
|
||||
}*/
|
||||
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ <20><>ǥ<EFBFBD><C7A5>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
|
||||
if (lpPktAdmin->m_usCmd == PktAdmin::REQUEST_TRACE_POS)
|
||||
{
|
||||
// <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ը<EFBFBD> TRACE <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
pktSendAdmin.m_usCmd = PktAdmin::TRACE_CHAR;
|
||||
|
||||
SERVER_ID serverID;
|
||||
|
||||
serverID.sID.Type = CServerSetup::GameServer;
|
||||
serverID.sID.Group = CServerSetup::GetInstance().GetServerGroup();
|
||||
serverID.sID.Channel = lpPktAdmin->m_ZoneInfo.m_cChannel;
|
||||
serverID.sID.ID = lpPktAdmin->m_ZoneInfo.m_cZone;
|
||||
|
||||
GET_MULTI_DISPATCH(lpGameDispatch, serverID.dwID,
|
||||
CGameDispatch, CGameDispatch::GetDispatchTable());
|
||||
|
||||
if(0 != lpGameDispatch)
|
||||
{
|
||||
serverID.dwID = m_dwServerID;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> channel <20><> -1 <20>̾<EFBFBD><CCBE><EFBFBD> <20>Ѵ<EFBFBD>. -_-;
|
||||
pktSendAdmin.m_ZoneInfo.m_cZone = serverID.GetZone();
|
||||
pktSendAdmin.m_ZoneInfo.m_cChannel = -1;
|
||||
|
||||
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktSendAdmin),
|
||||
sizeof(PktAdmin), CmdCharAdminCmd, 0, 0))
|
||||
{
|
||||
lpGameDispatch->GetSendStream().PutBuffer(
|
||||
reinterpret_cast<char*>(&pktSendAdmin), sizeof(PktAdmin), CmdCharAdminCmd);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
else if (lpPktAdmin->m_usCmd == PktAdmin::TRACE_CHAR)
|
||||
{
|
||||
using namespace DBAgent::DataStorage;
|
||||
|
||||
// ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>αƿ<D7BE><C6BF><EFBFBD> <20><><EFBFBD>¶<EFBFBD><C2B6><EFBFBD>
|
||||
if (false == CSessionDataMgr::GetInstance().IsLoadedChar(lpPktAdmin->m_stName))
|
||||
{
|
||||
// <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>αƿ<D7BE> <20>ߴٴ<DFB4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
pktSendAdmin.m_usCmd = PktAdmin::TRACE_CHAR;
|
||||
|
||||
GET_MULTI_DISPATCH(lpGameDispatch, m_dwServerID,
|
||||
CGameDispatch, CGameDispatch::GetDispatchTable());
|
||||
|
||||
if(0 != lpGameDispatch)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> channel <20><> -1 <20>̾<EFBFBD><CCBE><EFBFBD> <20>Ѵ<EFBFBD>. -_-;
|
||||
pktSendAdmin.m_ZoneInfo.m_cChannel = -1;
|
||||
pktSendAdmin.m_Position.fPointX = 0.0f;
|
||||
pktSendAdmin.m_Position.fPointY = 0.0f;
|
||||
pktSendAdmin.m_Position.fPointZ = 0.0f;
|
||||
|
||||
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktSendAdmin),
|
||||
sizeof(PktAdmin), CmdCharAdminCmd, 0, PktAdmin::E_LOGOUT_CHAR))
|
||||
{
|
||||
lpGameDispatch->GetSendStream().PutBuffer(
|
||||
reinterpret_cast<char*>(&pktSendAdmin), sizeof(PktAdmin), CmdCharAdminCmd);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pktSendAdmin.m_usCmd = PktAdmin::REQUEST_TRACE_POS;
|
||||
|
||||
SERVER_ID serverID;
|
||||
serverID.dwID = m_dwServerID;
|
||||
|
||||
// TRACE <20><><EFBFBD>Ѿ<EFBFBD> <20><> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȣ<EFBFBD><C8A3> <20><><EFBFBD><EFBFBD><EFBFBD>صд<D8B5>.
|
||||
pktSendAdmin.m_ZoneInfo.m_cZone = serverID.GetZone();
|
||||
pktSendAdmin.m_ZoneInfo.m_cChannel = 0;
|
||||
}
|
||||
}
|
||||
/*
|
||||
else if (lpPktAdmin->m_usCmd == PktAdmin::INFO_CHAR)
|
||||
{
|
||||
using namespace DBAgent::DataStorage;
|
||||
|
||||
// ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>αƿ<D7BE><C6BF><EFBFBD> <20><><EFBFBD>¶<EFBFBD><C2B6><EFBFBD>
|
||||
if (false == CSessionDataMgr::GetInstance().IsLoadedChar(lpPktAdmin->m_stName))
|
||||
{
|
||||
pktSendAdmin.m_usCmd = PktAdmin::INFO_CHAR;
|
||||
|
||||
GET_MULTI_DISPATCH(lpGameDispatch, m_dwServerID,
|
||||
CGameDispatch, CGameDispatch::GetDispatchTable());
|
||||
|
||||
if(0 != lpGameDispatch)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> channel <20><> -1 <20>̾<EFBFBD><CCBE><EFBFBD> <20>Ѵ<EFBFBD>. -_-;
|
||||
pktSendAdmin.m_ZoneInfo.m_cChannel = -1;
|
||||
pktSendAdmin.m_Position.fPointX = 0.0f;
|
||||
pktSendAdmin.m_Position.fPointY = 0.0f;
|
||||
pktSendAdmin.m_Position.fPointZ = 0.0f;
|
||||
|
||||
if (PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktSendAdmin),
|
||||
sizeof(PktAdmin), CmdCharAdminCmd, 0, PktAdmin::E_LOGOUT_CHAR))
|
||||
{
|
||||
lpGameDispatch->GetSendStream().PutBuffer(
|
||||
reinterpret_cast<char*>(&pktSendAdmin), sizeof(PktAdmin), CmdCharAdminCmd);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktSendAdmin),
|
||||
sizeof(PktAdmin), CmdCharAdminCmd, 0, 0))
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktSendAdmin), sizeof(PktAdmin), CmdCharAdminCmd));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool CGameDispatch::GiveItemToTempInven(PktBase* lpPktBase)
|
||||
{
|
||||
PktGiveItemToTempInven* lpPktGiveItemToTempInven =
|
||||
static_cast<PktGiveItemToTempInven*>(lpPktBase);
|
||||
|
||||
GiveItemInfo* lpPos = lpPktGiveItemToTempInven->m_GiveItemInfo;
|
||||
GiveItemInfo* lpEnd = lpPos + lpPktGiveItemToTempInven->m_cGiveItemNum;
|
||||
|
||||
CGiveItemMgr& giveItemMgr = CGiveItemMgr::GetInstance();
|
||||
|
||||
for(; lpPos != lpEnd; ++lpPos)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֱ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD> ä<><C3A4><EFBFBD><EFBFBD> <20>ش<EFBFBD>. ä<><C3A4><EFBFBD><EFBFBD> <20><> <20>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD> DB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
if(0 != lpPos->m_dwItemUID)
|
||||
{
|
||||
giveItemMgr.UpdateItemSerial(
|
||||
lpPos->m_dwCreateID, lpPos->m_dwItemUID);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CGameDispatch::ChangeName(PktBase* lpPktBase)
|
||||
{
|
||||
PktCharNameChange* lpCharNameChange =
|
||||
reinterpret_cast<PktCharNameChange*>(lpPktBase);
|
||||
|
||||
unsigned long dwUID = lpCharNameChange->m_dwUID;
|
||||
unsigned long dwCID = lpCharNameChange->m_dwCID;
|
||||
const char* szChangeName = lpCharNameChange->m_szCharName;
|
||||
Item::ItemPos ItemPos = lpCharNameChange->m_ItemPos; // <20><><EFBFBD><EFBFBD><EFBFBD>㰡<EFBFBD><E3B0A1> <20><>ġ
|
||||
|
||||
unsigned char cNameChangeCount = 0;
|
||||
unsigned short usError = 0;
|
||||
|
||||
using namespace DBAgent::DataStorage;
|
||||
|
||||
CSessionData* lpSessionData =
|
||||
CSessionDataMgr::GetInstance().GetCharLoadedSession(dwCID);
|
||||
|
||||
CCharacterData* lpCharacterData = 0;
|
||||
|
||||
if (0 != lpSessionData &&
|
||||
lpSessionData->GetUID() == dwUID &&
|
||||
lpSessionData->GetCID() == dwCID &&
|
||||
(0 != (lpCharacterData = lpSessionData->GetCharacterData())) &&
|
||||
dwCID == lpCharacterData->GetCID())
|
||||
{
|
||||
unsigned long dwResult = 0;
|
||||
|
||||
const char* szPrevName = lpCharacterData->GetName();
|
||||
|
||||
// ī<><C4AB>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>δ<EFBFBD>.
|
||||
CHAR_INFOEX infoEx = lpCharacterData->GetInfoEx();
|
||||
/*
|
||||
if (0 == infoEx.cNameChangeCount)
|
||||
{
|
||||
usError = PktCharNameChange::ERR_NAMECHANGE_COUNT;
|
||||
}
|
||||
else
|
||||
*/
|
||||
// <20>̻<EFBFBD><CCBB><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>⼭ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ҽ<EFBFBD>Ų<EFBFBD><C5B2>.
|
||||
if (DBComponent::GameDB::ChangeCharName(
|
||||
CDBSingleObject::GetInstance(), dwCID, szChangeName, dwResult))
|
||||
{
|
||||
if (0 == dwResult)
|
||||
{
|
||||
CHAR_INFOST charInfoST = lpCharacterData->GetInfo();
|
||||
|
||||
strncpy(charInfoST.Name, szChangeName, CHAR_INFOST::MAX_NAME_LEN);
|
||||
charInfoST.Name[CHAR_INFOST::MAX_NAME_LEN - 1] = 0;
|
||||
|
||||
lpCharacterData->SetInfo(charInfoST, true);
|
||||
|
||||
infoEx.cNameChangeCount = 0;
|
||||
// --infoEx.cNameChangeCount; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD> <20>̺κ<CCBA><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
|
||||
cNameChangeCount = infoEx.cNameChangeCount;
|
||||
lpCharacterData->SetInfoEx(infoEx);
|
||||
|
||||
// <20><>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD> ã<>´<EFBFBD> //
|
||||
if(CRankingMgr::GetInstance().GetRank(szPrevName, (unsigned char)lpCharacterData->GetClass()))
|
||||
{
|
||||
const CHAR_INFOST& charInfo = lpCharacterData->GetInfo();
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //
|
||||
CRankingDBMgr::GetInstance().DeleteRanking(RankingNode(szPrevName, charInfo.Fame,
|
||||
static_cast<unsigned char>(charInfo.Level), static_cast<unsigned char>(charInfo.Class)));
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ //
|
||||
CRankingDBMgr::GetInstance().UpdateRanking(RankingNode(szChangeName, charInfo.Fame,
|
||||
static_cast<unsigned char>(charInfo.Level), static_cast<unsigned char>(charInfo.Class)));
|
||||
}
|
||||
}
|
||||
else if(1 == dwResult)
|
||||
{
|
||||
ERRLOG3(g_Log, "UID:%10u / CID:%10u / ChangeName:%s / ij<><C4B3><EFBFBD><EFBFBD> <20≯<EFBFBD> <20>ٲٱ<D9B2> <20><><EFBFBD><EFBFBD> : <20≯<EFBFBD><CCB8><EFBFBD> <20>̹<EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>",
|
||||
dwUID, dwCID, szChangeName);
|
||||
|
||||
usError = PktCharNameChange::ERR_ALREADY_USE_NAME;
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG4(g_Log, "UID:%10u / CID:%10u / ChangeName:%s / dwResult:%10u / ij<><C4B3><EFBFBD><EFBFBD> <20≯<EFBFBD> <20>ٲٱ<D9B2> <20><><EFBFBD><EFBFBD> : <20><> <20><> <20><><EFBFBD><EFBFBD> dwResult<6C><74><EFBFBD>Դϴ<D4B4>",
|
||||
dwUID, dwCID, szChangeName, dwResult);
|
||||
|
||||
usError = PktCharNameChange::ERR_SERVER;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG3(g_Log, "UID:%10u / CID:%10u / ChangeName:%s / ij<><C4B3><EFBFBD><EFBFBD> <20≯<EFBFBD> <20>ٲٱ<D9B2> <20><><EFBFBD><EFBFBD> : DBȣ<42><C8A3> <20><><EFBFBD><EFBFBD>",
|
||||
dwUID, dwCID, szChangeName);
|
||||
|
||||
usError = PktCharNameChange::ERR_SERVER;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG3(g_Log, "UID:%10u / CID:%10u / ChangeName:%s / "
|
||||
"ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD> <20>ٲٱ<D9B2> <20><><EFBFBD><EFBFBD> : ij<><C4B3><EFBFBD>Ͱ<EFBFBD> Ȱ<><C8B0>ȭ <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>",
|
||||
dwUID, dwCID, szChangeName);
|
||||
|
||||
usError = PktCharNameChange::ERR_CANNOT_FIND_CHARACTER;
|
||||
}
|
||||
|
||||
GameClientSendPacket::SendCharNameChange(GetSendStream(), dwUID, dwCID,
|
||||
szChangeName, cNameChangeCount, &ItemPos, usError);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void CGameDispatch::IncCharNum(int nRace)
|
||||
{
|
||||
switch(nRace)
|
||||
{
|
||||
case CClass::HUMAN: ++m_nHumanNum; break;
|
||||
case CClass::AKHAN: ++m_nAkhanNum; break;
|
||||
}
|
||||
}
|
||||
|
||||
void CGameDispatch::DecCharNum(int nRace)
|
||||
{
|
||||
switch(nRace)
|
||||
{
|
||||
case CClass::HUMAN: --m_nHumanNum; break;
|
||||
case CClass::AKHAN: --m_nAkhanNum; break;
|
||||
}
|
||||
}
|
||||
|
||||
int CGameDispatch::GetCharNum(int nRace) const
|
||||
{
|
||||
int nNum = -1;
|
||||
|
||||
switch(nRace)
|
||||
{
|
||||
case CClass::HUMAN: nNum = m_nHumanNum; break;
|
||||
case CClass::AKHAN: nNum = m_nAkhanNum; break;
|
||||
}
|
||||
|
||||
return (nNum < 1) ? 1 : nNum;
|
||||
}
|
||||
|
||||
int CGameDispatch::GetCharNum() const
|
||||
{
|
||||
int nUserNumber = m_nHumanNum + m_nAkhanNum - 1;
|
||||
return (nUserNumber < 1) ? 1 : nUserNumber;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// <20><><EFBFBD>߿<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>и<EFBFBD><D0B8><EFBFBD> <20><>..
|
||||
bool ParseServerLog(CSendStream& SendStream, PktBase* lpPktBase)
|
||||
{
|
||||
PktServerLog* lpPktServerLog = static_cast<PktServerLog*>(lpPktBase);
|
||||
|
||||
switch(lpPktServerLog->m_cLogCmd)
|
||||
{
|
||||
case PktServerLog::ITEM_DUPLICATED_LOG:
|
||||
{
|
||||
PktItemDuplicated* lpPktItemDup = static_cast<PktItemDuplicated*>(lpPktServerLog);
|
||||
|
||||
if(!DBComponent::GameDB::InsertItemDuplicatedLog(CDBSingleObject::GetInstance(),
|
||||
lpPktItemDup->m_dwItemSerial, lpPktItemDup->m_szName,
|
||||
lpPktItemDup->m_dwUID, lpPktItemDup->m_dwCID, lpPktItemDup->m_dwQty))
|
||||
{
|
||||
ERRLOG5(g_Log, "UID:%10u / CID:%10u / CharName:%s / ItemSerial:0x%I64X / Qty:%u / <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>簡 <20>߰ߵǾ<DFB5><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>",
|
||||
lpPktItemDup->m_dwUID, lpPktItemDup->m_dwCID, lpPktItemDup->m_szName,
|
||||
lpPktItemDup->m_dwItemSerial, lpPktItemDup->m_dwQty);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------------
|
||||
// <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD> <20><EFBFBD><DEBC><EFBFBD>
|
||||
|
||||
CGetTotalCount::CGetTotalCount(unsigned short& usHumanCount,
|
||||
unsigned short& usAkhanCount,
|
||||
unsigned char& cChannelCount)
|
||||
: m_usHumanCount(usHumanCount),
|
||||
m_usAkhanCount(usAkhanCount),
|
||||
m_cChannelCount(cChannelCount)
|
||||
{
|
||||
m_usHumanCount = 0;
|
||||
m_usAkhanCount = 0;
|
||||
m_cChannelCount = 0;
|
||||
}
|
||||
|
||||
bool CGetTotalCount::operator () (unsigned long dwServerID, CPacketDispatch& packetDispatch)
|
||||
{
|
||||
CGameDispatch& gameDispatch = reinterpret_cast<CGameDispatch&>(packetDispatch);
|
||||
|
||||
int nCharNum = gameDispatch.GetCharNum(CClass::HUMAN);
|
||||
m_usHumanCount += nCharNum;
|
||||
|
||||
nCharNum = gameDispatch.GetCharNum(CClass::AKHAN);
|
||||
m_usAkhanCount += nCharNum;
|
||||
|
||||
++m_cChannelCount;
|
||||
return true;
|
||||
}
|
||||
|
||||
CUserPercentageInZone::CUserPercentageInZone(unsigned short* lpChannelUserNum,
|
||||
unsigned char cZone, unsigned char cChannelNum)
|
||||
: m_lpChannelUserNum(lpChannelUserNum),
|
||||
m_cZone(cZone),
|
||||
m_cChannelNum(cChannelNum),
|
||||
m_nMaxUserNum(CServerSetup::GetInstance().GetUserLimit())
|
||||
{
|
||||
std::fill_n(m_lpChannelUserNum, m_cChannelNum, 0);
|
||||
}
|
||||
|
||||
bool CUserPercentageInZone::operator () (unsigned long dwServerID, CPacketDispatch& packetDispatch)
|
||||
{
|
||||
CGameDispatch& gameDispatch = reinterpret_cast<CGameDispatch&>(packetDispatch);
|
||||
|
||||
SERVER_ID serverID;
|
||||
serverID.dwID = dwServerID;
|
||||
|
||||
if(serverID.GetZone() == m_cZone)
|
||||
{
|
||||
if(serverID.GetChannel() < m_cChannelNum)
|
||||
{
|
||||
m_lpChannelUserNum[serverID.GetChannel()] =
|
||||
gameDispatch.GetCharNum() * 100 / m_nMaxUserNum + 1;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
CSendPacketToZone::CSendPacketToZone(const char* szData, unsigned long dwDataLen,
|
||||
unsigned char cPacketCmd, unsigned char cZone)
|
||||
: m_szData(szData), m_dwDataLen(dwDataLen),
|
||||
m_cPacketCmd(cPacketCmd), m_cZone(cZone)
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
bool CSendPacketToZone::operator () (unsigned long dwServerID, CPacketDispatch& packetDispatch)
|
||||
{
|
||||
SERVER_ID serverID;
|
||||
serverID.dwID = dwServerID;
|
||||
|
||||
if(serverID.GetZone() == m_cZone)
|
||||
{
|
||||
return reinterpret_cast<CRylServerDispatch&>(packetDispatch).GetSendStream().PutBuffer(
|
||||
m_szData, m_dwDataLen, m_cPacketCmd);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,118 @@
|
||||
#ifndef _DBAGENT_SERVER_GAME_DISPATCH_H_
|
||||
#define _DBAGENT_SERVER_GAME_DISPATCH_H_
|
||||
|
||||
#include <Network/Dispatch/RylServerDispatch.h>
|
||||
#include <Network/Dispatch/MultiDispatchStorage.h>
|
||||
|
||||
#include <Item/ItemSerialMgr.h>
|
||||
|
||||
// forward decl.
|
||||
struct PktSL;
|
||||
struct PktBase;
|
||||
struct PktUK;
|
||||
struct PktAdmin;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
class CGameDispatch : public CRylServerDispatch
|
||||
{
|
||||
public:
|
||||
|
||||
static CMultiDispatch& GetDispatchTable();
|
||||
|
||||
enum Const
|
||||
{
|
||||
// edith 2008.03.04 CGameDispatch <20><><EFBFBD><EFBFBD>
|
||||
MAX_PACKET_DISPATCH_PER_PULSE = 100,
|
||||
MAX_STREAM_BUFFER_SIZE = 16000
|
||||
};
|
||||
|
||||
CGameDispatch(CSession& Session);
|
||||
virtual ~CGameDispatch();
|
||||
|
||||
virtual void Connected();
|
||||
virtual void Disconnected();
|
||||
virtual bool DispatchPacket(PktBase* lpPktBase);
|
||||
|
||||
void IncCharNum(int nRace);
|
||||
void DecCharNum(int nRace);
|
||||
|
||||
int GetCharNum(int nRace) const; // <20><EFBFBD> <20><> <20>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѹ<EFBFBD><D1B8><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
int GetCharNum() const; // <20><EFBFBD> <20><> <20>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѹ<EFBFBD><D1B8><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
|
||||
unsigned long GetServerID() const { return m_dwServerID; }
|
||||
|
||||
private:
|
||||
|
||||
bool ServerLogin(PktBase* lpPktBase);
|
||||
bool ServerLogout(PktBase* lpPktBase);
|
||||
|
||||
bool UserKillAck(PktBase* lpPktBase);
|
||||
bool CharAdminCmd(PktBase* lpPktBase);
|
||||
bool GiveItemToTempInven(PktBase* lpPktBase);
|
||||
bool ChangeName(PktBase* lpPktBase);
|
||||
|
||||
Item::CItemSerialMgr m_GameItemSerialMgr;
|
||||
|
||||
// <20>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD> <20>Ѹ<EFBFBD><D1B8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD> 1<><31> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
|
||||
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ä<><C3A4><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>θ<EFBFBD> <20>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD> 0<><30><EFBFBD><EFBFBD> <20>ƴ<EFBFBD><C6B4><EFBFBD><EFBFBD><EFBFBD> <20>ľ<EFBFBD><C4BE>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
||||
int m_nHumanNum;
|
||||
int m_nAkhanNum;
|
||||
|
||||
unsigned long m_dwServerID;
|
||||
};
|
||||
|
||||
|
||||
// <20><>ü ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD>̴<EFBFBD>. CMultiDispatch::Process <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
class CGetTotalCount
|
||||
{
|
||||
public:
|
||||
|
||||
CGetTotalCount(unsigned short& usHumanCount, unsigned short& usAkhanCount,
|
||||
unsigned char& cChannelCount);
|
||||
bool operator () (unsigned long dwServerID, CPacketDispatch& packetDispatch);
|
||||
|
||||
private:
|
||||
|
||||
unsigned short& m_usHumanCount;
|
||||
unsigned short& m_usAkhanCount;
|
||||
unsigned char& m_cChannelCount;
|
||||
};
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><> <20>ۼ<EFBFBD>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD>̴<EFBFBD>. CMultiDispatch::Process <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
class CUserPercentageInZone
|
||||
{
|
||||
public:
|
||||
|
||||
CUserPercentageInZone(unsigned short* lpChannelUserNum,
|
||||
unsigned char cZone, unsigned char cChannelNum);
|
||||
bool operator () (unsigned long dwServerID, CPacketDispatch& packetDispatch);
|
||||
|
||||
private:
|
||||
|
||||
int m_nMaxUserNum;
|
||||
unsigned short* m_lpChannelUserNum;
|
||||
unsigned char m_cZone;
|
||||
unsigned char m_cChannelNum;
|
||||
};
|
||||
|
||||
// Ư<><C6AF> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ä<>ο<EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
class CSendPacketToZone
|
||||
{
|
||||
public:
|
||||
|
||||
CSendPacketToZone(const char* szData, unsigned long dwDataLen,
|
||||
unsigned char cPacketCmd, unsigned char cZone);
|
||||
bool operator () (unsigned long dwServerID, CPacketDispatch& packetDispatch);
|
||||
|
||||
private:
|
||||
|
||||
const char* m_szData;
|
||||
unsigned long m_dwDataLen;
|
||||
unsigned char m_cPacketCmd;
|
||||
unsigned char m_cZone;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,64 @@
|
||||
#include "stdafx.h"
|
||||
#include "LoginDispatch.h"
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
#include <Network/Address/INET_Addr.h>
|
||||
#include <Network/SendPacket/SendServerInfo.h>
|
||||
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
|
||||
CSingleDispatch& CLoginDispatch::GetDispatchTable()
|
||||
{
|
||||
static CSingleDispatch loginDispatch;
|
||||
return loginDispatch;
|
||||
}
|
||||
|
||||
CLoginDispatch::CLoginDispatch(CSession& Session)
|
||||
: CRylServerDispatch(Session, MAX_PACKET_DISPATCH_PER_PULSE)
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
CLoginDispatch::~CLoginDispatch()
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
void CLoginDispatch::Connected()
|
||||
{
|
||||
DETLOG3(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/LoginServer Connected",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string());
|
||||
|
||||
GetDispatchTable().SetDispatch(this);
|
||||
|
||||
CSendStream& SendStream = GetSendStream();
|
||||
unsigned long dwServerID = CServerSetup::GetInstance().GetServerID();
|
||||
|
||||
SendPacket::ServerLogin(SendStream, dwServerID);
|
||||
SendPacket::UpdateServerVersion(SendStream);
|
||||
SendPacket::UpdateChannel(SendStream, dwServerID);
|
||||
}
|
||||
|
||||
void CLoginDispatch::Disconnected()
|
||||
{
|
||||
DETLOG3(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/LoginServer Disconnected",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string());
|
||||
|
||||
GetDispatchTable().RemoveDispatch(this);
|
||||
}
|
||||
|
||||
bool CLoginDispatch::DispatchPacket(PktBase* lpPktBase)
|
||||
{
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
#ifndef _DBAGENT_SERVER_LOGIN_DISPATCH_H_
|
||||
#define _DBAGENT_SERVER_LOGIN_DISPATCH_H_
|
||||
|
||||
#include <Network/Dispatch/RylServerDispatch.h>
|
||||
#include <Network/Dispatch/SingleDispatchStorage.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
class CLoginDispatch : public CRylServerDispatch
|
||||
{
|
||||
public:
|
||||
|
||||
static CSingleDispatch& GetDispatchTable();
|
||||
|
||||
enum Const
|
||||
{
|
||||
MAX_PACKET_DISPATCH_PER_PULSE = 10,
|
||||
MAX_STREAM_BUFFER_SIZE = 16000
|
||||
};
|
||||
|
||||
CLoginDispatch(CSession& Session);
|
||||
virtual ~CLoginDispatch();
|
||||
|
||||
virtual void Connected();
|
||||
virtual void Disconnected();
|
||||
virtual bool DispatchPacket(PktBase* lpPktBase);
|
||||
|
||||
private:
|
||||
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,623 @@
|
||||
#include "stdafx.h"
|
||||
#include "AuthDispatch.h"
|
||||
#include "Part1DBAgentDispatch.h"
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
#include <Network/Address/INET_Addr.h>
|
||||
#include <Network/SendPacket/SendServerInfo.h>
|
||||
#include <Network/SendPacket/SendCharManage.h>
|
||||
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
#include <Network/Packet/PacketStruct/UnifiedCharPacket.h>
|
||||
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
|
||||
#include <DataStorage/SessionDataMgr.h>
|
||||
#include <DataStorage/StoreDataMgr.h>
|
||||
#include <DataStorage/CharacterDataMgr.h>
|
||||
|
||||
#include <Creature/Creature.h>
|
||||
#include <Creature/Character/CharacterClass.h>
|
||||
|
||||
#include <DB/DBComponent.h>
|
||||
#include <DB/GameDBComponent.h>
|
||||
|
||||
#include <Network/Packet/PacketStruct/CharQuestPacket.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
|
||||
class CCharBackupItemData
|
||||
{
|
||||
public:
|
||||
|
||||
CCharBackupItemData()
|
||||
: m_bBackupData(false), m_cOldServerGroupID(0)
|
||||
{
|
||||
memset(&m_CharInfo, 0, sizeof(CHAR_INFOST)); // <20>⺻ <20><><EFBFBD><EFBFBD>
|
||||
memset(&m_Skill, 0, sizeof(SKILL)); // <20><>ų <20><><EFBFBD><EFBFBD>
|
||||
|
||||
memset(&m_Equip, 0, sizeof(EQUIP)); // <20><><EFBFBD><EFBFBD>
|
||||
memset(&m_Inven, 0, sizeof(INVEN)); // <20>κ<EFBFBD>
|
||||
memset(&m_Extra, 0, sizeof(EXTRA)); // <20><><EFBFBD><EFBFBD>
|
||||
memset(&m_Exchange, 0, sizeof(EXCHANGE)); // <20><>ȯ
|
||||
memset(&m_TempInven, 0, sizeof(TEMPINVEN)); // <20>ӽ<EFBFBD> <20>κ<EFBFBD><CEBA>丮
|
||||
|
||||
memset(&m_Quest, 0, sizeof(QUEST)); // <20><><EFBFBD><EFBFBD>Ʈ
|
||||
memset(&m_History, 0, sizeof(HISTORY)); // <20><><EFBFBD><EFBFBD><EFBFBD>丮
|
||||
}
|
||||
|
||||
bool IsBackupedData() const { return m_bBackupData; }
|
||||
unsigned char GetOldServerGroupID() const { return m_cOldServerGroupID; }
|
||||
|
||||
void BackupData(DataStorage::CSessionData& sessionData, DataStorage::CCharacterData& charData)
|
||||
{
|
||||
m_CharInfo = charData.GetInfo();
|
||||
m_Skill = charData.GetSkill();
|
||||
m_Equip = charData.GetEquip();
|
||||
m_Inven = charData.GetInven();
|
||||
m_Extra = charData.GetExtra();
|
||||
m_Exchange = charData.GetExchange();
|
||||
m_TempInven = charData.GetTempInven();
|
||||
|
||||
m_Quest = charData.GetQuest();
|
||||
m_History = charData.GetHistory();
|
||||
|
||||
const UnifiedCharData* lpUnifiedCharData =
|
||||
sessionData.GetUnifiedCharData(charData.GetCID());
|
||||
|
||||
if(0 != lpUnifiedCharData)
|
||||
{
|
||||
m_cOldServerGroupID = lpUnifiedCharData->cOldServerGroupID;
|
||||
}
|
||||
|
||||
m_bBackupData = true;
|
||||
}
|
||||
|
||||
void RestoreData(DataStorage::CCharacterData& charData)
|
||||
{
|
||||
if (m_bBackupData)
|
||||
{
|
||||
charData.SetInfo(m_CharInfo);
|
||||
charData.SetSkill(m_Skill);
|
||||
charData.SetEquip(m_Equip.Data, m_Equip.dwSize);
|
||||
charData.SetInven(m_Inven.Data, m_Inven.dwSize);
|
||||
charData.SetExtra(m_Extra.Data, m_Extra.dwSize);
|
||||
charData.SetExchange(m_Exchange.Data, m_Exchange.dwSize);
|
||||
charData.SetTempInven(m_TempInven.Data, m_TempInven.dwSize);
|
||||
|
||||
charData.SetQuest(m_Quest);
|
||||
charData.SetHistory(m_History);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
CHAR_INFOST m_CharInfo; // <20>⺻ <20><><EFBFBD><EFBFBD>
|
||||
SKILL m_Skill; // <20><>ų <20><><EFBFBD><EFBFBD>
|
||||
|
||||
EQUIP m_Equip; // <20><><EFBFBD><EFBFBD>
|
||||
INVEN m_Inven; // <20>κ<EFBFBD>
|
||||
EXTRA m_Extra; // <20><><EFBFBD><EFBFBD>
|
||||
EXCHANGE m_Exchange; // <20><>ȯ
|
||||
TEMPINVEN m_TempInven; // <20>ӽ<EFBFBD> <20>κ<EFBFBD><CEBA>丮
|
||||
|
||||
QUEST m_Quest; // <20><><EFBFBD><EFBFBD>Ʈ
|
||||
HISTORY m_History; // History
|
||||
|
||||
unsigned char m_cOldServerGroupID; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID
|
||||
bool m_bBackupData; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
};
|
||||
|
||||
void ProcessUnifiedCharSelect(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
|
||||
|
||||
CSingleDispatch& CPart1DBAgentDispatch::GetDispatchTable()
|
||||
{
|
||||
static CSingleDispatch part1DBAgentDispatch;
|
||||
return part1DBAgentDispatch;
|
||||
}
|
||||
|
||||
CPart1DBAgentDispatch::CPart1DBAgentDispatch(CSession& Session)
|
||||
: CRylServerDispatch(Session, MAX_PACKET_DISPATCH_PER_PULSE)
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
CPart1DBAgentDispatch::~CPart1DBAgentDispatch()
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
void CPart1DBAgentDispatch::Connected()
|
||||
{
|
||||
DETLOG3(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/Part1 DBAgentServer Connected",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string());
|
||||
|
||||
GetDispatchTable().SetDispatch(this);
|
||||
|
||||
SendPacket::ServerLogin(GetSendStream(),
|
||||
CServerSetup::GetInstance().GetServerID());
|
||||
}
|
||||
|
||||
|
||||
void CPart1DBAgentDispatch::Disconnected()
|
||||
{
|
||||
DETLOG3(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/Part1 DBAgentServer Disconnected",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string());
|
||||
|
||||
GetDispatchTable().RemoveDispatch(this);
|
||||
}
|
||||
|
||||
|
||||
bool CPart1DBAgentDispatch::DispatchPacket(PktBase* lpPktBase)
|
||||
{
|
||||
switch(lpPktBase->GetCmd())
|
||||
{
|
||||
case CmdUnifiedCharSelect:
|
||||
ProcessUnifiedCharSelect(GetSendStream(), lpPktBase);
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CPart1DBAgentDispatch::TransferCharPart1ToPart2(CSendStream& SendStream, unsigned long dwUID,
|
||||
unsigned char cSelectedServerGroup,
|
||||
unsigned char cSelectedNation,
|
||||
unsigned long* lpdwSelectedCID,
|
||||
unsigned char cSelectedCharNum)
|
||||
{
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktUnifiedCharSelectReq));
|
||||
|
||||
if(0 != lpBuffer)
|
||||
{
|
||||
PktUnifiedCharSelectReq* lpPktUnifiedCharSelectReq =
|
||||
reinterpret_cast<PktUnifiedCharSelectReq*>(lpBuffer);
|
||||
|
||||
memset(lpPktUnifiedCharSelectReq->szPassword, 0,
|
||||
sizeof(char) * PktUnifiedCharSelectReq::MAX_PASSWORD_LEN);
|
||||
|
||||
lpPktUnifiedCharSelectReq->cSelectedNation = cSelectedNation;
|
||||
lpPktUnifiedCharSelectReq->cSelectedServerGroupID = cSelectedServerGroup;
|
||||
lpPktUnifiedCharSelectReq->dwRequestKey = 0;
|
||||
|
||||
lpPktUnifiedCharSelectReq->dwUID = dwUID;
|
||||
memcpy(lpPktUnifiedCharSelectReq->dwCID, lpdwSelectedCID,
|
||||
sizeof(unsigned long) * std::min(int(cSelectedCharNum), int(USER_INFO::MAX_CHAR_NUM)));
|
||||
|
||||
return SendStream.WrapHeader(sizeof(PktUnifiedCharSelectReq), CmdUnifiedCharSelect, 0, 0);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void ProcessUnifiedCharSelect(CSendStream& SendStream, PktBase* lpPktBase)
|
||||
{
|
||||
PktUnifiedCharSelectReq* lpPktUnifiedCharSelectReq =
|
||||
reinterpret_cast<PktUnifiedCharSelectReq*>(lpPktBase);
|
||||
|
||||
unsigned long dwUID = lpPktUnifiedCharSelectReq->dwUID;
|
||||
unsigned long dwRequestKey = lpPktUnifiedCharSelectReq->dwRequestKey;
|
||||
unsigned char cSelectedServerGroupID = lpPktUnifiedCharSelectReq->cSelectedServerGroupID;
|
||||
unsigned char cSelectedNation = lpPktUnifiedCharSelectReq->cSelectedNation;
|
||||
|
||||
unsigned short usError = 0;
|
||||
|
||||
using namespace DBAgent::DataStorage;
|
||||
|
||||
unsigned char cAgentServerType = static_cast<unsigned char>(
|
||||
CServerSetup::GetInstance().GetAgentServerType());
|
||||
|
||||
CStoreDataMgr& storeDataMgr = CStoreDataMgr::GetInstance();
|
||||
CCharacterDataMgr& charDataMgr = CCharacterDataMgr::GetInstance();
|
||||
CDBComponent& dbComponent = CDBSingleObject::GetInstance();
|
||||
|
||||
UnifiedStoreKey srcStoreKey(dwUID, cSelectedServerGroupID);
|
||||
UnifiedStoreKey dstStoreKey(dwUID, cAgentServerType);
|
||||
|
||||
CSessionData* lpSessionData = 0;
|
||||
CStoreData* lpStoreData = 0;
|
||||
CCharacterData* lpCharacterData = 0;
|
||||
|
||||
if(0 != lpPktBase->GetError())
|
||||
{
|
||||
// <20>ش<EFBFBD> UID<49><44> <20><><EFBFBD><EFBFBD>.
|
||||
ERRLOG2(g_Log, "UID:%10u / Part2Unified ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - Part1 DB<44>߰輭<DFB0><E8BCAD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %d<><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.",
|
||||
dwUID, lpPktBase->GetError());
|
||||
|
||||
usError = lpPktBase->GetError();
|
||||
}
|
||||
else if(0 == (lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession(dwUID)))
|
||||
{
|
||||
// <20>ش<EFBFBD> UID<49><44> <20><><EFBFBD><EFBFBD>.
|
||||
ERRLOG1(g_Log, "UID:%10u / Part2Unified ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>", dwUID);
|
||||
|
||||
usError = PktUnifiedCharSelectAck::SERVER_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
// â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
||||
if (!(lpSessionData->GetFirstLogin() & UnifiedConst::SELECTED_PART2))
|
||||
{
|
||||
// Ȥ<><C8A4> ij<><C4B3><EFBFBD><EFBFBD> loginDB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD>ɴ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
if(storeDataMgr.IsDataLoginDB(srcStoreKey))
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / SrcServerGroupID:%d / Part2Unified â<><C3A2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - <20>ش<EFBFBD> â<><C3A2><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>.",
|
||||
srcStoreKey.first, srcStoreKey.second);
|
||||
|
||||
usError = PktUnifiedCharSelectAck::SERVER_ERROR;
|
||||
}
|
||||
else if(storeDataMgr.IsDataLoginDB(dstStoreKey))
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / DstServerGroupID:%d / Part2Unified â<><C3A2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - <20>ش<EFBFBD> â<><C3A2><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>.",
|
||||
dstStoreKey.first, dstStoreKey.second);
|
||||
|
||||
usError = PktUnifiedCharSelectAck::SERVER_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20>ϴ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
if(storeDataMgr.RemoveLogoutData(srcStoreKey))
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / SrcServerGroupID:%d / "
|
||||
"Part2Unified â<><C3A2> <20><><EFBFBD><EFBFBD> <20>̻<EFBFBD> - <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>־<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.",
|
||||
srcStoreKey.first, srcStoreKey.second);
|
||||
}
|
||||
|
||||
if(storeDataMgr.RemoveLogoutData(dstStoreKey))
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / DstServerGroupID:%d / "
|
||||
"Part2Unified â<><C3A2> <20><><EFBFBD><EFBFBD> <20>̻<EFBFBD> - <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>־<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.",
|
||||
dstStoreKey.first, dstStoreKey.second);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> â<><C3A2><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> â<><C3A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>!
|
||||
if (!lpSessionData->ChangeUnifiedStoreInfoGroup(
|
||||
dbComponent, cSelectedServerGroupID, cAgentServerType))
|
||||
{
|
||||
usError = PktUnifiedCharSelectAck::UNIFIED_STORE_READ_ERROR;
|
||||
}
|
||||
// <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
|
||||
else
|
||||
{
|
||||
if(0 == (lpStoreData = storeDataMgr.GetLogoutData(dstStoreKey)))
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / ServerGroupID:%d / <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : â<><C3A2> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
dwUID, cSelectedServerGroupID);
|
||||
|
||||
usError = PktUnifiedCharSelectAck::UNIFIED_STORE_READ_ERROR;
|
||||
}
|
||||
// â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Part2<74><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
else if (!lpStoreData->ConvertToPart2Item(true))
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / ServerGroupID:%d / <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : â<><C3A2> <20><>Ʈ2 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
dwUID, cSelectedServerGroupID);
|
||||
|
||||
usError = PktUnifiedCharSelectAck::UNIFIED_STORE_WRITE_ERROR;
|
||||
}
|
||||
// â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
else if(!lpStoreData->ForceUpdateDBAllData(dbComponent))
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / ServerGroupID:%d / <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD> â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
dwUID, cSelectedServerGroupID);
|
||||
|
||||
usError = PktUnifiedCharSelectAck::UNIFIED_STORE_WRITE_ERROR;
|
||||
}
|
||||
else if(!DBComponent::GameDB::UpdateUserFirstLogin(dbComponent, dwUID,
|
||||
lpSessionData->GetFirstLogin() | UnifiedConst::SELECTED_PART2))
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / ServerGroupID:%d / <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
dwUID, cSelectedServerGroupID);
|
||||
}
|
||||
|
||||
if(0 != usError)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>߱<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>,
|
||||
// <20>׳<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20>ȴ<EFBFBD>.
|
||||
storeDataMgr.RemoveLogoutData(dstStoreKey);
|
||||
|
||||
if(!lpSessionData->ChangeUnifiedStoreInfoGroup(
|
||||
dbComponent, cAgentServerType, cSelectedServerGroupID))
|
||||
{
|
||||
ERRLOG3(g_Log, "UID:%10u / ServerGroupID:%d -> %d / <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ѹ<EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
dwUID, cAgentServerType, cSelectedServerGroupID);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lpSessionData->SetFirstLogin(
|
||||
lpSessionData->GetFirstLogin() | UnifiedConst::SELECTED_PART2);
|
||||
|
||||
INFLOG2(g_Log, "UID:%10u / ServerGroupID:%d / <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
dwUID, cSelectedServerGroupID);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>.
|
||||
|
||||
// 1. ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>ϴ<EFBFBD> UserInfo<66><6F> <20>ε<EFBFBD><CEB5><EFBFBD> <20>Ŀ<EFBFBD>,
|
||||
// <20>ùٸ<C3B9> <20><><EFBFBD>Կ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ߺ<EFBFBD><DFBA><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> ã<>´<EFBFBD>.
|
||||
|
||||
// 2. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Part1 DB<44>߰輭<DFB0><E8BCAD><EFBFBD><EFBFBD>, <20>ش<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD><CEB5>ϰ<EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD> / <20><>Ƽ<EFBFBD><C6BC> Ż<><C5BB><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0><EFBFBD><EFBFBD> <20><>û<EFBFBD>Ѵ<EFBFBD>.
|
||||
|
||||
// 3. <20><>û <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD>, <20>ش<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> DB<44><42><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5>ϰ<EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>Ŀ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ѹ<EFBFBD><D1B9>Ѵ<EFBFBD>.
|
||||
|
||||
// 4. <20><><EFBFBD><EFBFBD> <20>۾<EFBFBD><DBBE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, DB<44><42> UserInfo<66><6F> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
|
||||
CClass::RaceType eRace =
|
||||
lpSessionData->CheckUnifiedCharRace(lpPktUnifiedCharSelectReq->dwCID);
|
||||
|
||||
USER_INFO userInfo = lpSessionData->GetUserInfo();
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD> <20>˻縦 <20>ѹ<EFBFBD> <20><> <20>Ѵ<EFBFBD>.
|
||||
unsigned long dwSelectedCID[USER_INFO::MAX_CHAR_NUM];
|
||||
unsigned long* lpdwRequestedCID = lpPktUnifiedCharSelectReq->dwCID;
|
||||
|
||||
int nSelectedCount = 0;
|
||||
|
||||
std::fill_n(dwSelectedCID, size_t(USER_INFO::MAX_CHAR_NUM), 0);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Դ<EFBFBD>.
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD> <20><> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD><C6B4><EFBFBD> <20>Ǵ<EFBFBD><C7B4>Ѵ<EFBFBD>.
|
||||
unsigned char cRestrictedPart1ToPart2Level =
|
||||
CServerSetup::GetInstance().GetRestrictedPart1ToPart2Level();
|
||||
|
||||
for(int nCount = 0; nCount < USER_INFO::MAX_CHAR_NUM; ++nCount)
|
||||
{
|
||||
unsigned long dwBindCID = lpdwRequestedCID[nCount];
|
||||
const UnifiedCharData* lpUnifiedCharData = 0;
|
||||
|
||||
if (0 == userInfo.CharID[nCount] &&
|
||||
0 != dwBindCID && !userInfo.HasCharacter(dwBindCID) &&
|
||||
0 != (lpUnifiedCharData = lpSessionData->GetUnifiedCharData(dwBindCID)) &&
|
||||
(lpUnifiedCharData->cOldServerGroupID < UnifiedConst::Part1 ||
|
||||
(lpUnifiedCharData->cOldServerGroupID == UnifiedConst::Part1Unified &&
|
||||
cRestrictedPart1ToPart2Level <= lpUnifiedCharData->cLevel)))
|
||||
{
|
||||
dwSelectedCID[nCount] = dwBindCID;
|
||||
++nSelectedCount;
|
||||
}
|
||||
}
|
||||
|
||||
if (0 < nSelectedCount && CClass::MAX_RACE == eRace)
|
||||
{
|
||||
usError = PktUnifiedCharSelectAck::PACKET_ERROR;
|
||||
}
|
||||
else if(0 == usError)
|
||||
{
|
||||
// <20>ѹ<EFBFBD><D1B9><EFBFBD> <20><><EFBFBD>鼭 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> / <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
CCharBackupItemData backupData[USER_INFO::MAX_CHAR_NUM];
|
||||
|
||||
for(int nCount = 0; nCount < USER_INFO::MAX_CHAR_NUM; ++nCount)
|
||||
{
|
||||
if(0 != dwSelectedCID[nCount])
|
||||
{
|
||||
if(0 == (lpCharacterData = charDataMgr.GetLogoutData(dwSelectedCID[nCount])))
|
||||
{
|
||||
ERRLOG3(g_Log, "UID:%10u / CID:%10u / ServerGroupID:%d / <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : ij<><C4B3><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
dwUID, dwSelectedCID[nCount], cSelectedServerGroupID);
|
||||
|
||||
usError = PktUnifiedCharSelectAck::UNIFIED_CHAR_READ_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
backupData[nCount].BackupData(*lpSessionData, *lpCharacterData);
|
||||
|
||||
// Part2 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
if (!lpCharacterData->ConvertToPart2Item(true))
|
||||
{
|
||||
ERRLOG3(g_Log, "UID:%10u / CID:%10u / ServerGroupID:%d / <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : ij<><C4B3><EFBFBD><EFBFBD> Part2<74><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
dwUID, dwSelectedCID[nCount], cSelectedServerGroupID);
|
||||
|
||||
usError = PktUnifiedCharSelectAck::UNIFIED_CHAR_WRITE_ERROR;
|
||||
}
|
||||
// UnifiedCharInfo<66><6F><EFBFBD><EFBFBD>, ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȣ<EFBFBD><C8A3> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
else if (!lpSessionData->ChangeUnifiedCharServerGroupID(
|
||||
dbComponent, dwUID, dwSelectedCID[nCount], cAgentServerType))
|
||||
{
|
||||
usError = PktUnifiedCharSelectAck::UNIFIED_CHAR_WRITE_ERROR;
|
||||
}
|
||||
else if (!lpCharacterData->ForceUpdateDBAllData(dbComponent))
|
||||
{
|
||||
ERRLOG3(g_Log, "UID:%10u / CID:%10u / ServerGroupID:%d / <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
dwUID, dwSelectedCID[nCount], cSelectedServerGroupID);
|
||||
|
||||
usError = PktUnifiedCharSelectAck::UNIFIED_CHAR_WRITE_ERROR;
|
||||
}
|
||||
|
||||
if(0 != usError)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٷ<EFBFBD> <20>ѹ<EFBFBD>;;
|
||||
break;
|
||||
}
|
||||
|
||||
// <20>籹ü<E7B1B9><C3BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //
|
||||
if(lpSessionData->GetAccountNation()==Creature::ALMIGHTY_PIRATE)
|
||||
{
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD≯鼭, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><DEB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ī<><C4AB><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>ٲ<EFBFBD><D9B2>ش<EFBFBD>. */
|
||||
if(lpCharacterData->GetRace()==CClass::HUMAN)
|
||||
{
|
||||
lpSessionData->SetAccountNation(Creature::KARTERANT);
|
||||
}
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD≯鼭, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ĭ<EFBFBD><C4AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD>ī<EFBFBD><C4AB><EFBFBD>Ʒ<EFBFBD> <20>ٲ<EFBFBD><D9B2>ش<EFBFBD>. */
|
||||
else if(lpCharacterData->GetRace()==CClass::AKHAN)
|
||||
{
|
||||
lpSessionData->SetAccountNation(Creature::MERKADIA);
|
||||
}
|
||||
}
|
||||
|
||||
// ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ, <20>ź<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> //
|
||||
/*unsigned long dwMemberCID[CFriendList::MAX_FRIENDS_NUM] = {0,};
|
||||
unsigned long dwDeleteCID[CFriendList::MAX_FRIENDS_NUM] = {0,};
|
||||
|
||||
// ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> CID <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>´<EFBFBD>. //
|
||||
CFriendList friendList = lpCharacterData->GetFriendList();
|
||||
|
||||
friendList.GetCIDList(dwMemberCID);
|
||||
|
||||
for(unsigned char cIndex = 0; cIndex < friendList.GetFriendNum(); cIndex++)
|
||||
{
|
||||
CFriendList::Rebind* lpRebind = friendList.GetFriend(dwMemberCID[cIndex]);
|
||||
|
||||
if(lpCharacterData->GetRace()==CClass::HUMAN)
|
||||
{
|
||||
if(lpRebind->GetClass()>=CClass::Combatant)
|
||||
{
|
||||
dwDeleteCID[cIndex] = dwMemberCID[cIndex];
|
||||
}
|
||||
}
|
||||
else if(lpCharacterData->GetRace()==CClass::AKHAN)
|
||||
{
|
||||
if(lpRebind->GetClass()<CClass::Combatant)
|
||||
{
|
||||
dwDeleteCID[cIndex] = dwMemberCID[cIndex];
|
||||
}
|
||||
}
|
||||
|
||||
// <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //
|
||||
if(dwDeleteCID[cIndex])
|
||||
{
|
||||
friendList.Remove(dwDeleteCID[cIndex]);
|
||||
}
|
||||
}
|
||||
|
||||
memset(dwMemberCID, 0, sizeof(unsigned long) * CFriendList::MAX_FRIENDS_NUM);
|
||||
memset(dwDeleteCID, 0, sizeof(unsigned long) * CFriendList::MAX_FRIENDS_NUM);
|
||||
|
||||
CBanList banList = lpCharacterData->GetBanList();
|
||||
|
||||
banList.GetCIDList(dwMemberCID);
|
||||
|
||||
for(unsigned char cIndex = 0; cIndex < banList.GetBanNum(); cIndex++)
|
||||
{
|
||||
CBanList::Rebind* lpRebind = banList.GetBan(dwMemberCID[cIndex]);
|
||||
|
||||
if(lpCharacterData->GetRace()==CClass::HUMAN)
|
||||
{
|
||||
if(lpRebind->GetClass()>=CClass::Combatant)
|
||||
{
|
||||
dwDeleteCID[cIndex] = dwMemberCID[cIndex];
|
||||
}
|
||||
}
|
||||
else if(lpCharacterData->GetRace()==CClass::AKHAN)
|
||||
{
|
||||
if(lpRebind->GetClass()<CClass::Combatant)
|
||||
{
|
||||
dwDeleteCID[cIndex] = dwMemberCID[cIndex];
|
||||
}
|
||||
}
|
||||
|
||||
// <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //
|
||||
if(dwDeleteCID[cIndex])
|
||||
{
|
||||
banList.Remove(dwDeleteCID[cIndex]);
|
||||
}
|
||||
}*/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD><CEB5>Ѵ<EFBFBD>.
|
||||
if(0 == usError)
|
||||
{
|
||||
// <20><><EFBFBD>õ<EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>Ѹ<EFBFBD><D1B8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
if(0 == userInfo.GetCharacterNum())
|
||||
{
|
||||
unsigned char cOldAccountNation = lpSessionData->GetAccountNation();
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>´<EFBFBD><C2B4><EFBFBD> üũ<C3BC><C5A9> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
if(Creature::ALMIGHTY_PIRATE == cSelectedNation)
|
||||
{
|
||||
lpSessionData->SetAccountNation(Creature::ALMIGHTY_PIRATE);
|
||||
}
|
||||
else
|
||||
{
|
||||
lpSessionData->SetAccountNation(
|
||||
CClass::HUMAN == eRace ? Creature::KARTERANT : Creature::MERKADIA);
|
||||
}
|
||||
|
||||
if (cOldAccountNation != lpSessionData->GetAccountNation())
|
||||
{
|
||||
INFLOG3(g_Log, "UID:%10u / OldAccountNation:%s / AccountNation:%s / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
dwUID, Creature::GetShortNationName(cOldAccountNation),
|
||||
Creature::GetShortNationName(lpSessionData->GetAccountNation()));
|
||||
}
|
||||
}
|
||||
|
||||
if(!lpSessionData->UpdateCharacterBinding(dbComponent, dwSelectedCID))
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / ServerGroupID:%d / <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>",
|
||||
dwUID, cSelectedServerGroupID);
|
||||
|
||||
usError = PktUnifiedCharSelectAck::UNIFIED_CHAR_WRITE_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
// â<><C3A2>/ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD>!
|
||||
lpSessionData->SetOldServerGroupID(cAgentServerType);
|
||||
}
|
||||
}
|
||||
|
||||
if(0 != usError)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Rollback<63>Ѵ<EFBFBD>.
|
||||
for(int nCount = 0; nCount < USER_INFO::MAX_CHAR_NUM; ++nCount)
|
||||
{
|
||||
if(0 != dwSelectedCID[nCount] && backupData[nCount].IsBackupedData())
|
||||
{
|
||||
if(0 == (lpCharacterData = charDataMgr.GetLogoutData(dwSelectedCID[nCount])))
|
||||
{
|
||||
ERRLOG3(g_Log, "UID:%10u / CID:%10u / ServerGroupID:%d / <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : ij<><C4B3><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
dwUID, dwSelectedCID[nCount], cSelectedServerGroupID);
|
||||
}
|
||||
else
|
||||
{
|
||||
backupData[nCount].RestoreData(*lpCharacterData);
|
||||
|
||||
lpCharacterData->ForceUpdateDBAllData(dbComponent);
|
||||
lpSessionData->ChangeUnifiedCharServerGroupID(dbComponent,
|
||||
dwUID, dwSelectedCID[nCount], backupData[nCount].GetOldServerGroupID());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GET_SINGLE_DISPATCH(lpAuthDispatch, CAuthDispatch,
|
||||
CAuthDispatch::GetDispatchTable());
|
||||
|
||||
if(0 != lpAuthDispatch && SendPacket::UnifiedCharSelectAck(
|
||||
lpAuthDispatch->GetSendStream(), dwUID, dwRequestKey, usError))
|
||||
{
|
||||
if(0 == usError)
|
||||
{
|
||||
INFLOG2(g_Log, "UID:%10u / ServerGroupID:%d / ij<><C4B3><EFBFBD><EFBFBD> <20><> â<><C3A2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
dwUID, cSelectedServerGroupID);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / ServerGroupID:%d / ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : "
|
||||
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD> <20><><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.", dwUID, cSelectedServerGroupID);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
#ifndef _DBAGENT_SERVER_PART1_DBAGENT_DISPATCH_H_
|
||||
#define _DBAGENT_SERVER_PART1_DBAGENT_DISPATCH_H_
|
||||
|
||||
#include <Network/Dispatch/RylServerDispatch.h>
|
||||
#include <Network/Dispatch/SingleDispatchStorage.h>
|
||||
#include <Community/FriendList.h>
|
||||
#include <Community/BanList.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
// Part1 DBAgent<6E><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
|
||||
class CPart1DBAgentDispatch : public CRylServerDispatch
|
||||
{
|
||||
public:
|
||||
|
||||
static CSingleDispatch& GetDispatchTable();
|
||||
|
||||
enum Const
|
||||
{
|
||||
MAX_PACKET_DISPATCH_PER_PULSE = 100,
|
||||
MAX_STREAM_BUFFER_SIZE = 16000
|
||||
};
|
||||
|
||||
CPart1DBAgentDispatch(CSession& Session);
|
||||
virtual ~CPart1DBAgentDispatch();
|
||||
|
||||
virtual void Connected();
|
||||
virtual void Disconnected();
|
||||
virtual bool DispatchPacket(PktBase* lpPktBase);
|
||||
|
||||
static bool TransferCharPart1ToPart2(CSendStream& SendStream, unsigned long dwUID,
|
||||
unsigned char cSelectedServerGroup, unsigned char cSelectedNation,
|
||||
unsigned long* lpdwSelectedCID, unsigned char cSelectedCharNum);
|
||||
|
||||
private:
|
||||
|
||||
};
|
||||
|
||||
typedef std::map<unsigned short, unsigned short> QuestDelete;
|
||||
typedef std::map<unsigned short, unsigned short> QuestChange;
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,731 @@
|
||||
#include "stdafx.h"
|
||||
#include "UIDDispatch.h"
|
||||
|
||||
#include "AuthDispatch.h"
|
||||
#include "GameDispatch.h"
|
||||
#include "ChatDispatch.h"
|
||||
|
||||
#include <DB/DBComponent.h>
|
||||
#include <DB/GameDBComponent.h>
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
#include <Network/Address/INET_Addr.h>
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
#include <Network/Packet/PacketStruct/ServerInfo.h>
|
||||
#include <Network/Packet/PacketStruct/ServerPacket.h>
|
||||
#include <Network/Packet/PacketStruct/CharLoginOutPacket.h>
|
||||
#include <Network/Packet/PacketStruct/CharLoginOutPacketStruct.h>
|
||||
#include <Network/SendPacket/SendServerInfo.h>
|
||||
#include <Network/SendPacket/SendLoginout.h>
|
||||
#include <Network/SendPacket/SendCharManage.h>
|
||||
|
||||
#include <DataStorage/Billing.h>
|
||||
#include <DataStorage/SessionData.h>
|
||||
#include <DataStorage/SessionDataMgr.h>
|
||||
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
|
||||
const char* g_szPktUUTString[PktUUT::MAX_UPDATE_TYPE] =
|
||||
{
|
||||
"UpdateUIDTableNone",
|
||||
"UpdateUIDTableUserLogin",
|
||||
"UpdateUIDTableUserLogout",
|
||||
"UpdateUIDTableUserMove",
|
||||
"UpdateUIDTableCharLogin",
|
||||
"UpdateUIDTableCharLogout",
|
||||
"UpdateUIDTableCharMove",
|
||||
"UpdateUIDTableBillingCheck",
|
||||
};
|
||||
|
||||
|
||||
|
||||
// UpdateUIDTableó<65><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
|
||||
// <20><><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ڿ<EFBFBD><DABF>̴<EFBFBD>. NULL<4C≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
||||
const char* ProcessUpdateTableUserLogin(DataStorage::CSessionData& sessionData,
|
||||
DataStorage::RequestData& requestData,
|
||||
unsigned long dwFlag, int nPlayTime,
|
||||
unsigned long dwCRMIndex1,
|
||||
unsigned char cCmd, char cBillingType,
|
||||
unsigned short usUUKAckError);
|
||||
|
||||
// UpdateUIDTableó<65><C3B3><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
|
||||
// <20><><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ڿ<EFBFBD><DABF>̴<EFBFBD>. NULL<4C≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
||||
const char* ProcessUpdateTableCharLogin(DataStorage::CSessionData& sessionData,
|
||||
DataStorage::RequestData& requestData,
|
||||
unsigned long dwFlag, int nPlayTime,
|
||||
unsigned long dwCRMIndex1,
|
||||
unsigned char cCmd, char cBillingType);
|
||||
|
||||
CSingleDispatch& CUIDDispatch::GetDispatchTable()
|
||||
{
|
||||
static CSingleDispatch uidDispatch;
|
||||
return uidDispatch;
|
||||
}
|
||||
|
||||
CUIDDispatch::CUIDDispatch(CSession& Session)
|
||||
: CRylServerDispatch(Session, MAX_PACKET_DISPATCH_PER_PULSE)
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
CUIDDispatch::~CUIDDispatch()
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
void CUIDDispatch::Connected()
|
||||
{
|
||||
DETLOG3(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/UIDServer Connected",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string());
|
||||
|
||||
GetDispatchTable().SetDispatch(this);
|
||||
|
||||
SendPacket::ServerLogin(GetSendStream(),
|
||||
CServerSetup::GetInstance().GetServerID());
|
||||
}
|
||||
|
||||
void CUIDDispatch::Disconnected()
|
||||
{
|
||||
DETLOG3(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/UIDServer Disconnected",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string());
|
||||
|
||||
GetDispatchTable().RemoveDispatch(this);
|
||||
}
|
||||
|
||||
bool CUIDDispatch::DispatchPacket(PktBase* lpPktBase)
|
||||
{
|
||||
PktBase::CMDType cCmd = lpPktBase->GetCmd();
|
||||
|
||||
bool bResult = false;
|
||||
|
||||
switch(cCmd)
|
||||
{
|
||||
case CmdSysServerLogout: bResult = ParseServerLogoutAck(lpPktBase); break;
|
||||
case CmdUserKill: bResult = ParseUserKill(static_cast<PktUK*>(lpPktBase)); break;
|
||||
case CmdBillingTimeoutNotify: bResult = ParseBillingTimeNotify(static_cast<PktBTN*>(lpPktBase)); break;
|
||||
case CmdBillingTimeCheckNotify: bResult = ParseBillingTimeCheckNotify(static_cast<PktBTN*>(lpPktBase)); break;
|
||||
case CmdHanBTNWarning: bResult = ParseHanBTNWarning(static_cast<PktHanBTN*>(lpPktBase)); break;
|
||||
case CmdHanBTNUserKill: bResult = ParseHanBTNUserKill(static_cast<PktHanUserKill*>(lpPktBase)); break;
|
||||
case CmdUpdateUIDTable: bResult = ParseUpdateUIDTable(static_cast<PktUUTAck*>(lpPktBase)); break;
|
||||
|
||||
default:
|
||||
|
||||
ERRLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/Cmd:0x%02X/ UID<49><44><EFBFBD><EFBFBD> <20><>Ŷ ó<><C3B3> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> Ŀ<>ǵ<EFBFBD><C7B5>Դϴ<D4B4>",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string(), cCmd);
|
||||
|
||||
bResult = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if(!bResult)
|
||||
{
|
||||
ERRLOG4(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/Cmd:0x%02X/ UID<49><44><EFBFBD><EFBFBD> <20><>Ŷ ó<><C3B3> <20><><EFBFBD><EFBFBD> : ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string(), cCmd);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool CUIDDispatch::ParseServerLogoutAck(PktBase* lpPktBase)
|
||||
{
|
||||
INFLOG3(g_Log, "SS:0x%08x/DP:0x%08x/IP:%15s/Cmd:0x%02X/ UID<49><44><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> <20>αƿ<D7BE> <20><>Ŷ<EFBFBD><C5B6> <20>ҽ<DEBE><D2BD>ϴ<EFBFBD>.",
|
||||
&GetSession(), this, GetRemoteAddr().get_addr_string());
|
||||
|
||||
CloseSession();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool CUIDDispatch::ParseUpdateUIDTable(PktUUTAck* lpPktUUTAck)
|
||||
{
|
||||
// edith 2008.01.15 UID<49><44><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> UpdateUIDTable <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD>ƾ
|
||||
|
||||
using namespace DBAgent::DataStorage;
|
||||
|
||||
unsigned char cCmd = lpPktUUTAck->m_cCmd;
|
||||
unsigned long dwUID = lpPktUUTAck->m_dwUserID;
|
||||
unsigned long dwFlag = lpPktUUTAck->m_dwFlag;
|
||||
int nPlayTime = lpPktUUTAck->m_nPlayTime;
|
||||
unsigned long dwCRMIndex1 = lpPktUUTAck->m_dwCRMIndex1; // <20>ǽù<C7BD> ID (0<≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
char cBillingType = lpPktUUTAck->m_cstrBillingType;
|
||||
|
||||
CBilling::WarningType eOldWarnMsgType = CBilling::WARN_BEFORE_1SEC;
|
||||
CBilling::WarningType eNewWarnMsgType = static_cast<CBilling::WarningType>(lpPktUUTAck->GetState());
|
||||
|
||||
const char* szErrorReason = 0;
|
||||
|
||||
RequestData requestData;
|
||||
memset(&requestData, 0, sizeof(RequestData));
|
||||
|
||||
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession(dwUID);
|
||||
|
||||
if(PktUUT::MAX_UPDATE_TYPE <= cCmd)
|
||||
{
|
||||
szErrorReason = "<EFBFBD>α<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - <20><> <20><> <20><><EFBFBD><EFBFBD> Ŀ<>ǵ<EFBFBD><C7B5>Դϴ<D4B4>";
|
||||
}
|
||||
else if(0 == lpSessionData)
|
||||
{
|
||||
szErrorReason = "<EFBFBD>α<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>";
|
||||
}
|
||||
else
|
||||
{
|
||||
switch(cCmd)
|
||||
{
|
||||
case PktUUT::UpdateUIDTableUserLogin:
|
||||
|
||||
requestData = lpSessionData->PopRequest();
|
||||
|
||||
if(0 == requestData.m_dwRequestKey)
|
||||
{
|
||||
szErrorReason = "<EFBFBD>α<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - RequestKey<65><79> <20>̻<EFBFBD><CCBB>մϴ<D5B4>";
|
||||
}
|
||||
else
|
||||
{
|
||||
szErrorReason = ProcessUpdateTableUserLogin(*lpSessionData, requestData, dwFlag,
|
||||
nPlayTime, dwCRMIndex1, cCmd, cBillingType, lpPktUUTAck->GetError());
|
||||
|
||||
eOldWarnMsgType = lpSessionData->GetBilling().GetWarnMsgType();
|
||||
lpSessionData->GetBilling().SetWarnMsgType(eNewWarnMsgType);
|
||||
|
||||
if(CBilling::WARN_EVERY_MINUTE == eNewWarnMsgType)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>·<EFBFBD> <20><><EFBFBD><EFBFBD>. <20>źи<C5BA><D0B8><EFBFBD> <20><EFBFBD><DEBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
|
||||
SendPacket::BillingCheckNotify(*lpSessionData, 5, cBillingType);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case PktUUT::UpdateUIDTableCharLogin:
|
||||
|
||||
requestData = lpSessionData->PopRequest();
|
||||
|
||||
if(0 == requestData.m_dwRequestKey)
|
||||
{
|
||||
szErrorReason = "<EFBFBD>α<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - RequestKey<65><79> <20>̻<EFBFBD><CCBB>մϴ<D5B4>";
|
||||
}
|
||||
else
|
||||
{
|
||||
szErrorReason = ProcessUpdateTableCharLogin(*lpSessionData, requestData,
|
||||
dwFlag, nPlayTime, dwCRMIndex1, cCmd, cBillingType);
|
||||
}
|
||||
break;
|
||||
|
||||
case PktUUT::UpdateUIDTableBillingCheck:
|
||||
|
||||
eOldWarnMsgType = lpSessionData->GetBilling().GetWarnMsgType();
|
||||
|
||||
if(0 == dwFlag)
|
||||
{
|
||||
lpSessionData->GetBilling().SetWarnMsgType(eNewWarnMsgType);
|
||||
|
||||
if (CBilling::NO_WARNING == eOldWarnMsgType &&
|
||||
CBilling::WARN_EVERY_MINUTE == eNewWarnMsgType)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>·<EFBFBD> <20><><EFBFBD><EFBFBD>. <20>źи<C5BA><D0B8><EFBFBD> <20><EFBFBD><DEBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
|
||||
SendPacket::BillingCheckNotify(*lpSessionData, 5, cBillingType);
|
||||
}
|
||||
else
|
||||
if (CBilling::WARN_EVERY_MINUTE == eOldWarnMsgType &&
|
||||
CBilling::NO_WARNING == eNewWarnMsgType)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>·<EFBFBD> <20><><EFBFBD><EFBFBD>. <20><EFBFBD><DEBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
|
||||
SendPacket::BillingCheckNotify(*lpSessionData, 20, cBillingType);
|
||||
}
|
||||
}
|
||||
|
||||
lpSessionData->GetBilling().AddYouxiLandPoint(nPlayTime, cBillingType);
|
||||
|
||||
DETLOG4(g_Log, "UID:%10u / CID:%10u / nPlayTime:%d / cBillingType:%c / UpdateUIDTableBillingCheck <20><><EFBFBD><EFBFBD>",
|
||||
lpSessionData->GetUID(), lpSessionData->GetCID(), nPlayTime, cBillingType);
|
||||
|
||||
if (0 != dwFlag)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> ų ó<><C3B3> - Ư<><C6AF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>. <20><><EFBFBD>߿<EFBFBD> <20><><EFBFBD><EFBFBD>üũ<C3BC><C5A9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̴<EFBFBD>.
|
||||
// KillUser(lpDataSession);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(0 != szErrorReason)
|
||||
{
|
||||
ERRLOG10(g_Log, "UID:%10u / Cmd:%s / Flag:%u / PlayTime:%d / CRMIndex:%u / BillingType:%c / "
|
||||
" RequestKey:%10u / SelectedCID:%10u / ServerID:0x%08X / ParseUIDTable <20><><EFBFBD><EFBFBD> : %s",
|
||||
dwUID, g_szPktUUTString[cCmd], dwFlag, nPlayTime, dwCRMIndex1, cBillingType,
|
||||
requestData.m_dwRequestKey, requestData.m_dwSelectedCID,
|
||||
requestData.m_dwServerID, szErrorReason);
|
||||
|
||||
if(0 == dwFlag)
|
||||
{
|
||||
PktUUT::UpdateType eUpdateType = PktUUT::UpdateUIDTableNone;
|
||||
|
||||
switch(cCmd)
|
||||
{
|
||||
case PktUUT::UpdateUIDTableUserLogin:
|
||||
eUpdateType = PktUUT::UpdateUIDTableUserLogout;
|
||||
break;
|
||||
|
||||
case PktUUT::UpdateUIDTableCharLogin:
|
||||
eUpdateType = PktUUT::UpdateUIDTableCharLogout;
|
||||
break;
|
||||
}
|
||||
|
||||
// edith 2008.01.15 UID<49><44> <20>α<EFBFBD><CEB1><EFBFBD> <20><EFBFBD><DEBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
if(0 == lpSessionData)
|
||||
{
|
||||
ERRLOG1(g_Log, "UID:%10u / UID<49><44><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.", dwUID);
|
||||
}
|
||||
else if(eUpdateType != PktUUT::UpdateUIDTableNone &&
|
||||
!SendPacket::UpdateUIDTable(eUpdateType, requestData.m_szAccount, requestData.m_szPassword,
|
||||
dwUID, requestData.m_dwSelectedCID, requestData.m_dwSessionID,
|
||||
requestData.m_dwServerID, requestData.m_PeerAddress))
|
||||
{
|
||||
ERRLOG1(g_Log, "UID:%10u / UID<49><44><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.", dwUID);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
const char* ProcessUpdateTableUserLogin(DataStorage::CSessionData& sessionData,
|
||||
DataStorage::RequestData& requestData,
|
||||
unsigned long dwFlag, int nPlayTime, unsigned long dwCRMIndex1,
|
||||
unsigned char cCmd, char cBillingType, unsigned short usUUKAckError)
|
||||
{
|
||||
// edith 2008.01.15 UpdateTableUserLogin<69><6E> <20><><EFBFBD>õ<EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
const char* szErrorReason = 0;
|
||||
unsigned long dwUID = sessionData.GetUID();
|
||||
|
||||
GET_SINGLE_DISPATCH(lpAuthDispatch,
|
||||
CAuthDispatch, CAuthDispatch::GetDispatchTable());
|
||||
|
||||
if(0 == lpAuthDispatch)
|
||||
{
|
||||
szErrorReason = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>";
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned short usError = 1; // Default : Server Error(Unknown Error)
|
||||
|
||||
if (0 == dwFlag)
|
||||
{
|
||||
// <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
|
||||
unsigned char cAgentServerType = static_cast<unsigned char>(
|
||||
CServerSetup::GetInstance().GetAgentServerType());
|
||||
|
||||
unsigned char cFirstLogin = 0;
|
||||
|
||||
switch(cAgentServerType)
|
||||
{
|
||||
case UnifiedConst::Part1:
|
||||
case UnifiedConst::Part1Unified:
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߸<EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD>߿<EFBFBD> UserLogin
|
||||
szErrorReason = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD> <20>߸<EFBFBD> <20><><EFBFBD><EFBFBD>";
|
||||
break;
|
||||
|
||||
case UnifiedConst::ROW:
|
||||
sessionData.SetOldServerGroupID(UnifiedConst::ROW);
|
||||
break;
|
||||
|
||||
case UnifiedConst::Part2Unified:
|
||||
case UnifiedConst::Part2Selectable:
|
||||
|
||||
if(!sessionData.GetUnifiedDataFromDB(CDBSingleObject::GetInstance()))
|
||||
{
|
||||
szErrorReason = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> - <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>";
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
cFirstLogin = sessionData.GetFirstLogin();
|
||||
|
||||
if(0 != szErrorReason)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>. UserLogin<69><6E> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
}
|
||||
else if(!sessionData.UserEnable(CDBSingleObject::GetInstance(), dwUID))
|
||||
{
|
||||
szErrorReason = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD> Ȱ<><C8B0>ȭ <20><><EFBFBD><EFBFBD>";
|
||||
}
|
||||
else if(!SendPacket::StartSession(lpAuthDispatch->GetSendStream(),
|
||||
requestData.m_dwRequestKey, dwUID, requestData.m_dwSessionID, cFirstLogin, 0))
|
||||
{
|
||||
szErrorReason = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>";
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> <20>Ѱ<EFBFBD><D1B0><EFBFBD> <20><><EFBFBD>ݰ<EFBFBD> <20><><EFBFBD>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD>ݸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>).
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ǥ<>ø<EFBFBD> <20><><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
sessionData.GetBilling().StartBilling(nPlayTime, dwCRMIndex1, cBillingType);
|
||||
|
||||
// edith 2008.01.15 <20>α<EFBFBD><CEB1>ο<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
// <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ID<49><44><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
sessionData.SetRequestData(requestData);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
usError = 0;
|
||||
|
||||
// StartSession<6F><6E> <20><EFBFBD><DEBE><EFBFBD> <20><>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<>̰<EFBFBD>, <20>߰輭<DFB0><E8BCAD> Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD≯<EFBFBD>,
|
||||
// <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ٸ<EFBFBD><D9B8>Ƿ<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>⼭ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD>.
|
||||
|
||||
switch(cAgentServerType)
|
||||
{
|
||||
case UnifiedConst::Part2Unified:
|
||||
case UnifiedConst::Part2Selectable:
|
||||
|
||||
// <20>ű<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD><C6B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD>. <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ְ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˾Ƽ<CBBE> <20>׳<EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
||||
if (!SendPacket::UnifiedCharInfo(lpAuthDispatch->GetSendStream(),
|
||||
dwUID, sessionData.GetTransferedCharCount(CDBSingleObject::GetInstance()),
|
||||
sessionData.GetUserInfo(),
|
||||
sessionData.GetUnifiedStoreInfo(), sessionData.GetUnifiedStoreInfoNum(),
|
||||
sessionData.GetUnifiedCharData(), sessionData.GetUnifiedCharDataNum()))
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ϴ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>;; <20>˾Ƽ<CBBE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ٸ<EFBFBD><D9B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;;
|
||||
ERRLOG1(g_Log, "UID:%10u / <20><><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> - <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", dwUID);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (1 == dwFlag)
|
||||
{
|
||||
switch(usUUKAckError)
|
||||
{
|
||||
default:
|
||||
usError = 41; // <20>ߺ<EFBFBD><DFBA>α<EFBFBD><CEB1><EFBFBD>
|
||||
break;
|
||||
|
||||
case PktUUT::DISCONNECT_USER:
|
||||
usError = 42; // Disconnect<63><74> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>õ<EFBFBD><C3B5><EFBFBD> <20><>..
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (2 == dwFlag) { usError = 24; } // <20><><EFBFBD><EFBFBD>,<2C>ǽù<C7BD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28>Ѱ<EFBFBD><D1B0><EFBFBD>)
|
||||
else if (4 == dwFlag) { usError = 1; } // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (DB Query <20><><EFBFBD><EFBFBD>)
|
||||
else if (11 == dwFlag || 13 == dwFlag || 19 == dwFlag)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD>,<2C>ǽù<C7BD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28>븸)
|
||||
usError = 24;
|
||||
}
|
||||
else if (20 == dwFlag) { usError = 40; } // <20>븸, <20>Ϻ<EFBFBD> <20>ߺ<EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
// edith 2009.09.11 MY<4D><59> <20><><EFBFBD><EFBFBD> AllowIP ó<><C3B3><EFBFBD>۾<EFBFBD>
|
||||
else if (57 == dwFlag) { usError = 57; } // ROW<4F><57><EFBFBD><EFBFBD> AllowIP <20><><EFBFBD><EFBFBD> <20>ɸ<EFBFBD>
|
||||
else if (100 >= dwFlag) { usError = (unsigned short)(dwFlag-100); }; // <20><><EFBFBD><EFBFBD><EFBFBD>Ͼ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
if(0 != usError)
|
||||
{
|
||||
SendPacket::StartSession(lpAuthDispatch->GetSendStream(),
|
||||
requestData.m_dwRequestKey, dwUID, sessionData.GetSessionID(), 0, usError);
|
||||
}
|
||||
}
|
||||
|
||||
return szErrorReason;
|
||||
}
|
||||
|
||||
|
||||
|
||||
const char* ProcessUpdateTableCharLogin(DataStorage::CSessionData& sessionData,
|
||||
DataStorage::RequestData& requestData,
|
||||
unsigned long dwFlag, int nPlayTime,
|
||||
unsigned long dwCRMIndex1,
|
||||
unsigned char cCmd, char cBillingType)
|
||||
{
|
||||
const char* szErrorReason = 0;
|
||||
unsigned long dwUID = sessionData.GetUID();
|
||||
|
||||
GET_MULTI_DISPATCH(lpGameDispatch, requestData.m_dwServerID,
|
||||
CGameDispatch, CGameDispatch::GetDispatchTable());
|
||||
|
||||
if(0 == lpGameDispatch)
|
||||
{
|
||||
szErrorReason = "ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> - <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>";
|
||||
}
|
||||
else if(!sessionData.HasCharacter(requestData.m_dwSelectedCID))
|
||||
{
|
||||
szErrorReason = "ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> Ȱ<><C8B0>ȭ";
|
||||
|
||||
const USER_INFO& userInfo = sessionData.GetUserInfo();
|
||||
|
||||
// WORK_LIST 2.1 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD>
|
||||
SERLOG9(g_Log, "UID:%10u / SelectedCID:%10u / Char1:%10u / Char2:%10u / Char3:%10u / Char4:%10u / Char5:%10u / Nation:%d %s",
|
||||
dwUID, requestData.m_dwSelectedCID,
|
||||
userInfo.CharID[0], userInfo.CharID[1], userInfo.CharID[2],
|
||||
userInfo.CharID[3], userInfo.CharID[4], userInfo.Nation, szErrorReason);
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20>⺻<EFBFBD><E2BABB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
unsigned short usError = 1;
|
||||
|
||||
if (0 == dwFlag)
|
||||
{
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> Ȱ<><C8B0>ȭ
|
||||
if (!sessionData.CharEnable(requestData.m_dwSelectedCID, requestData.m_dwServerID))
|
||||
{
|
||||
szErrorReason = "ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD> Ȱ<><C8B0>ȭ <20><><EFBFBD><EFBFBD>";
|
||||
}
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
else if (!SendPacket::CharLogin(lpGameDispatch->GetSendStream(),
|
||||
sessionData, requestData.m_dwRequestKey))
|
||||
{
|
||||
szErrorReason = "ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> - ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>";
|
||||
|
||||
// Ȱ<><C8B0>ȭ<EFBFBD><C8AD> ij<><C4B3><EFBFBD><EFBFBD> Disable<6C><65>.
|
||||
sessionData.CharDisable(requestData.m_dwSelectedCID, requestData.m_dwServerID);
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
switch(CServerSetup::GetInstance().GetBillingType())
|
||||
{
|
||||
case CServerSetup::GamaBilling:
|
||||
case CServerSetup::GamaUnitedBilling:
|
||||
sessionData.GetBilling().StartBilling(nPlayTime, dwCRMIndex1, cBillingType);
|
||||
break;
|
||||
}
|
||||
|
||||
// <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ID<49><44><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
sessionData.SetRequestData(requestData);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>!
|
||||
usError = 0;
|
||||
}
|
||||
}
|
||||
else if (1 == dwFlag) { usError = 41; } // <20>ߺ<EFBFBD><DFBA>α<EFBFBD><CEB1><EFBFBD>
|
||||
else if (2 == dwFlag) { usError = 24; } // <20><><EFBFBD><EFBFBD>,<2C>ǽù<C7BD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
else if (4 == dwFlag) { usError = 1; } // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (DB Query <20><><EFBFBD><EFBFBD>)
|
||||
else if (11 == dwFlag || 13 == dwFlag || 19 == dwFlag)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD>,<2C>ǽù<C7BD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28>븸)
|
||||
usError = 24;
|
||||
}
|
||||
else if (20 == dwFlag) { usError = 40; } // <20>븸, <20>Ϻ<EFBFBD> <20>ߺ<EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
// edith 2009.09.11 MY<4D><59> <20><><EFBFBD><EFBFBD> AllowIP ó<><C3B3><EFBFBD>۾<EFBFBD>
|
||||
else if (57 == dwFlag) { usError = 57; } // ROW<4F><57><EFBFBD><EFBFBD> AllowIP <20><><EFBFBD><EFBFBD> <20>ɸ<EFBFBD>
|
||||
else if (100 >= dwFlag) { usError = (unsigned short)(dwFlag-100); }; // <20><><EFBFBD><EFBFBD><EFBFBD>Ͼ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
if (0 != usError)
|
||||
{
|
||||
SendPacket::CharLoginError(lpGameDispatch->GetSendStream(),
|
||||
requestData.m_dwRequestKey, DBUpdateData::LOGIN,
|
||||
dwUID, requestData.m_dwSelectedCID, usError);
|
||||
}
|
||||
}
|
||||
|
||||
return szErrorReason;
|
||||
}
|
||||
|
||||
|
||||
bool CUIDDispatch::ParseBillingTimeNotify(PktBTN* lpPktBTN)
|
||||
{
|
||||
using namespace DataStorage;
|
||||
|
||||
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession(lpPktBTN->m_dwUserID);
|
||||
if(0 == lpSessionData)
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / cRemainMin:%u / <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>",
|
||||
lpPktBTN->m_dwUserID, lpPktBTN->m_cRemainMinute);
|
||||
}
|
||||
else if(CSessionData::SE_CHAR_ENABLED != lpSessionData->GetSessionState())
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / ST:%s / <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><>Ȱ<EFBFBD><C8B0>ȭ<EFBFBD>Ǿ<EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>",
|
||||
lpPktBTN->m_dwUserID, g_szSessionStateString[lpSessionData->GetSessionState()]);
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20>ð<EFBFBD><C3B0><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
if(!SendPacket::BillingNotify(*lpSessionData,
|
||||
lpPktBTN->m_cRemainMinute, lpPktBTN->m_cBillingType))
|
||||
{
|
||||
INFLOG4(g_Log, "UID:%10u / ServerID:0x%08X / cRemainMin:%u / cBillingType:%c / <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
lpPktBTN->m_dwUserID, lpSessionData->GetServerID(), lpPktBTN->m_cRemainMinute, lpPktBTN->m_cBillingType);
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / ServerID:0x%08X / <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>",
|
||||
lpPktBTN->m_dwUserID, lpSessionData->GetServerID());
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CUIDDispatch::ParseBillingTimeCheckNotify(PktBTN* lpPktBTN)
|
||||
{
|
||||
using namespace DataStorage;
|
||||
|
||||
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession(lpPktBTN->m_dwUserID);
|
||||
if(0 == lpSessionData)
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / cRemainMin:%u / <20>ð<EFBFBD> <20>ٽ<EFBFBD> üũ(<28>븸) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>",
|
||||
lpPktBTN->m_dwUserID, lpPktBTN->m_cRemainMinute);
|
||||
}
|
||||
else if(CSessionData::SE_CHAR_ENABLED != lpSessionData->GetSessionState())
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / ST:%s / <20>ð<EFBFBD> <20>ٽ<EFBFBD> üũ(<28>븸) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><>Ȱ<EFBFBD><C8B0>ȭ<EFBFBD>Ǿ<EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>",
|
||||
lpPktBTN->m_dwUserID, g_szSessionStateString[lpSessionData->GetSessionState()]);
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20>ð<EFBFBD><C3B0><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
if(!SendPacket::BillingCheckNotify(*lpSessionData,
|
||||
lpPktBTN->m_cRemainMinute, lpPktBTN->m_cBillingType))
|
||||
{
|
||||
INFLOG4(g_Log, "UID:%10u / ServerID:0x%08X / cRemainMin:%u / cBillingType:%c / <20>ð<EFBFBD> <20>ٽ<EFBFBD> üũ(<28>븸) <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
lpPktBTN->m_dwUserID, lpSessionData->GetServerID(), lpPktBTN->m_cRemainMinute, lpPktBTN->m_cBillingType);
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / ServerID:0x%08X / <20>ð<EFBFBD> <20>ٽ<EFBFBD> üũ <20><><EFBFBD><EFBFBD>(<28>븸)<29><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>",
|
||||
lpPktBTN->m_dwUserID, lpSessionData->GetServerID());
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool CUIDDispatch::ParseHanBTNWarning(PktHanBTN* lpPktHanBTN)
|
||||
{
|
||||
// ä<>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><DEBD><EFBFBD><EFBFBD><EFBFBD> Relay<61>Ѵ<EFBFBD>.
|
||||
using namespace DataStorage;
|
||||
|
||||
IN_ADDR peerAddress;
|
||||
peerAddress.S_un.S_addr = lpPktHanBTN->m_dwIP;
|
||||
|
||||
bool bCheckAddress = (0xFFFFFFFF != peerAddress.S_un.S_addr);
|
||||
|
||||
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession(
|
||||
lpPktHanBTN->m_szAccount, peerAddress, bCheckAddress);
|
||||
|
||||
if(0 == lpSessionData)
|
||||
{
|
||||
ERRLOG2(g_Log, "AccountName:%16s / IP:%15s / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><DEBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>",
|
||||
lpPktHanBTN->m_szAccount, inet_ntoa(peerAddress));
|
||||
}
|
||||
else if(CSessionData::SE_CHAR_ENABLED != lpSessionData->GetSessionState())
|
||||
{
|
||||
ERRLOG4(g_Log, "UID:%10u / AccountName:%16s / IP:%15s / ST:%s / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><DEBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><>Ȱ<EFBFBD><C8B0>ȭ<EFBFBD>Ǿ<EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>",
|
||||
lpSessionData->GetUID(), lpPktHanBTN->m_szAccount, inet_ntoa(peerAddress),
|
||||
g_szSessionStateString[lpSessionData->GetSessionState()]);
|
||||
}
|
||||
else
|
||||
{
|
||||
GET_SINGLE_DISPATCH(lpChatDispatch,
|
||||
CChatDispatch, CChatDispatch::GetDispatchTable());
|
||||
|
||||
if(0 != lpChatDispatch)
|
||||
{
|
||||
char* lpBuffer = lpChatDispatch->GetSendStream().GetBuffer(sizeof(PktHanBTN));
|
||||
|
||||
if(0 != lpBuffer)
|
||||
{
|
||||
PktHanBTN* lpPktChatBTN = reinterpret_cast<PktHanBTN*>(lpBuffer);
|
||||
|
||||
*lpPktChatBTN = *lpPktHanBTN;
|
||||
|
||||
lpPktChatBTN->m_dwUID = lpSessionData->GetUID();
|
||||
lpPktChatBTN->m_dwCID = lpSessionData->GetCID();
|
||||
|
||||
return lpChatDispatch->GetSendStream().WrapHeader(
|
||||
sizeof(PktHanBTN), CmdHanBTNWarning, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
ERRLOG5(g_Log, "UID:%10u / AccountName:%16s / IP:%15s / ST:%s / ChatDispatch:%p / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><DEBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : ä<>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD>, <20><><EFBFBD><EFBFBD> <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
lpSessionData->GetUID(), lpPktHanBTN->m_szAccount, inet_ntoa(peerAddress),
|
||||
g_szSessionStateString[lpSessionData->GetSessionState()], lpChatDispatch);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CUIDDispatch::ParseHanBTNUserKill(PktHanUserKill* lpPktHanUserKill)
|
||||
{
|
||||
using namespace DataStorage;
|
||||
|
||||
IN_ADDR peerAddress;
|
||||
peerAddress.S_un.S_addr = lpPktHanUserKill->m_dwIP;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> DB<44><42> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IP<49><50> <20><>ġ<EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰ſ<DFB0> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ش<EFBFBD>.
|
||||
bool bCheckAddress = (peerAddress.S_un.S_addr != 0xFFFFFFFF);
|
||||
|
||||
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession(
|
||||
lpPktHanUserKill->m_szAccount, peerAddress, bCheckAddress);
|
||||
|
||||
if(0 == lpSessionData)
|
||||
{
|
||||
ERRLOG2(g_Log, "AccountName:%16s / IP:%15s / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>",
|
||||
lpPktHanUserKill->m_szAccount, inet_ntoa(peerAddress));
|
||||
}
|
||||
else
|
||||
{
|
||||
SERVER_ID serverID;
|
||||
serverID.dwID = lpSessionData->GetServerID();
|
||||
CSessionData::SessionState eSessionState = lpSessionData->GetSessionState();
|
||||
|
||||
if ((serverID.GetType() == CServerSetup::AuthServer && CSessionData::SE_USER_ENABLED != eSessionState) ||
|
||||
(serverID.GetType() == CServerSetup::GameServer && CSessionData::SE_CHAR_ENABLED != eSessionState))
|
||||
{
|
||||
ERRLOG3(g_Log, "UID:%10u / ServerID:0x%08X / ST:%s / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><>Ȱ<EFBFBD><C8B0>ȭ<EFBFBD>Ǿ<EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>",
|
||||
lpSessionData->GetUID(), serverID.dwID, g_szSessionStateString[lpSessionData->GetSessionState()]);
|
||||
}
|
||||
else if(!SendPacket::UserKill(*lpSessionData))
|
||||
{
|
||||
ERRLOG3(g_Log, "UID:%10u / ServerID:0x%08X / ST:%s / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
lpSessionData->GetUID(), serverID.dwID, g_szSessionStateString[lpSessionData->GetSessionState()]);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CUIDDispatch::ParseUserKill(PktUK* lpPktUK)
|
||||
{
|
||||
using namespace DataStorage;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> DB<44><42> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IP<49><50> <20><>ġ<EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰ſ<DFB0> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ش<EFBFBD>.
|
||||
CSessionData* lpSessionData =
|
||||
CSessionDataMgr::GetInstance().GetOpenSession(lpPktUK->m_dwUserID);
|
||||
|
||||
if(0 == lpSessionData)
|
||||
{
|
||||
ERRLOG1(g_Log, "UID:%10u / UID <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>", lpPktUK->m_dwUserID);
|
||||
}
|
||||
else
|
||||
{
|
||||
SERVER_ID serverID;
|
||||
serverID.dwID = lpSessionData->GetServerID();
|
||||
CSessionData::SessionState eSessionState = lpSessionData->GetSessionState();
|
||||
|
||||
if ((serverID.GetType() == CServerSetup::AuthServer && CSessionData::SE_USER_ENABLED != eSessionState) ||
|
||||
(serverID.GetType() == CServerSetup::GameServer && CSessionData::SE_CHAR_ENABLED != eSessionState))
|
||||
{
|
||||
ERRLOG3(g_Log, "UID:%10u / ServerID:0x%08X / ST:%s / UID <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><>Ȱ<EFBFBD><C8B0>ȭ<EFBFBD>Ǿ<EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>",
|
||||
lpPktUK->m_dwUserID, serverID.dwID, g_szSessionStateString[lpSessionData->GetSessionState()]);
|
||||
}
|
||||
else if(!SendPacket::UserKill(*lpSessionData))
|
||||
{
|
||||
ERRLOG3(g_Log, "UID:%10u / ServerID:0x%08X / ST:%s / UID <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
lpPktUK->m_dwUserID, serverID.dwID, g_szSessionStateString[lpSessionData->GetSessionState()]);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
#ifndef _DBAGENT_SERVER_UID_DISPATCH_H_
|
||||
#define _DBAGENT_SERVER_UID_DISPATCH_H_
|
||||
|
||||
#include <Network/Packet/PacketStruct/ServerPacket.h>
|
||||
#include <Network/Dispatch/RylServerDispatch.h>
|
||||
#include <Network/Dispatch/SingleDispatchStorage.h>
|
||||
|
||||
// forward decl.
|
||||
struct PktBase;
|
||||
struct PktUUTAck;
|
||||
struct PktBTN;
|
||||
struct PktHanBTN;
|
||||
struct PktHanUserKill;
|
||||
struct PktUK;
|
||||
struct PktSLAck;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
extern const char* g_szPktUUTString[PktUUT::MAX_UPDATE_TYPE];
|
||||
|
||||
class CUIDDispatch : public CRylServerDispatch
|
||||
{
|
||||
public:
|
||||
|
||||
static CSingleDispatch& GetDispatchTable();
|
||||
|
||||
enum Const
|
||||
{
|
||||
MAX_PACKET_DISPATCH_PER_PULSE = 100,
|
||||
MAX_STREAM_BUFFER_SIZE = 16000
|
||||
};
|
||||
|
||||
CUIDDispatch(CSession& Session);
|
||||
virtual ~CUIDDispatch();
|
||||
|
||||
virtual void Connected();
|
||||
virtual void Disconnected();
|
||||
virtual bool DispatchPacket(PktBase* lpPktBase);
|
||||
|
||||
private:
|
||||
|
||||
bool ParseServerLoginAck(PktSLAck* lpPktSLAck);
|
||||
bool ParseServerLogoutAck(PktBase* lpPktBase);
|
||||
|
||||
bool ParseUpdateUIDTable(PktUUTAck* lpPktUUTAck);
|
||||
|
||||
bool ParseBillingTimeNotify(PktBTN* lpPktBTN); // <20>ѱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><DEBD><EFBFBD>
|
||||
bool ParseBillingTimeCheckNotify(PktBTN* lpPktBTN); // <20>븸 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><DEBD><EFBFBD>
|
||||
|
||||
bool ParseHanBTNWarning(PktHanBTN* lpPktHanBTN); // <20>ѱ<EFBFBD> <20><><EFBFBD>պ<EFBFBD><D5BA><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><DEBD><EFBFBD>
|
||||
bool ParseHanBTNUserKill(PktHanUserKill* lpPktHanUserKill); // <20>ѱ<EFBFBD> <20><><EFBFBD>պ<EFBFBD><D5BA><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
bool ParseUserKill(PktUK* lpPktUK); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,32 @@
|
||||
#ifndef _DBAGENT_SERVER_PARSE_CASTLE_H_
|
||||
#define _DBAGENT_SERVER_PARSE_CASTLE_H_
|
||||
|
||||
class CSendStream;
|
||||
struct PktBase;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace ParseCastle
|
||||
{
|
||||
bool CastleCmd(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
bool SiegeArmsCmd(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
bool SetCastleRight(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
bool SetCampRight(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
bool CreateCamp(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
bool CreateSiegeArms(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
bool CampCmd(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
bool CampMessage(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
bool MiningCampMineralInfo(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
bool FertilityInfo(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
bool CampShopInfo(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
bool CastleTaxMove(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
bool CastleMineralInfo(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
bool WarOnOff(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
bool StatueCmd(CSendStream& SendSream, PktBase* lpPktBase);
|
||||
bool RealmPoint(CSendStream& SendSream, PktBase* lpPktBase);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,39 @@
|
||||
#ifndef _DBAGENT_SERVER_PARSE_CHAR_MANAGE_H_
|
||||
#define _DBAGENT_SERVER_PARSE_CHAR_MANAGE_H_
|
||||
|
||||
// forward decl;
|
||||
class CSendStream;
|
||||
struct PktDD;
|
||||
struct PktBase;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
|
||||
namespace DataStorage
|
||||
{
|
||||
// forward decl.
|
||||
class CItemSerialMgr;
|
||||
}
|
||||
|
||||
|
||||
namespace ParseCharManage
|
||||
{
|
||||
// --------------------------------------------------------------------
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>ҵ<DEBC>
|
||||
|
||||
bool Parse(CSendStream& SendStream, unsigned long dwServerID,
|
||||
Item::CItemSerialMgr& itemSerialMgr, PktDD* lpPktDD);
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
// <20><>Ʋ<EFBFBD><EFBFBD><D7B6><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ҵ<DEBC>.
|
||||
// <20>輷 <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD> <20>߰輭<DFB0><E8BCAD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>û.
|
||||
|
||||
bool BGServerCharSlot(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ҵ<DEBC>
|
||||
bool UnifiedCharSelect(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,62 @@
|
||||
#ifndef _DBAGENT_SERVER_PARSE_CHAR_UPDATE_H_
|
||||
#define _DBAGENT_SERVER_PARSE_CHAR_UPDATE_H_
|
||||
|
||||
#include <Network/Packet/PacketStruct/CharLoginOutPacket.h>
|
||||
|
||||
// forward delc.
|
||||
class CSendStream;
|
||||
|
||||
|
||||
namespace Item
|
||||
{
|
||||
// forward decl.
|
||||
class CItemSerialMgr;
|
||||
};
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
|
||||
namespace ParseCharUpdate
|
||||
{
|
||||
// ------------------------------------------------------------------------
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ľ<EFBFBD>
|
||||
|
||||
bool Parse(CSendStream& SendStream, unsigned long dwServerID,
|
||||
Item::CItemSerialMgr& itemSerialMgr, PktDBUpdate* lpPktDBUpdate);
|
||||
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><EFBFBD><DEBC><EFBFBD>
|
||||
|
||||
bool UpdateDeposit(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
bool UpdateDepositDB(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
bool UpdateFriendDB(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
bool UpdateQuestDB(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
bool UpdateConfigInfoDB(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
|
||||
bool SaveEnemy(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// <20><><EFBFBD>̽<EFBFBD>ƽ Ű <20><><EFBFBD><EFBFBD>.
|
||||
bool UpdateKeyInfo(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
bool UseCashItem(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>̺<EFBFBD>Ʈ
|
||||
bool ExtraEvent(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
}
|
||||
|
||||
namespace ParseCharAdmin
|
||||
{
|
||||
bool AdminCommandLog(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,903 @@
|
||||
#include "stdafx.h"
|
||||
#include "ParseGuild.h"
|
||||
|
||||
#include <Network/Packet/WrapPacket.h>
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
#include <Network/Packet/PacketStruct/GuildPacket.h>
|
||||
#include <Network/Stream/SendStream.h>
|
||||
#include <Network/Dispatch/GameDispatch.h>
|
||||
#include <Network/SendPacket/SendGuild.h>
|
||||
|
||||
#include <Community/Guild/GuildDB.h>
|
||||
#include <Community/Guild/GuildDBMgr.h>
|
||||
|
||||
#include <DB/DBComponent.h>
|
||||
#include <DB/GuildDBComponent.h>
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
|
||||
#include <DataStorage/SessionDataMgr.h>
|
||||
#include <DataStorage/CharacterData.h>
|
||||
#include <Network/Packet/PacketStruct/CastlePacket.h>
|
||||
#include <GameTime/GameTimeConstants.h>
|
||||
#include <GameTime/GameTimeDBMgr.h>
|
||||
#include <DB/GameDBComponent.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace ParseGuild
|
||||
{
|
||||
|
||||
bool CreateGuild(CSendStream& SendStream, PktBase* lpPktBase)
|
||||
{
|
||||
PktCreateGuild* lpPktCreateGuild = static_cast<PktCreateGuild*>(lpPktBase);
|
||||
|
||||
unsigned short wError = PktBase::NO_SERVER_ERR;
|
||||
|
||||
CGuildDB* lpGuild = Guild::CGuildDBMgr::GetInstance().CreateGuild(
|
||||
lpPktCreateGuild->m_dwCID, lpPktCreateGuild->m_cInclination,
|
||||
lpPktCreateGuild->m_szGuildName, &wError);
|
||||
|
||||
PktCreateGuild pktGCAck;
|
||||
memset(&pktGCAck, 0, sizeof(PktCreateGuild));
|
||||
|
||||
pktGCAck.m_dwCID = lpPktCreateGuild->m_dwCID;
|
||||
pktGCAck.m_dwGID = (NULL != lpGuild) ? lpGuild->GetGID() : 0;
|
||||
pktGCAck.m_cInclination = lpPktCreateGuild->m_cInclination;
|
||||
strncpy(pktGCAck.m_szGuildName, lpPktCreateGuild->m_szGuildName, Guild::MAX_GUILD_NAME_LEN);
|
||||
|
||||
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktGCAck),
|
||||
sizeof(PktCreateGuild), CmdCreateGuild, 0, wError))
|
||||
{
|
||||
if (PktBase::NO_SERVER_ERR == wError)
|
||||
{
|
||||
using namespace DBAgent::DataStorage;
|
||||
|
||||
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(lpPktCreateGuild->m_dwCID);
|
||||
|
||||
if(lpSessionData)
|
||||
{
|
||||
CCharacterData* lpCharacterData = lpSessionData->GetCharacterData();
|
||||
|
||||
if(lpCharacterData)
|
||||
{
|
||||
// edith 2008.11.24 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
|
||||
lpCharacterData->SetGuildWarFlag(Creature::WAR_ON);
|
||||
|
||||
PktWarOnOff* lpPktWarOnOffAck = reinterpret_cast<PktWarOnOff*>(SendStream.GetBuffer(sizeof(PktWarOnOff)));
|
||||
|
||||
if (lpPktWarOnOffAck)
|
||||
{
|
||||
lpPktWarOnOffAck->m_dwCID = lpCharacterData->GetCID();
|
||||
lpPktWarOnOffAck->m_cType = GameTime::GUILD;
|
||||
lpPktWarOnOffAck->m_cFlag = Creature::WAR_ON;
|
||||
|
||||
SendStream.WrapHeader(sizeof(PktWarOnOff), CmdWarOnOff, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktGCAck), sizeof(PktCreateGuild), CmdCreateGuild));
|
||||
}
|
||||
else
|
||||
{
|
||||
SendStream.PutBuffer(reinterpret_cast<char*>(&pktGCAck),
|
||||
sizeof(PktCreateGuild), CmdCreateGuild);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool GuildCmd(CSendStream& SendStream, PktBase* lpPktBase)
|
||||
{
|
||||
PktGuildCmd* lpPktGuildCmd = static_cast<PktGuildCmd*>(lpPktBase);
|
||||
|
||||
unsigned short wError = PktBase::NO_SERVER_ERR;
|
||||
|
||||
unsigned long dwGID = lpPktGuildCmd->m_dwGID;
|
||||
unsigned long dwSenderID = lpPktGuildCmd->m_dwSenderID;
|
||||
unsigned long dwReferenceID = lpPktGuildCmd->m_dwReferenceID;
|
||||
unsigned short wCmd = lpPktGuildCmd->m_wCmd;
|
||||
|
||||
using namespace Guild;
|
||||
|
||||
CGuildDB* lpGuild = static_cast<CGuildDB*>(CGuildDBMgr::GetInstance().GetGuild(dwGID));
|
||||
if (0 == lpGuild)
|
||||
{
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (wCmd)
|
||||
{
|
||||
case PktGuildCmd::GC_JOIN:
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڿ<EFBFBD> <20>ٿ<EFBFBD> <20>ٸ<EFBFBD> ũ<><C5A9><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Լ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
lpGuild->SendJoinMember(&SendStream, dwSenderID, static_cast<unsigned char>(dwReferenceID));
|
||||
|
||||
return true;
|
||||
}
|
||||
case PktGuildCmd::GC_TACTICS:
|
||||
{
|
||||
// <20>뺴 <20><><EFBFBD><EFBFBD> <20><>û.
|
||||
lpGuild->SendJoinTacticsMember(&SendStream, dwSenderID, static_cast<unsigned char>(dwReferenceID), PktGuildCmd::GC_TACTICS);
|
||||
|
||||
return true;
|
||||
}
|
||||
case PktGuildCmd::GC_TACTICS_JOIN:
|
||||
{
|
||||
// <20>뺴 <20><><EFBFBD><EFBFBD> <20><>û.
|
||||
lpGuild->SendJoinTacticsMember(&SendStream, dwSenderID, static_cast<unsigned char>(dwReferenceID), PktGuildCmd::GC_TACTICS_JOIN);
|
||||
|
||||
return true;
|
||||
}
|
||||
case PktGuildCmd::GC_TACTICS_TITLE:
|
||||
case PktGuildCmd::GC_TACTICS_REQUEST:
|
||||
{
|
||||
using namespace DBAgent::DataStorage;
|
||||
|
||||
// <20>뺴 <20>㰡.
|
||||
unsigned char cTitle = static_cast<unsigned char>(dwReferenceID);
|
||||
|
||||
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(dwSenderID);
|
||||
|
||||
if(wCmd==PktGuildCmd::GC_TACTICS_REQUEST)
|
||||
goto lb_request;
|
||||
|
||||
if(CGameTimeDBMgr::GetInstance().IsGuildWarTime())
|
||||
{
|
||||
if(lpSessionData)
|
||||
{
|
||||
CCharacterData* lpCharacterData = lpSessionData->GetCharacterData();
|
||||
|
||||
if(lpCharacterData)
|
||||
{
|
||||
SendPacket::GuildCmd(&SendStream, dwGID, dwSenderID, COMMON, PktGuildCmd::GC_TACTICS_REQUEST, NULL, NULL, wError);
|
||||
}
|
||||
else
|
||||
{
|
||||
goto lb_error;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lb_error:
|
||||
PktGuildCmd pktGuildCmd;
|
||||
memset(&pktGuildCmd, 0, sizeof(PktGuildCmd));
|
||||
strcpy(pktGuildCmd.m_szSenderName, lpPktGuildCmd->m_szSenderName);
|
||||
|
||||
pktGuildCmd.m_dwGID = dwGID;
|
||||
pktGuildCmd.m_dwSenderID = dwSenderID;
|
||||
pktGuildCmd.m_dwReferenceID = COMMON;
|
||||
pktGuildCmd.m_wCmd = PktGuildCmd::GC_TACTICS_TITLE;
|
||||
SendStream.WrapCompress(reinterpret_cast<char*>(&pktGuildCmd), sizeof(PktGuildCmd), CmdGuildCmd, 0, PktGuildCmd::FAIL_TACTICS_LOGOUT);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lb_request:
|
||||
lpGuild->SetTacticsMember(dwSenderID, Guild::TACTICS);
|
||||
lpGuild->SetTitle(dwSenderID, COMMON);
|
||||
|
||||
SendPacket::GuildCmd(&SendStream, dwGID, dwSenderID, COMMON, PktGuildCmd::GC_TACTICS_TITLE, NULL, NULL, wError);
|
||||
|
||||
DBComponent::GuildDB::UpdateGuildMemberTactics(CDBSingleObject::GetInstance(), lpGuild->GetGID(), dwSenderID, Guild::TACTICS);
|
||||
|
||||
if(lpSessionData)
|
||||
{
|
||||
CCharacterData* lpCharacterData = lpSessionData->GetCharacterData();
|
||||
|
||||
if(lpCharacterData)
|
||||
{
|
||||
lpCharacterData->SetGuildWarFlag(Creature::WAR_ON);
|
||||
|
||||
PktWarOnOff* lpPktWarOnOffAck = reinterpret_cast<PktWarOnOff*>(SendStream.GetBuffer(sizeof(PktWarOnOff)));
|
||||
|
||||
if (lpPktWarOnOffAck)
|
||||
{
|
||||
lpPktWarOnOffAck->m_dwCID = lpCharacterData->GetCID();
|
||||
lpPktWarOnOffAck->m_cType = GameTime::GUILD;
|
||||
lpPktWarOnOffAck->m_cFlag = Creature::WAR_ON;
|
||||
|
||||
SendStream.WrapHeader(sizeof(PktWarOnOff), CmdWarOnOff, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DBComponent::GameDB::UpdateGuildWarFlag(CDBSingleObject::GetInstance(), dwSenderID, Creature::WAR_ON);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
case PktGuildCmd::GC_TACTICS_KICK:
|
||||
case PktGuildCmd::GC_TACTICS_LEAVE:
|
||||
{
|
||||
// <20>뺴 <20><><EFBFBD><EFBFBD> <20><> Ż<><C5BB>.
|
||||
if (false == lpGuild->LeaveMember(dwSenderID))
|
||||
{
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
}
|
||||
|
||||
SendPacket::GuildCmd(&SendStream, dwGID, dwSenderID, dwReferenceID, wCmd, NULL, NULL, wError);
|
||||
|
||||
using namespace DBAgent::DataStorage;
|
||||
|
||||
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(dwSenderID);
|
||||
|
||||
if(lpSessionData)
|
||||
{
|
||||
CCharacterData* lpCharacterData = lpSessionData->GetCharacterData();
|
||||
|
||||
if(lpCharacterData)
|
||||
{
|
||||
lpCharacterData->SetGuildWarFlag(Creature::WAR_OFF);
|
||||
|
||||
PktWarOnOff* lpPktWarOnOffAck = reinterpret_cast<PktWarOnOff*>(SendStream.GetBuffer(sizeof(PktWarOnOff)));
|
||||
|
||||
if (lpPktWarOnOffAck)
|
||||
{
|
||||
lpPktWarOnOffAck->m_dwCID = lpCharacterData->GetCID();
|
||||
lpPktWarOnOffAck->m_cType = GameTime::GUILD;
|
||||
lpPktWarOnOffAck->m_cFlag = Creature::WAR_OFF;
|
||||
|
||||
SendStream.WrapHeader(sizeof(PktWarOnOff), CmdWarOnOff, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DBComponent::GameDB::UpdateGuildWarFlag(CDBSingleObject::GetInstance(), dwSenderID, Creature::WAR_OFF);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
case PktGuildCmd::GC_SETUP_TITLE:
|
||||
{
|
||||
unsigned char cTitle = static_cast<unsigned char>(dwReferenceID);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ż<><C5BB>
|
||||
if (dwSenderID == lpGuild->GetMaster().m_dwCID)
|
||||
{
|
||||
unsigned long dwNewMaster = lpGuild->SetNewMaster();
|
||||
if (0 == dwNewMaster)
|
||||
{
|
||||
DETLOG1(g_Log, "GID:%10u <20><><EFBFBD>尡 <20><>ü<EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>. - <20><><EFBFBD>帶<EFBFBD><E5B8B6><EFBFBD><EFBFBD> Ż<><C5BB>", lpGuild->GetGID());
|
||||
CGuildDBMgr::GetInstance().DissolveGuild(
|
||||
lpGuild->GetGID(), PktCreateGuild::NONE_NEXT_GUILDMASTER_BY_GUILDMASTER_OUT);
|
||||
break;
|
||||
}
|
||||
|
||||
SendPacket::GuildCmd(&SendStream, dwGID, dwNewMaster, MASTER, PktGuildCmd::GC_SETUP_TITLE, NULL, NULL, wError);
|
||||
|
||||
DETLOG3(g_Log, "GID:%10u <20><><EFBFBD>帶<EFBFBD><E5B8B6><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>:%10u, <20><><EFBFBD><EFBFBD>:%10u)<29><> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>. - <20><><EFBFBD>帶<EFBFBD><E5B8B6><EFBFBD><EFBFBD> Ż<><C5BB>",
|
||||
lpGuild->GetGID(), dwSenderID, dwNewMaster);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>絵
|
||||
if (MASTER == cTitle)
|
||||
{
|
||||
MemberInfo PreMasterInfo = lpGuild->GetMaster();
|
||||
lpGuild->SetTitle(PreMasterInfo.m_dwCID, COMMON);
|
||||
|
||||
SendPacket::GuildCmd(&SendStream, dwGID, PreMasterInfo.m_dwCID, COMMON, PktGuildCmd::GC_SETUP_TITLE, NULL, NULL, wError);
|
||||
|
||||
DETLOG3(g_Log, "GID:%10u <20><><EFBFBD>帶<EFBFBD><E5B8B6><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>:%10u, <20><><EFBFBD><EFBFBD>:%10u)<29><> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>. - <20><><EFBFBD>帶<EFBFBD><E5B8B6><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>絵",
|
||||
lpGuild->GetGID(), PreMasterInfo.m_dwCID, dwSenderID);
|
||||
}
|
||||
|
||||
lpGuild->SetTitle(dwSenderID, cTitle);
|
||||
|
||||
if(cTitle==COMMON)
|
||||
{
|
||||
using namespace DBAgent::DataStorage;
|
||||
|
||||
// edith 2008.03.15 <20>Ϲ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8>Ʋ<EFBFBD><C6B2> <20><><EFBFBD><EFBFBD><EFBFBD>ϴµ<CFB4> SenderID<49><44> <20>ƴ<EFBFBD> dwGID <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD> <20>߸<EFBFBD><DFB8>ƴ<EFBFBD>.
|
||||
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(dwSenderID);
|
||||
// CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(dwGID);
|
||||
|
||||
if(lpSessionData)
|
||||
{
|
||||
CCharacterData* lpCharacterData = lpSessionData->GetCharacterData();
|
||||
|
||||
if(lpCharacterData)
|
||||
{
|
||||
// edith 2008.11.24 <20><><EFBFBD>帶<EFBFBD><E5B8B6><EFBFBD>Ͱ<EFBFBD> <20>ɽÿ<C9BD> <20><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
|
||||
// edith 2009.05.20 <20>Ϲ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɶ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> OFF <20><> <20><><EFBFBD><EFBFBD>.
|
||||
lpCharacterData->SetGuildWarFlag(Creature::WAR_OFF);
|
||||
|
||||
PktWarOnOff* lpPktWarOnOffAck = reinterpret_cast<PktWarOnOff*>(SendStream.GetBuffer(sizeof(PktWarOnOff)));
|
||||
|
||||
if (lpPktWarOnOffAck)
|
||||
{
|
||||
lpPktWarOnOffAck->m_dwCID = lpCharacterData->GetCID();
|
||||
lpPktWarOnOffAck->m_cType = GameTime::GUILD;
|
||||
lpPktWarOnOffAck->m_cFlag = Creature::WAR_OFF;
|
||||
|
||||
SendStream.WrapHeader(sizeof(PktWarOnOff), CmdWarOnOff, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case PktGuildCmd::GC_KICK:
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ű <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>´<EFBFBD>.
|
||||
if (dwSenderID == lpGuild->GetMaster().m_dwCID)
|
||||
{
|
||||
unsigned long dwNewMaster = lpGuild->SetNewMaster();
|
||||
if (0 == dwNewMaster)
|
||||
{
|
||||
DETLOG1(g_Log, "GID:%10u <20><><EFBFBD>尡 <20><>ü<EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>. - <20><><EFBFBD>帶<EFBFBD><E5B8B6><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", lpGuild->GetGID());
|
||||
CGuildDBMgr::GetInstance().DissolveGuild(lpGuild->GetGID(),
|
||||
PktCreateGuild::NONE_NEXT_GUILDMASTER_BY_GUILDMASTER_DELETED);
|
||||
break;
|
||||
}
|
||||
|
||||
SendPacket::GuildCmd(&SendStream, dwGID, dwNewMaster, MASTER, PktGuildCmd::GC_SETUP_TITLE, NULL, NULL, wError);
|
||||
|
||||
DETLOG3(g_Log, "GID:%10u <20><><EFBFBD>帶<EFBFBD><E5B8B6><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>:%10u, <20><><EFBFBD><EFBFBD>:%10u)<29><> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>. - <20><><EFBFBD>帶<EFBFBD><E5B8B6><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
lpGuild->GetGID(), dwSenderID, dwNewMaster);
|
||||
}
|
||||
|
||||
if (false == lpGuild->LeaveMember(dwSenderID))
|
||||
{
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
}
|
||||
|
||||
using namespace DBAgent::DataStorage;
|
||||
|
||||
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(dwSenderID);
|
||||
|
||||
if(lpSessionData)
|
||||
{
|
||||
CCharacterData* lpCharacterData = lpSessionData->GetCharacterData();
|
||||
|
||||
if(lpCharacterData)
|
||||
{
|
||||
lpCharacterData->SetGuildWarFlag(Creature::WAR_OFF);
|
||||
|
||||
PktWarOnOff* lpPktWarOnOffAck = reinterpret_cast<PktWarOnOff*>(SendStream.GetBuffer(sizeof(PktWarOnOff)));
|
||||
|
||||
if (lpPktWarOnOffAck)
|
||||
{
|
||||
lpPktWarOnOffAck->m_dwCID = lpCharacterData->GetCID();
|
||||
lpPktWarOnOffAck->m_cType = GameTime::GUILD;
|
||||
lpPktWarOnOffAck->m_cFlag = Creature::WAR_OFF;
|
||||
|
||||
SendStream.WrapHeader(sizeof(PktWarOnOff), CmdWarOnOff, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DBComponent::GameDB::UpdateGuildWarFlag(CDBSingleObject::GetInstance(), dwSenderID, Creature::WAR_OFF);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return SendPacket::GuildCmd(&SendStream, dwGID, dwSenderID, dwReferenceID, wCmd, NULL, NULL, wError);
|
||||
}
|
||||
|
||||
bool GuildMark(CSendStream& SendStream, PktBase* lpPktBase)
|
||||
{
|
||||
PktGuildMark* lpPktGuildMark = static_cast<PktGuildMark*>(lpPktBase);
|
||||
|
||||
unsigned short wError = PktBase::NO_SERVER_ERR;
|
||||
|
||||
unsigned long dwCID = lpPktGuildMark->m_dwCID;
|
||||
unsigned long dwGID = lpPktGuildMark->m_dwGID;
|
||||
|
||||
unsigned long dwGold = 0;
|
||||
|
||||
CGuildDB* lpGuild = static_cast<CGuildDB*>(CGuildDBMgr::GetInstance().GetGuild(dwGID));
|
||||
if (0 == lpGuild)
|
||||
{
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
lpGuild->SetMark(lpPktGuildMark->m_szMark);
|
||||
dwGold = lpGuild->GetGold();
|
||||
}
|
||||
|
||||
PktGuildMark pktGuildMark;
|
||||
memset(&pktGuildMark, 0, sizeof(PktGuildMark));
|
||||
|
||||
pktGuildMark.m_dwCID = dwCID;
|
||||
pktGuildMark.m_dwGID = dwGID;
|
||||
pktGuildMark.m_dwGold = dwGold;
|
||||
memcpy(pktGuildMark.m_szMark, lpPktGuildMark->m_szMark, MAX_MARK_SIZE);
|
||||
|
||||
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktGuildMark),
|
||||
sizeof(PktGuildMark), CmdGuildMark, 0, wError))
|
||||
{
|
||||
if (PktBase::NO_SERVER_ERR == wError)
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktGuildMark), sizeof(PktGuildMark), CmdGuildMark));
|
||||
}
|
||||
else
|
||||
{
|
||||
SendStream.PutBuffer(reinterpret_cast<char*>(&pktGuildMark),
|
||||
sizeof(PktGuildMark), CmdGuildMark);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool GuildLevel(CSendStream& SendStream, PktBase* lpPktBase)
|
||||
{
|
||||
PktGuildLevel* lpPktGuildLevel = static_cast<PktGuildLevel*>(lpPktBase);
|
||||
|
||||
unsigned short wError = PktBase::NO_SERVER_ERR;
|
||||
|
||||
unsigned long dwGID = lpPktGuildLevel->m_dwUID;
|
||||
unsigned char cLevel = lpPktGuildLevel->m_cLevel;
|
||||
unsigned long dwGold = 0;
|
||||
|
||||
using namespace Guild;
|
||||
|
||||
CGuildDB* lpGuild = static_cast<CGuildDB*>(CGuildDBMgr::GetInstance().GetGuild(dwGID));
|
||||
if (NULL == lpGuild)
|
||||
{
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
lpGuild->SetLevel(cLevel);
|
||||
dwGold = lpGuild->GetGold();
|
||||
}
|
||||
|
||||
PktGuildLevel pktGuildLevel;
|
||||
memset(&pktGuildLevel, 0, sizeof(PktGuildLevel));
|
||||
|
||||
pktGuildLevel.m_dwUID = dwGID;
|
||||
pktGuildLevel.m_cLevel = cLevel;
|
||||
pktGuildLevel.m_dwGold = dwGold;
|
||||
|
||||
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktGuildLevel),
|
||||
sizeof(PktGuildLevel), CmdGuildLevel, 0, wError))
|
||||
{
|
||||
if (PktBase::NO_SERVER_ERR == wError)
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktGuildLevel), sizeof(PktGuildLevel), CmdGuildLevel));
|
||||
}
|
||||
else
|
||||
{
|
||||
SendStream.PutBuffer(reinterpret_cast<char*>(&pktGuildLevel),
|
||||
sizeof(PktGuildLevel), CmdGuildLevel);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool GuildRelation(CSendStream& SendStream, PktBase* lpPktBase)
|
||||
{
|
||||
PktGuildRelation* lpPktGuildRelation = static_cast<PktGuildRelation*>(lpPktBase);
|
||||
|
||||
unsigned short wError = PktBase::NO_SERVER_ERR;
|
||||
|
||||
unsigned long dwCID = lpPktGuildRelation->m_dwCID;
|
||||
unsigned long dwGID = lpPktGuildRelation->m_dwGID;
|
||||
unsigned long dwTargetGID = lpPktGuildRelation->m_dwTargetGID;
|
||||
unsigned long dwValue = lpPktGuildRelation->m_dwValue;
|
||||
char cSubCmd = lpPktGuildRelation->m_cSubCmd;
|
||||
|
||||
CGuildDB* lpGuild = static_cast<CGuildDB*>(CGuildDBMgr::GetInstance().GetGuild(dwGID));
|
||||
CGuildDB* lpTargetGuild = static_cast<CGuildDB*>(CGuildDBMgr::GetInstance().GetGuild(dwTargetGID));
|
||||
|
||||
if (NULL == lpGuild || NULL == lpTargetGuild)
|
||||
{
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (cSubCmd)
|
||||
{
|
||||
case PktGuildRelation::GR_HOSTILITY:
|
||||
{
|
||||
if (!CGuildDBMgr::GetInstance().SetRelation(dwGID, dwTargetGID, Guild::HOSTILITY))
|
||||
{
|
||||
wError = PktGuildRelation::SERVER_ERROR;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case PktGuildRelation::GR_PEACE:
|
||||
{
|
||||
if (!CGuildDBMgr::GetInstance().SetRelation(dwGID, dwTargetGID, Guild::NEUTRALITY))
|
||||
{
|
||||
wError = PktGuildRelation::SERVER_ERROR;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case PktGuildRelation::GR_HOSTILITYDEL:
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> TargetGuild<6C><64><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
|
||||
if (!CGuildDBMgr::GetInstance().SetRelation(dwGID, dwTargetGID, Guild::TARGET_NEUTRALITY))
|
||||
{
|
||||
wError = PktGuildRelation::SERVER_ERROR;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case PktGuildRelation::GR_ALERT:
|
||||
{
|
||||
if (!CGuildDBMgr::GetInstance().SetRelation(dwGID, dwTargetGID, Guild::ALERT_HOSTILITY))
|
||||
{
|
||||
wError = PktGuildRelation::SERVER_ERROR;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case PktGuildRelation::GR_COUNTER:
|
||||
{
|
||||
if (!CGuildDBMgr::GetInstance().SetRelation(dwGID, dwTargetGID, Guild::COUNTER_HOSTILITY))
|
||||
{
|
||||
wError = PktGuildRelation::SERVER_ERROR;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case PktGuildRelation::GR_REQUEST:
|
||||
{
|
||||
CGuildDB* lpHostilityGuild = static_cast<CGuildDB*>(CGuildDBMgr::GetInstance().GetGuild(dwValue));
|
||||
if (NULL == lpHostilityGuild)
|
||||
{
|
||||
wError = PktGuildRelation::SERVER_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!CGuildDBMgr::GetInstance().SetRelation(dwGID, dwValue, Guild::NEUTRALITY))
|
||||
{
|
||||
wError = PktGuildRelation::SERVER_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!CGuildDBMgr::GetInstance().SetRelation(dwGID, dwTargetGID, Guild::HOSTILITY))
|
||||
{
|
||||
wError = PktGuildRelation::SERVER_ERROR;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PktGuildRelation pktGuildRelation;
|
||||
memset(&pktGuildRelation, 0, sizeof(PktGuildRelation));
|
||||
|
||||
pktGuildRelation.m_dwCID = dwCID;
|
||||
pktGuildRelation.m_dwGID = dwGID;
|
||||
pktGuildRelation.m_dwTargetGID = dwTargetGID;
|
||||
pktGuildRelation.m_dwValue = dwValue;
|
||||
pktGuildRelation.m_cSubCmd = cSubCmd;
|
||||
|
||||
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktGuildRelation),
|
||||
sizeof(PktGuildRelation), CmdGuildRelation, 0, wError))
|
||||
{
|
||||
if (PktBase::NO_SERVER_ERR == wError)
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktGuildRelation),
|
||||
sizeof(PktGuildRelation), CmdGuildRelation));
|
||||
}
|
||||
else
|
||||
{
|
||||
SendStream.PutBuffer(reinterpret_cast<char*>(&pktGuildRelation),
|
||||
sizeof(PktGuildRelation), CmdGuildRelation);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GuildInclination(CSendStream& SendStream, PktBase* lpPktBase)
|
||||
{
|
||||
// <20><><EFBFBD>̻<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. (2004-11-22 by <20>ε<EFBFBD>)
|
||||
/*
|
||||
PktGuildInclination* lpPktInclination = static_cast<PktGuildInclination*>(lpPktBase);
|
||||
|
||||
unsigned short wError = PktBase::NO_SERVER_ERR;
|
||||
|
||||
unsigned long dwGID = lpPktInclination->m_dwUID;
|
||||
unsigned char cInclination = lpPktInclination->m_cInclination;
|
||||
|
||||
CGuildDB* lpGuild = static_cast<CGuildDB*>(CGuildDBMgr::GetInstance().GetGuild(dwGID));
|
||||
if (NULL == lpGuild)
|
||||
{
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
lpGuild->SetInclination(cInclination);
|
||||
}
|
||||
|
||||
PktGuildInclination pktGuildInclination;
|
||||
memset(&pktGuildInclination, 0, sizeof(PktGuildInclination));
|
||||
|
||||
pktGuildInclination.m_dwUID = dwGID;
|
||||
pktGuildInclination.m_cInclination = cInclination;
|
||||
|
||||
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktGuildInclination),
|
||||
sizeof(PktGuildInclination), CmdGuildInclination, 0, wError))
|
||||
{
|
||||
if (PktBase::NO_SERVER_ERR == wError)
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktGuildInclination),
|
||||
sizeof(PktGuildInclination), CmdGuildInclination));
|
||||
}
|
||||
else
|
||||
{
|
||||
SendStream.PutBuffer(reinterpret_cast<char*>(&pktGuildInclination),
|
||||
sizeof(PktGuildInclination), CmdGuildInclination);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
*/
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool SetGuildRight(CSendStream& SendStream, PktBase* lpPktBase)
|
||||
{
|
||||
using namespace Guild;
|
||||
|
||||
PktGuildRight* lpPktGuildRight = static_cast<PktGuildRight *>(lpPktBase);
|
||||
|
||||
unsigned short wError = PktBase::NO_SERVER_ERR;
|
||||
|
||||
unsigned long dwGID = lpPktGuildRight->m_dwUID;
|
||||
GuildRight guildRight = lpPktGuildRight->m_GuildRight;
|
||||
|
||||
CGuildDB* lpGuild = static_cast<CGuildDB*>(CGuildDBMgr::GetInstance().GetGuild(dwGID));
|
||||
if (NULL == lpGuild)
|
||||
{
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
lpGuild->SetRight(guildRight);
|
||||
}
|
||||
|
||||
PktGuildRight pktGuildRight;
|
||||
memset(&pktGuildRight, 0, sizeof(PktGuildRight));
|
||||
|
||||
pktGuildRight.m_dwUID = dwGID;
|
||||
pktGuildRight.m_GuildRight = guildRight;
|
||||
|
||||
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktGuildRight),
|
||||
sizeof(PktGuildRight), CmdGuildRight, 0, wError))
|
||||
{
|
||||
if (PktBase::NO_SERVER_ERR == wError)
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktGuildRight), sizeof(PktGuildRight), CmdGuildRight));
|
||||
}
|
||||
else
|
||||
{
|
||||
SendStream.PutBuffer(reinterpret_cast<char*>(&pktGuildRight),
|
||||
sizeof(PktGuildRight), CmdGuildRight);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool GuildSafe(CSendStream& SendStream, PktBase* lpPktBase)
|
||||
{
|
||||
PktGuildSafeAck* lpPktGuildSafe = reinterpret_cast<PktGuildSafeAck *>(lpPktBase);
|
||||
|
||||
unsigned wError = PktBase::NO_SERVER_ERR;
|
||||
|
||||
unsigned long dwCID = lpPktGuildSafe->m_dwCID;
|
||||
unsigned long dwGID = lpPktGuildSafe->m_dwGID;
|
||||
|
||||
unsigned long dwSafeGold = lpPktGuildSafe->m_dwSafeGold;
|
||||
unsigned long dwCharGold = lpPktGuildSafe->m_dwCharGold;
|
||||
|
||||
unsigned char cCmd = lpPktGuildSafe->m_cCmd;
|
||||
|
||||
using namespace DBAgent::DataStorage;
|
||||
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(dwCID);
|
||||
CCharacterData* lpCharacterData = NULL;
|
||||
|
||||
if(lpSessionData)
|
||||
lpCharacterData = lpSessionData->GetCharacterData();
|
||||
|
||||
CGuildDB* lpGuild = static_cast<CGuildDB*>(CGuildDBMgr::GetInstance().GetGuild(dwGID));
|
||||
if (NULL == lpGuild)
|
||||
{
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (cCmd)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD>
|
||||
case PktGuildSafe::SC_WITHDRAWAL:
|
||||
{
|
||||
if (false == lpGuild->DeductGold(dwCharGold))
|
||||
{
|
||||
wError = PktGuildSafe::FAIL_NOT_ENOUGH_MONEY;
|
||||
}
|
||||
dwSafeGold = dwCharGold;
|
||||
break;
|
||||
}
|
||||
|
||||
// <20>Ա<EFBFBD>
|
||||
case PktGuildSafe::SC_DEPOSIT:
|
||||
{
|
||||
// edith 2008.03.15 ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>带 <20><><EFBFBD><EFBFBD>.
|
||||
if(false == lpCharacterData->DeductGold(dwCharGold))
|
||||
{
|
||||
wError = PktGuildSafe::FAIL_NOT_CHAR_MONEY;
|
||||
}
|
||||
else if (false == lpGuild->AddGold(dwCharGold))
|
||||
{
|
||||
// <20>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD> <20>ݾ<EFBFBD><DDBE><EFBFBD>
|
||||
lpCharacterData->AddGold(dwCharGold);
|
||||
|
||||
wError = PktGuildSafe::FAIL_NOT_GUILD_DEPOSIT;
|
||||
}
|
||||
dwSafeGold = dwCharGold;
|
||||
break;
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ʽ<EFBFBD>
|
||||
case PktGuildSafe::SC_BONUS:
|
||||
{
|
||||
if (false == lpGuild->AddGold(dwCharGold))
|
||||
{
|
||||
wError = PktGuildSafe::FAIL_NOT_GUILD_DEPOSIT;
|
||||
}
|
||||
dwSafeGold = dwCharGold;
|
||||
}
|
||||
break;
|
||||
|
||||
// <20>й<EFBFBD>
|
||||
case PktGuildSafe::SC_RELEASE:
|
||||
{
|
||||
unsigned long dwPreSafeGold = lpGuild->GetGold();
|
||||
dwCharGold = lpGuild->ReleaseGold(dwCharGold);
|
||||
if (0 == dwCharGold)
|
||||
{
|
||||
wError = PktGuildSafe::FAIL_NOT_ENOUGH_MONEY;
|
||||
break;
|
||||
}
|
||||
dwSafeGold = dwPreSafeGold - lpGuild->GetGold();
|
||||
break;
|
||||
}
|
||||
default:
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
PktGuildSafeAck pktGuildSafeAck;
|
||||
memset(&pktGuildSafeAck, 0, sizeof(PktGuildSafeAck));
|
||||
|
||||
pktGuildSafeAck.m_dwCID = dwCID;
|
||||
pktGuildSafeAck.m_dwGID = dwGID;
|
||||
pktGuildSafeAck.m_dwSafeGold = dwSafeGold;
|
||||
pktGuildSafeAck.m_dwCharGold = dwCharGold;
|
||||
pktGuildSafeAck.m_cCmd = cCmd;
|
||||
|
||||
strncpy(pktGuildSafeAck.m_szCharName,
|
||||
lpPktGuildSafe->m_szCharName, Guild::MAX_MEMBER_NAME_LEN);
|
||||
|
||||
if (!DBComponent::GuildDB::UpdateGuildGold(
|
||||
CDBSingleObject::GetInstance(), lpGuild->GetGID(), lpGuild->GetGold()))
|
||||
{
|
||||
wError = PktGuildSafe::FAIL_NOT_GUILD_UPDATE;
|
||||
}
|
||||
|
||||
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktGuildSafeAck),
|
||||
sizeof(PktGuildSafeAck), CmdGuildSafe, 0, wError))
|
||||
{
|
||||
if (PktBase::NO_SERVER_ERR == wError)
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktGuildSafeAck), sizeof(PktGuildSafeAck), CmdGuildSafe));
|
||||
}
|
||||
else
|
||||
{
|
||||
SendStream.PutBuffer(reinterpret_cast<char*>(&pktGuildSafeAck),
|
||||
sizeof(PktGuildSafeAck), CmdGuildSafe);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool GuildMemberInfoUpdate(CSendStream& SendStream, PktBase* lpPktBase)
|
||||
{
|
||||
PktGuildMemberInfoUpdate* lpPktGMIU = static_cast<PktGuildMemberInfoUpdate*>(lpPktBase);
|
||||
|
||||
unsigned short wError = PktBase::NO_SERVER_ERR;
|
||||
|
||||
unsigned long dwGID = lpPktGMIU->m_dwGID;
|
||||
unsigned long dwCID = lpPktGMIU->m_dwCID;
|
||||
|
||||
CGuildDB* lpGuild = static_cast<CGuildDB*>(CGuildDBMgr::GetInstance().GetGuild(dwGID));
|
||||
if (NULL == lpGuild)
|
||||
{
|
||||
wError = PktBase::SERVER_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
lpGuild->UpdateMemberInfo(dwCID,
|
||||
lpPktGMIU->m_MemberListInfo, lpPktGMIU->m_MemberDetailInfo);
|
||||
}
|
||||
|
||||
PktGuildMemberInfoUpdate pktGMIUAck;
|
||||
memset(&pktGMIUAck, 0, sizeof(PktGuildMemberInfoUpdate));
|
||||
|
||||
pktGMIUAck.m_dwGID = dwGID;
|
||||
pktGMIUAck.m_dwCID = dwCID;
|
||||
|
||||
pktGMIUAck.m_MemberListInfo = lpPktGMIU->m_MemberListInfo;
|
||||
pktGMIUAck.m_MemberDetailInfo = lpPktGMIU->m_MemberDetailInfo;
|
||||
|
||||
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktGMIUAck),
|
||||
sizeof(PktGuildMemberInfoUpdate), CmdGuildMemberInfoUpdate, 0, wError))
|
||||
{
|
||||
if (PktBase::NO_SERVER_ERR == wError)
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktGMIUAck),
|
||||
sizeof(PktGuildMemberInfoUpdate), CmdGuildMemberInfoUpdate));
|
||||
}
|
||||
else
|
||||
{
|
||||
SendStream.PutBuffer(reinterpret_cast<char*>(&pktGMIUAck),
|
||||
sizeof(PktGuildMemberInfoUpdate), CmdGuildMemberInfoUpdate);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
#ifndef _DBAGENT_SERVER_PARSE_GUILD_H_
|
||||
#define _DBAGENT_SERVER_PARSE_GUILD_H_
|
||||
|
||||
// forward delc.
|
||||
class CSendStream;
|
||||
struct PktBase;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace ParseGuild
|
||||
{
|
||||
bool CreateGuild(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
bool GuildCmd(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
bool GuildMark(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
bool GuildLevel(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
bool GuildRelation(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
bool GuildInclination(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
bool SetGuildRight(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
bool GuildSafe(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
bool GuildMemberInfoUpdate(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,345 @@
|
||||
#include "stdafx.h"
|
||||
#include "ParseMoveZone.h"
|
||||
|
||||
#include <Creature/CreatureManager.h>
|
||||
#include <Network/Dispatch/GameDispatch.h>
|
||||
#include <Network/SendPacket/SendMoveZone.h>
|
||||
|
||||
#include <Network/Packet/PacketStruct/ServerInfo.h>
|
||||
#include <Network/Packet/PacketStruct/ServerPacket.h>
|
||||
|
||||
#include <DataStorage/CharacterData.h>
|
||||
#include <DataStorage/SessionData.h>
|
||||
#include <DataStorage/SessionDataMgr.h>
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
|
||||
#include <GameTime/GameTimeDBMgr.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace ParseMoveZone
|
||||
{
|
||||
|
||||
bool CharMoveZone(CSendStream& SendStream, PktSZMvD* lpPktSZMvD);
|
||||
bool ServerZone(CSendStream& SendStream, PktSA* lpPktSA);
|
||||
bool ServerZoneEnd(CSendStream& SendStream, PktDD* lpPktDD);
|
||||
|
||||
|
||||
bool Parse(CSendStream& SendStream, PktBase* lpPktBase)
|
||||
{
|
||||
bool bResult = false;
|
||||
|
||||
PktDD* lpPktDD = static_cast<PktDD*>(lpPktBase);
|
||||
|
||||
switch (lpPktDD->m_wCmd)
|
||||
{
|
||||
case PktDD::SCmdCharMoveZone:
|
||||
bResult = CharMoveZone(SendStream, static_cast<PktSZMvD*>(lpPktDD));
|
||||
break;
|
||||
|
||||
case PktDD::SCmdServerZone:
|
||||
bResult = ServerZone(SendStream, static_cast<PktSA*>(lpPktDD));
|
||||
break;
|
||||
|
||||
case PktDD::SCmdServerZoneEnd:
|
||||
bResult = ServerZoneEnd(SendStream, lpPktDD);
|
||||
break;
|
||||
|
||||
default:
|
||||
ERRLOG1(g_Log, "ZoneMove <20><>Ŷ ó<><C3B3> <20><><EFBFBD><EFBFBD> : <20><> <20><> <20><><EFBFBD><EFBFBD> <20><>Ŷ CMD:0x%02X<32><58> <20>ҽ<DEBE><D2BD>ϴ<EFBFBD>.",
|
||||
lpPktDD->m_wCmd);
|
||||
|
||||
bResult = true;
|
||||
break;
|
||||
}
|
||||
|
||||
return bResult;
|
||||
}
|
||||
|
||||
|
||||
class CFindGameServerDispatch
|
||||
{
|
||||
public:
|
||||
|
||||
CFindGameServerDispatch(CGameDispatch*& lpGameDispatch, SERVER_ID serverID)
|
||||
: m_lpGameDispatch(lpGameDispatch), m_serverID(serverID)
|
||||
{
|
||||
m_lpGameDispatch = 0;
|
||||
}
|
||||
|
||||
bool operator() (unsigned long dwServerID, CPacketDispatch& packetDispatch)
|
||||
{
|
||||
if(0 == m_lpGameDispatch)
|
||||
{
|
||||
SERVER_ID serverID;
|
||||
serverID.dwID = dwServerID;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> ID<49><44> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20>ٸ<EFBFBD><D9B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, ä<>θ<EFBFBD> -1<>̰<EFBFBD> <20>ٸ<EFBFBD><D9B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
if ((serverID.dwID == m_serverID.dwID) ||
|
||||
|
||||
(-1 == m_serverID.GetChannel() &&
|
||||
serverID.GetZone() == m_serverID.GetZone() &&
|
||||
serverID.GetGroup() == m_serverID.GetGroup() &&
|
||||
serverID.GetType() == m_serverID.GetType()))
|
||||
{
|
||||
m_lpGameDispatch = &static_cast<CGameDispatch&>(packetDispatch);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
CGameDispatch*& m_lpGameDispatch;
|
||||
SERVER_ID m_serverID;
|
||||
};
|
||||
|
||||
|
||||
bool CharMoveZone(CSendStream& SendStream, PktSZMvD* lpPktSZMvD)
|
||||
{
|
||||
unsigned long dwRequestKey = lpPktSZMvD->m_dwRequestKey;
|
||||
unsigned long dwUID = lpPktSZMvD->m_dwUserID;
|
||||
|
||||
const POS& Pos = lpPktSZMvD->m_NewPos;
|
||||
char cZone = lpPktSZMvD->m_cZone;
|
||||
char cChannel = lpPktSZMvD->m_cChannel;
|
||||
|
||||
#ifdef ENABLE_PACKET_LOG
|
||||
DETLOG4(g_PacketLog, "ParseMoveZone::CharMoveZone : UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / ",
|
||||
dwUID, 0, 0, 0);
|
||||
#endif
|
||||
|
||||
unsigned short usError = 0;
|
||||
|
||||
using namespace DataStorage;
|
||||
|
||||
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession(dwUID);
|
||||
CCharacterData* lpCharacterData = 0;
|
||||
|
||||
SERVER_ID serverID;
|
||||
serverID.sID.Type = CServerSetup::GameServer;
|
||||
serverID.sID.Group = CServerSetup::GetInstance().GetServerGroup();
|
||||
serverID.sID.Channel = cChannel;
|
||||
serverID.sID.ID = cZone;
|
||||
|
||||
CGameDispatch* lpGameDispatch = 0;
|
||||
|
||||
CGameDispatch::GetDispatchTable().Process(
|
||||
CFindGameServerDispatch(lpGameDispatch, serverID));
|
||||
|
||||
if (0 == lpSessionData)
|
||||
{
|
||||
ERRLOG1(g_Log, "UID:%10u / ij<><C4B3><EFBFBD><EFBFBD> <20>̵<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>.", dwUID);
|
||||
usError = PktSZMvDAck::FAIL_INVALID_CHAR;
|
||||
}
|
||||
else if (0 == (lpCharacterData = lpSessionData->GetCharacterData()))
|
||||
{
|
||||
ERRLOG1(g_Log, "UID:%10u / ij<><C4B3><EFBFBD><EFBFBD> <20>̵<EFBFBD> <20><><EFBFBD><EFBFBD> : ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20>ʾҽ<CABE><D2BD>ϴ<EFBFBD>.", dwUID);
|
||||
usError = PktSZMvDAck::FAIL_INVALID_CHAR;
|
||||
}
|
||||
else if (0 == lpGameDispatch)
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / ServerID:0x%08X / ij<><C4B3><EFBFBD><EFBFBD> <20>̵<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.",
|
||||
dwUID, serverID.dwID);
|
||||
|
||||
usError = PktSZMvDAck::FAIL_INVALID_ZONE;
|
||||
}
|
||||
else if (0 == lpSessionData->GetAdminLevel())
|
||||
{
|
||||
// edith 2009.06.13 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> üũ
|
||||
if(SERVER_ID::STONE_WAR1 <= cZone && cZone <= SERVER_ID::STONE_WAR3)
|
||||
{
|
||||
if (CServerSetup::GetInstance().GetBattleLimit() < lpGameDispatch->GetCharNum())
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʹ<EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
ERRLOG2(g_Log, "UID:%10u / ServerID:0x%08X / ij<><C4B3><EFBFBD><EFBFBD> <20>̵<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.",
|
||||
dwUID, serverID.dwID);
|
||||
|
||||
usError = PktSZMvDAck::FAIL_PERSONNEL_OVER;
|
||||
}
|
||||
else
|
||||
{
|
||||
int maxDefaultUser = 10;
|
||||
float limitPer = (float)CServerSetup::GetInstance().GetBattleLimitPer()/100.f;
|
||||
if(limitPer < 1.0f)
|
||||
limitPer = 1.0f;
|
||||
|
||||
int akhanUser = lpGameDispatch->GetCharNum(CClass::AKHAN);
|
||||
int humanUser = lpGameDispatch->GetCharNum(CClass::HUMAN);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20>ΰ<EFBFBD><CEB0>̰<EFBFBD>, <20>ΰ<EFBFBD><CEB0><EFBFBD> <20><>ĭ<EFBFBD><C4AD><EFBFBD><EFBFBD> 1.5<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ȳ<EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>.
|
||||
if (CClass::HUMAN == lpCharacterData->GetRace())
|
||||
{
|
||||
int overCount = (int)((float)akhanUser * limitPer) - akhanUser;
|
||||
if(overCount < maxDefaultUser)
|
||||
overCount = maxDefaultUser;
|
||||
|
||||
int overUser = akhanUser + overCount;
|
||||
|
||||
if(overUser < lpGameDispatch->GetCharNum(CClass::HUMAN))
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / ServerID:0x%08X / ij<><C4B3><EFBFBD><EFBFBD> <20>̵<EFBFBD> <20><><EFBFBD><EFBFBD> : <20>ΰ<EFBFBD><CEB0><EFBFBD><EFBFBD><EFBFBD> <20>ұ<EFBFBD><D2B1><EFBFBD>.",
|
||||
dwUID, serverID.dwID);
|
||||
|
||||
usError = PktSZMvDAck::FAIL_PERSONNEL_OVER;
|
||||
}
|
||||
}
|
||||
// <20><><EFBFBD><EFBFBD> <20><>ĭ<EFBFBD>̰<EFBFBD>, <20><>ĭ<EFBFBD><C4AD> <20>ΰ<EFBFBD><CEB0><EFBFBD><EFBFBD><EFBFBD> 1.5<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ȳ<EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>.
|
||||
else if (CClass::AKHAN == lpCharacterData->GetRace())
|
||||
{
|
||||
int overCount = (int)((float)humanUser * limitPer) - humanUser;
|
||||
if(overCount < maxDefaultUser)
|
||||
overCount = maxDefaultUser;
|
||||
|
||||
int overUser = humanUser + overCount;
|
||||
|
||||
if(overUser < lpGameDispatch->GetCharNum(CClass::AKHAN))
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / ServerID:0x%08X / ij<><C4B3><EFBFBD><EFBFBD> <20>̵<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><>ĭ<EFBFBD><C4AD><EFBFBD><EFBFBD> <20>ұ<EFBFBD><D2B1><EFBFBD>.",
|
||||
dwUID, serverID.dwID);
|
||||
|
||||
usError = PktSZMvDAck::FAIL_PERSONNEL_OVER;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (SERVER_ID::ZONE3 == cZone)
|
||||
{
|
||||
// <20><>Ʋ<EFBFBD><EFBFBD><D7B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ο<EFBFBD> <20><><EFBFBD><EFBFBD> üũ
|
||||
// 2008.10.12 ZONE3<45><33> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
ERRLOG3(g_Log, "UID:%10u / 3<><33> <20><> <20><><EFBFBD><EFBFBD> <20>õ<EFBFBD> : Zone(%d,%d)", dwUID, cZone, cChannel);
|
||||
usError = PktSZMvDAck::FAIL_INVALID_CHAR;
|
||||
|
||||
/*
|
||||
SYSTEMTIME systemTime;
|
||||
GetSystemTime(&systemTime);
|
||||
|
||||
// <20><>Ʋ <20><EFBFBD><D7B6><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
|
||||
if ((systemTime.wMinute >= STATUE_REST_TIME_1ST_START && systemTime.wMinute <= STATUE_REST_TIME_1ST_END) ||
|
||||
(systemTime.wMinute >= STATUE_REST_TIME_2ND_START && systemTime.wMinute <= STATUE_REST_TIME_2ND_END))
|
||||
{
|
||||
cZone = lpDataSession->GetCharDataSession().GetCharStartZone(lpCharacterData->GetRace());
|
||||
}
|
||||
*/
|
||||
/* SERVER_ID serverID;
|
||||
serverID.sID.Type = CServerSetup::GameServer;
|
||||
serverID.sID.Group = CServerSetup::GetInstance().GetServerGroup();
|
||||
serverID.sID.Channel = cChannel;
|
||||
serverID.sID.ID = cZone;
|
||||
|
||||
CGameDispatch* lpGameDispatch = 0;
|
||||
|
||||
CGameDispatch::GetDispatchTable().Process(
|
||||
CFindGameServerDispatch(lpGameDispatch, serverID));
|
||||
|
||||
if (0 == lpGameDispatch)
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / ServerID:0x%08X / ij<><C4B3><EFBFBD><EFBFBD> <20>̵<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.",
|
||||
dwUID, serverID.dwID);
|
||||
|
||||
usError = PktSZMvDAck::FAIL_INVALID_ZONE;
|
||||
}
|
||||
else if (CServerSetup::GetInstance().GetBattleLimit() > lpGameDispatch->GetCharNum())
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20>ΰ<EFBFBD><CEB0>̰<EFBFBD>, <20>ΰ<EFBFBD><CEB0><EFBFBD> <20><>ĭ<EFBFBD><C4AD><EFBFBD><EFBFBD> 1.5<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ȳ<EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>.
|
||||
if (CClass::HUMAN == lpCharacterData->GetRace() &&
|
||||
lpGameDispatch->GetCharNum(CClass::AKHAN) * 1.5 < lpGameDispatch->GetCharNum(CClass::HUMAN))
|
||||
{
|
||||
usError = PktSZMvDAck::FAIL_PERSONNEL_OVER;
|
||||
}
|
||||
// <20><><EFBFBD><EFBFBD> <20><>ĭ<EFBFBD>̰<EFBFBD>, <20><>ĭ<EFBFBD><C4AD> <20>ΰ<EFBFBD><CEB0><EFBFBD><EFBFBD><EFBFBD> 1.5<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ȳ<EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>.
|
||||
else if (CClass::AKHAN == lpCharacterData->GetRace() &&
|
||||
lpGameDispatch->GetCharNum(CClass::HUMAN ) * 1.5 < lpGameDispatch->GetCharNum(CClass::AKHAN))
|
||||
{
|
||||
usError = PktSZMvDAck::FAIL_PERSONNEL_OVER;
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
// if(SERVER_ID::STONE_WAR1 <= cZone && cZone <= SERVER_ID::STONE_WAR3)
|
||||
// usError = PktSZMvDAck::FAIL_PERSONNEL_OVER;
|
||||
|
||||
if(0 == usError && 0 != lpSessionData)
|
||||
{
|
||||
// <20≯<EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD>
|
||||
if (!lpSessionData->SetMoveZone(cZone, Pos))
|
||||
{
|
||||
/*
|
||||
if(SERVER_ID::ZONE5 == cZone && !CGameTimeDBMgr::GetInstance().IsEnterTime())
|
||||
{
|
||||
// <20><EFBFBD><D7BC><EFBFBD> <20>ű<EFBFBD><C5B1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѿ<EFBFBD> <20>ɷ<EFBFBD><C9B7><EFBFBD>.
|
||||
DETLOG5(g_Log, "UID:%10u / Zone:%2u / X:%f / Y:%f / Z:%f / ij<><C4B3><EFBFBD><EFBFBD> <20>̵<EFBFBD> <20><><EFBFBD><EFBFBD> : <20>ű<EFBFBD><C5B1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.",
|
||||
dwUID, cZone, Pos.fPointX, Pos.fPointY, Pos.fPointZ);
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG5(g_Log, "UID:%10u / Zone:%2u / X:%f / Y:%f / Z:%f / ij<><C4B3><EFBFBD><EFBFBD> <20>̵<EFBFBD> <20><><EFBFBD><EFBFBD> : <20>߸<EFBFBD><DFB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD> <20>õ<EFBFBD>.",
|
||||
dwUID, cZone, Pos.fPointX, Pos.fPointY, Pos.fPointZ);
|
||||
}
|
||||
*/
|
||||
ERRLOG5(g_Log, "UID:%10u / Zone:%2u / X:%f / Y:%f / Z:%f / ij<><C4B3><EFBFBD><EFBFBD> <20>̵<EFBFBD> <20><><EFBFBD><EFBFBD> : <20>߸<EFBFBD><DFB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD> <20>õ<EFBFBD>.",
|
||||
dwUID, cZone, Pos.fPointX, Pos.fPointY, Pos.fPointZ);
|
||||
|
||||
usError = PktSZMvDAck::FAIL_INVALID_ZONE;
|
||||
}
|
||||
}
|
||||
|
||||
// edith 2009.06.28 <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD><EFBFBD>н<EFBFBD> <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD>ش<EFBFBD>.
|
||||
// gameserver<65><72><EFBFBD><EFBFBD> dbagnet<65><74> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ҽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
if(0 != usError)
|
||||
{
|
||||
if(SERVER_ID::STONE_WAR1 <= cZone && cZone <= SERVER_ID::STONE_WAR3)
|
||||
lpCharacterData->SetRealmWarFlag(Creature::WAR_OFF);
|
||||
else if(SERVER_ID::CAPITAL == cZone)
|
||||
lpCharacterData->SetGuildWarFlag(Creature::WAR_OFF);
|
||||
}
|
||||
|
||||
return (-1 == cChannel || 0 != usError) ?
|
||||
// ä<><C3A4><EFBFBD><EFBFBD> -1<>̰ų<CCB0>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD>.
|
||||
SendPacket::CharMoveZone(SendStream, dwRequestKey, cZone, usError)
|
||||
: SendPacket::ServerZone(SendStream, dwRequestKey, cZone, cChannel);
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool ServerZone(CSendStream& SendStream, PktSA* lpPktSA)
|
||||
{
|
||||
unsigned long dwUID = lpPktSA->m_dwUserID;
|
||||
unsigned short usError = 0;
|
||||
|
||||
#ifdef ENABLE_PACKET_LOG
|
||||
DETLOG4(g_PacketLog, "ParseMoveZone::ServerZone : UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / ",
|
||||
dwUID, 0, 0, 0);
|
||||
#endif
|
||||
|
||||
using namespace DataStorage;
|
||||
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession(dwUID);
|
||||
if (0 == lpSessionData)
|
||||
{
|
||||
ERRLOG1(g_Log, "UID:%10u / ServerZone <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>.", dwUID);
|
||||
usError = PktSAAck::SERVER_ERROR;
|
||||
}
|
||||
|
||||
return SendPacket::ServerZone(SendStream,
|
||||
lpPktSA->m_dwRequestKey, lpPktSA->m_cZone, lpPktSA->m_cChannel, usError);
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool ServerZoneEnd(CSendStream& SendStream, PktDD* lpPktDD)
|
||||
{
|
||||
#ifdef ENABLE_PACKET_LOG
|
||||
DETLOG4(g_PacketLog, "ParseMoveZone::ServerZoneEnd : UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / ",
|
||||
0, 0, 0, 0);
|
||||
#endif
|
||||
|
||||
return SendPacket::ServerZoneEnd(SendStream, lpPktDD->m_dwRequestKey);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
#ifndef _DBAGENT_SERVER_PARSE_MOVE_ZONE_H_
|
||||
#define _DBAGENT_SERVER_PARSE_MOVE_ZONE_H_
|
||||
|
||||
// forward delc.
|
||||
class CSendStream;
|
||||
struct PktBase;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace ParseMoveZone
|
||||
{
|
||||
bool Parse(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,386 @@
|
||||
#include "stdafx.h"
|
||||
#include "ParseParty.h"
|
||||
|
||||
#include <Community/Party/PartyDBInfo.h>
|
||||
#include <Community/Party/PartyDBMgr.h>
|
||||
#include <Community/Guild/Guild.h>
|
||||
#include <Community/Guild/GuildMgr.h>
|
||||
|
||||
#include <Network/Stream/SendStream.h>
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
#include <Network/Packet/WrapPacket.h>
|
||||
#include <Network/Packet/PacketStruct/PartyPacket.h>
|
||||
#include <Network/Dispatch/GameDispatch.h>
|
||||
#include <Network/SendPacket/SendParty.h>
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
#include <DB/DBComponent.h>
|
||||
|
||||
#include <DataStorage/SessionData.h>
|
||||
#include <DataStorage/CharacterData.h>
|
||||
#include <DataStorage/SessionDataMgr.h>
|
||||
|
||||
#include <Community/Guild/Guild.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace ParseParty
|
||||
{
|
||||
|
||||
bool CreateParty(CSendStream& SendStream, PktCPD* lpPktCPD);
|
||||
bool DeleteParty(CSendStream& SendStream, PktDPD* lpPktDPD);
|
||||
bool GetPartyInfo(CSendStream& SendStream, PktPID* lpPktPID);
|
||||
bool TransferLeader(CSendStream& SendStream, PktPMD* lpPktPMD);
|
||||
bool InsertPartyMember(CSendStream& SendStream, PktPMD* lpPktPMD);
|
||||
bool DeletePartyMember(CSendStream& SendStream, PktPMD* lpPktPMD);
|
||||
bool AutoRoutingOn(CSendStream& SendStream, PktPMD* lpPktPMD);
|
||||
bool AutoRoutingOff(CSendStream& SendStream, PktPMD* lpPktPMD);
|
||||
bool RelayPacket(CSendStream& SendStream, PktDD* lpPktDD);
|
||||
|
||||
bool Parse(CSendStream& SendStream, PktBase* lpPktBase)
|
||||
{
|
||||
bool bResult = false;
|
||||
|
||||
PktDD* lpPktDD = static_cast<PktDD*>(lpPktBase);
|
||||
|
||||
switch (lpPktDD->m_wCmd)
|
||||
{
|
||||
case PktDD::SCmdCreateParty: bResult = CreateParty(SendStream, static_cast<PktCPD*>(lpPktDD)); break; // <20><>Ƽ <20><><EFBFBD><EFBFBD>
|
||||
case PktDD::SCmdDeleteParty: bResult = DeleteParty(SendStream, static_cast<PktDPD*>(lpPktDD)); break; // <20><>Ƽ <20><><EFBFBD><EFBFBD>
|
||||
case PktDD::SCmdGetPartyInfo: bResult = GetPartyInfo(SendStream, static_cast<PktPID*>(lpPktDD)); break; // <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
case PktDD::SCmdTransferLeader: bResult = TransferLeader(SendStream, static_cast<PktPMD*>(lpPktDD)); break; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>絵
|
||||
case PktDD::SCmdInsertPartyMem: bResult = InsertPartyMember(SendStream, static_cast<PktPMD*>(lpPktDD)); break; // <20><>Ƽ <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD>
|
||||
case PktDD::SCmdDeletePartyMem: bResult = DeletePartyMember(SendStream, static_cast<PktPMD*>(lpPktDD)); break; // <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
case PktDD::SCmdDeadPartyMem:
|
||||
case PktDD::SCmdMoveZonePartyMem:
|
||||
case PktDD::SCmdLevelUpPartyMem:
|
||||
case PktDD::SCmdChangeClassPartyMem:
|
||||
case PktDD::SCmdChangeGuildPartyMem:
|
||||
bResult = RelayPacket(SendStream, lpPktDD);
|
||||
break;
|
||||
|
||||
case PktDD::SCmdAutoRoutingOn: bResult = AutoRoutingOn(SendStream, static_cast<PktPMD*>(lpPktDD)); break; // <20><>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ѱ<EFBFBD>
|
||||
case PktDD::SCmdAutoRoutingOff: bResult = AutoRoutingOff(SendStream, static_cast<PktPMD*>(lpPktDD)); break; // <20><>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
default:
|
||||
bResult = true;
|
||||
ERRLOG1(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : Cmd:0x%02x <20><> <20><> <20><><EFBFBD><EFBFBD> <20><>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", lpPktDD->m_wCmd);
|
||||
break;
|
||||
}
|
||||
|
||||
if(!bResult)
|
||||
{
|
||||
ERRLOG1(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : Cmd:0x%02x <20><><EFBFBD><EFBFBD> ó<><C3B3> <20><><EFBFBD><EFBFBD>.", lpPktDD->m_wCmd);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CreateParty(CSendStream& SendStream, PktCPD* lpPktCPD)
|
||||
{
|
||||
// <20><>Ƽ <20><><EFBFBD><EFBFBD>
|
||||
CPartyDBInfo* lpParty = CPartyDBMgr::GetInstance().CreateParty(CDBSingleObject::GetInstance(), lpPktCPD->m_dwLeaderID, lpPktCPD->m_cLeaderLevel,
|
||||
lpPktCPD->m_wLeaderClass, lpPktCPD->m_dwLeaderGID, lpPktCPD->m_dwMemberID, lpPktCPD->m_cMemberLevel, lpPktCPD->m_wMemberClass, lpPktCPD->m_dwMemberGID);
|
||||
|
||||
char* lpBuffer = 0;
|
||||
|
||||
if (0 == lpParty)
|
||||
{
|
||||
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : LeaderCID:%10u / MemberCID:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
lpPktCPD->m_dwLeaderID, lpPktCPD->m_dwMemberID);
|
||||
}
|
||||
else
|
||||
{
|
||||
PktCPDAck sPktCPDAck;
|
||||
memset(&sPktCPDAck, 0, sizeof(PktCPDAck));
|
||||
sPktCPDAck.m_wCmd = lpPktCPD->m_wCmd;
|
||||
sPktCPDAck.m_Party = lpParty->GetParty();
|
||||
|
||||
sPktCPDAck.m_dwLeaderID = lpPktCPD->m_dwLeaderID;
|
||||
sPktCPDAck.m_dwMemberID = lpPktCPD->m_dwMemberID;
|
||||
sPktCPDAck.m_dwLeaderGID = lpPktCPD->m_dwLeaderGID;
|
||||
sPktCPDAck.m_wLeaderClass = lpPktCPD->m_wLeaderClass;
|
||||
sPktCPDAck.m_cLeaderLevel = lpPktCPD->m_cLeaderLevel;
|
||||
sPktCPDAck.m_dwMemberGID = lpPktCPD->m_dwMemberGID;
|
||||
sPktCPDAck.m_wMemberClass = lpPktCPD->m_wMemberClass;
|
||||
sPktCPDAck.m_cMemberLevel = lpPktCPD->m_cMemberLevel;
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ //
|
||||
lpParty->SetUserInfoLevel(lpPktCPD->m_dwLeaderID, lpPktCPD->m_cLeaderLevel);
|
||||
lpParty->SetUserInfoClass(lpPktCPD->m_dwLeaderID, lpPktCPD->m_wLeaderClass);
|
||||
lpParty->SetUserInfoGID(lpPktCPD->m_dwLeaderID, lpPktCPD->m_dwLeaderGID);
|
||||
|
||||
lpParty->SetUserInfoLevel(lpPktCPD->m_dwMemberID, lpPktCPD->m_cMemberLevel);
|
||||
lpParty->SetUserInfoClass(lpPktCPD->m_dwMemberID, lpPktCPD->m_wMemberClass);
|
||||
lpParty->SetUserInfoGID(lpPktCPD->m_dwMemberID, lpPktCPD->m_dwMemberGID);
|
||||
|
||||
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&sPktCPDAck), sizeof(PktCPDAck), CmdAgentParty, 0, 0))
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD> //
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&sPktCPDAck), sizeof(PktCPDAck), CmdAgentParty));
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool DeleteParty(CSendStream& SendStream, PktDPD* lpPktDPD)
|
||||
{
|
||||
// <20><>Ƽ <20><><EFBFBD><EFBFBD>
|
||||
if (!CPartyDBMgr::GetInstance().DestoryParty(
|
||||
CDBSingleObject::GetInstance(), lpPktDPD->m_dwPartyID))
|
||||
{
|
||||
ERRLOG1(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", lpPktDPD->m_dwPartyID);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool GetPartyInfo(CSendStream& SendStream, PktPID* lpPktPID)
|
||||
{
|
||||
unsigned long dwPID = lpPktPID->m_dwPartyID;
|
||||
unsigned long dwCID = lpPktPID->m_dwCharID;
|
||||
|
||||
// <20><>Ƽ <20><><EFBFBD><EFBFBD>
|
||||
CPartyDBInfo* lpParty = CPartyDBMgr::GetInstance().OpenParty(
|
||||
CDBSingleObject::GetInstance(), dwPID);
|
||||
|
||||
if (0 == lpParty)
|
||||
{
|
||||
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
dwPID, dwCID);
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned long dwServerID = 0;
|
||||
|
||||
using namespace DataStorage;
|
||||
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(dwCID);
|
||||
if(0 != lpSessionData)
|
||||
{
|
||||
dwServerID = lpSessionData->GetServerID();
|
||||
}
|
||||
|
||||
// lpParty->PartyMemAllLogout();
|
||||
// lpParty->PartyMemLogin(dwCID, dwSID);
|
||||
// lpParty->SetLeader(dwCID);
|
||||
|
||||
DETLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", dwPID, dwCID);
|
||||
|
||||
// <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
PktPIDAck pktPIDAck;
|
||||
memset(&pktPIDAck, 0, sizeof(PktPIDAck));
|
||||
|
||||
pktPIDAck.m_wCmd = lpPktPID->m_wCmd;
|
||||
pktPIDAck.m_Party = lpParty->GetParty();
|
||||
pktPIDAck.m_dwCharID = lpPktPID->m_dwCharID;
|
||||
pktPIDAck.m_dwGID = lpPktPID->m_dwGID;
|
||||
pktPIDAck.m_wClass = lpPktPID->m_wClass;
|
||||
pktPIDAck.m_cLevel = lpPktPID->m_cLevel;
|
||||
pktPIDAck.m_dwServerID = lpPktPID->m_dwServerID;
|
||||
|
||||
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktPIDAck),
|
||||
sizeof(PktPIDAck), CmdAgentParty, 0, 0))
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD> //
|
||||
CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktPIDAck), sizeof(PktPIDAck), CmdAgentParty));
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TransferLeader(CSendStream& SendStream, PktPMD* lpPktPMD)
|
||||
{
|
||||
unsigned long dwPartyID = lpPktPMD->m_dwPartyID;
|
||||
unsigned long dwSenderID = lpPktPMD->m_dwSenderID;
|
||||
unsigned long dwReferenceID = lpPktPMD->m_dwGID;
|
||||
|
||||
using namespace DataStorage;
|
||||
CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(dwSenderID);
|
||||
CCharacterData* lpCharacterData = 0;
|
||||
CPartyDBInfo* lpParty = 0;
|
||||
|
||||
if(0 == lpSessionData)
|
||||
{
|
||||
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / <20><><EFBFBD><EFBFBD> <20>̾<EFBFBD> <20><><EFBFBD><EFBFBD> : ij<><C4B3><EFBFBD><EFBFBD> ã<><C3A3> <20><><EFBFBD><EFBFBD>",
|
||||
dwPartyID, dwSenderID);
|
||||
}
|
||||
else if(0 == (lpCharacterData = lpSessionData->GetCharacterData()))
|
||||
{
|
||||
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / <20><><EFBFBD><EFBFBD> <20>̾<EFBFBD> <20><><EFBFBD><EFBFBD> : ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
dwPartyID, dwSenderID);
|
||||
}
|
||||
else if(0 == (lpParty = CPartyDBMgr::GetInstance().FindPartyMap(dwPartyID)))
|
||||
{
|
||||
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / <20><><EFBFBD><EFBFBD> <20>̾<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><>Ƽ ã<><C3A3> <20><><EFBFBD><EFBFBD>",
|
||||
dwPartyID, dwSenderID);
|
||||
}
|
||||
else if(!lpParty->TransferLeader(dwReferenceID, dwSenderID))
|
||||
{
|
||||
ERRLOG3(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / OldLeaderCID:%10u / NewLeaderCID:%10u / <20><><EFBFBD><EFBFBD> <20>̾<EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
dwPartyID, dwReferenceID, dwSenderID);
|
||||
}
|
||||
else
|
||||
{
|
||||
DETLOG3(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / OldLeaderCID:%10u / NewLeaderCID:%10u / <20><><EFBFBD><EFBFBD> <20>̾<EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
dwPartyID, dwReferenceID, dwSenderID);
|
||||
|
||||
SendPacket::PartyCmd(PktDD::SCmdTransferLeader, lpParty->GetPID(), dwSenderID, 0, 0,
|
||||
lpSessionData->GetServerID(), 0, lpCharacterData->GetName());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool InsertPartyMember(CSendStream& SendStream, PktPMD* lpPktPMD)
|
||||
{
|
||||
unsigned long dwPartyID = lpPktPMD->m_dwPartyID;
|
||||
unsigned long dwSenderID = lpPktPMD->m_dwSenderID;
|
||||
unsigned long dwGID = lpPktPMD->m_dwGID;
|
||||
unsigned short wClass = lpPktPMD->m_wClass;
|
||||
char cLevel = lpPktPMD->m_cLevel;
|
||||
|
||||
// <20><>Ƽ<EFBFBD><C6BC> <20>߰<EFBFBD>
|
||||
if (!CPartyDBMgr::GetInstance().InsertPartyMember(
|
||||
CDBSingleObject::GetInstance(), dwPartyID, dwSenderID, dwGID, wClass, cLevel))
|
||||
{
|
||||
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD>", dwPartyID, dwSenderID);
|
||||
}
|
||||
|
||||
CPartyDBInfo* lpParty = CPartyDBMgr::GetInstance().OpenParty(CDBSingleObject::GetInstance(), dwPartyID);
|
||||
|
||||
if(lpParty)
|
||||
{
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ //
|
||||
lpParty->SetUserInfoLevel(dwSenderID, cLevel);
|
||||
lpParty->SetUserInfoClass(dwSenderID, wClass);
|
||||
lpParty->SetUserInfoGID(dwSenderID, dwGID);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool DeletePartyMember(CSendStream& SendStream, PktPMD* lpPktPMD)
|
||||
{
|
||||
unsigned long dwPartyID = lpPktPMD->m_dwPartyID;
|
||||
unsigned long dwSenderID = lpPktPMD->m_dwSenderID;
|
||||
unsigned long dwReferenceID = lpPktPMD->m_dwGID;
|
||||
|
||||
// ű<><C5B1> <20><><EFBFBD><EFBFBD>
|
||||
if (dwSenderID != dwReferenceID)
|
||||
{
|
||||
dwReferenceID = 0;
|
||||
}
|
||||
|
||||
CPartyDBInfo* lpParty = CPartyDBMgr::GetInstance().OpenParty(CDBSingleObject::GetInstance(), dwPartyID);
|
||||
|
||||
if(lpParty)
|
||||
{
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ //
|
||||
lpParty->SetUserInfoLevel(dwSenderID, 0);
|
||||
lpParty->SetUserInfoClass(dwSenderID, 0);
|
||||
lpParty->SetUserInfoGID(dwSenderID, 0);
|
||||
}
|
||||
|
||||
// <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD>
|
||||
if (!CPartyDBMgr::GetInstance().DeletePartyMember(
|
||||
CDBSingleObject::GetInstance(), dwPartyID, dwSenderID, dwReferenceID))
|
||||
{
|
||||
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", dwPartyID, dwSenderID);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool AutoRoutingOn(CSendStream& SendStream, PktPMD* lpPktPMD)
|
||||
{
|
||||
unsigned long dwPartyID = lpPktPMD->m_dwPartyID;
|
||||
unsigned long dwSenderID = lpPktPMD->m_dwSenderID;
|
||||
unsigned long dwReferenceID = lpPktPMD->m_dwGID;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ѱ<EFBFBD>
|
||||
if (!CPartyDBMgr::GetInstance().AutoRoutingOn(
|
||||
CDBSingleObject::GetInstance(), dwPartyID, dwSenderID))
|
||||
{
|
||||
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ѱ<EFBFBD> <20><><EFBFBD><EFBFBD> (CID <20><> 0<≯<EFBFBD> ALL)",
|
||||
dwPartyID, dwSenderID);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool AutoRoutingOff(CSendStream& SendStream, PktPMD* lpPktPMD)
|
||||
{
|
||||
unsigned long dwPartyID = lpPktPMD->m_dwPartyID;
|
||||
unsigned long dwSenderID = lpPktPMD->m_dwSenderID;
|
||||
unsigned long dwReferenceID = lpPktPMD->m_dwGID;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
if (!CPartyDBMgr::GetInstance().AutoRoutingOff(
|
||||
CDBSingleObject::GetInstance(), dwPartyID, dwSenderID))
|
||||
{
|
||||
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD> : PID:%10u / CID:%10u / ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (CID <20><> 0<≯<EFBFBD> ALL)",
|
||||
dwPartyID, dwSenderID);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool RelayPacket(CSendStream& SendStream, PktDD* lpPktDD)
|
||||
{
|
||||
unsigned short usPacketSize = lpPktDD->GetLen();
|
||||
|
||||
switch(lpPktDD->m_wCmd)
|
||||
{
|
||||
case PktDD::SCmdLevelUpPartyMem:
|
||||
case PktDD::SCmdChangeClassPartyMem:
|
||||
case PktDD::SCmdChangeGuildPartyMem:
|
||||
{
|
||||
PktPMD* lpPktPMD = static_cast<PktPMD*>(lpPktDD);
|
||||
|
||||
CPartyDBInfo* lpParty = CPartyDBMgr::GetInstance().OpenParty(CDBSingleObject::GetInstance(), lpPktPMD->m_dwPartyID);
|
||||
|
||||
if(lpParty)
|
||||
{
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ //
|
||||
if(PktDD::SCmdLevelUpPartyMem)
|
||||
{
|
||||
lpParty->SetUserInfoLevel(lpPktPMD->m_dwSenderID, lpPktPMD->m_cLevel);
|
||||
}
|
||||
if(PktDD::SCmdChangeClassPartyMem)
|
||||
{
|
||||
lpParty->SetUserInfoClass(lpPktPMD->m_dwSenderID, lpPktPMD->m_wClass);
|
||||
}
|
||||
if(PktDD::SCmdChangeGuildPartyMem)
|
||||
{
|
||||
lpParty->SetUserInfoGID(lpPktPMD->m_dwSenderID, lpPktPMD->m_dwGID);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(lpPktDD),
|
||||
usPacketSize, CmdAgentParty, 0, 0))
|
||||
{
|
||||
CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(lpPktDD), usPacketSize, CmdAgentParty));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
#ifndef _DBAGENT_SERVER_PARSE_PARTY_H_
|
||||
#define _DBAGENT_SERVER_PARSE_PARTY_H_
|
||||
|
||||
// forward delc.
|
||||
class CSendStream;
|
||||
struct PktBase;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace ParseParty
|
||||
{
|
||||
bool Parse(CSendStream& SendStream, PktBase* lpPktBase);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,244 @@
|
||||
#include "stdafx.h"
|
||||
#include "SendAdminTool.h"
|
||||
|
||||
#include <Network/Packet/PacketStruct/CharAdminPacket.h>
|
||||
#include <Network/Packet/PacketStruct/GameEventPacket.h>
|
||||
#include <Network/Packet/PacketStruct/CharLoginOutPacketStruct.h>
|
||||
#include <Network/Dispatch/AdminToolDispatch.h>
|
||||
|
||||
#include <Network/Packet/WrapPacket.h>
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
|
||||
#include <DataStorage/StoreData.h>
|
||||
#include <DataStorage/CharacterData.h>
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace SendPacket
|
||||
{
|
||||
|
||||
bool ItemQtyCheck(unsigned long dwItemTypeID, unsigned long dwItemQty,
|
||||
unsigned long dwCurrentItemQty, time_t tStartTime, time_t tEndTime,
|
||||
unsigned char cType, unsigned short usError)
|
||||
{
|
||||
PktItemQtyControl pktItemQtyControl;
|
||||
memset(&pktItemQtyControl, 0, sizeof(PktItemQtyControl));
|
||||
|
||||
pktItemQtyControl.m_dwItemTypeID = dwItemTypeID;
|
||||
pktItemQtyControl.m_dwItemQty = dwItemQty;
|
||||
pktItemQtyControl.m_dwCurrentItemQty = dwCurrentItemQty;
|
||||
pktItemQtyControl.m_tStartTime = tStartTime;
|
||||
pktItemQtyControl.m_tEndTime = tEndTime;
|
||||
|
||||
pktItemQtyControl.m_cType = cType;
|
||||
pktItemQtyControl.m_cGroup = CServerSetup::GetInstance().GetServerGroup();
|
||||
|
||||
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktItemQtyControl),
|
||||
sizeof(PktItemQtyControl), CmdItemQtyCheck, 0, usError))
|
||||
{
|
||||
DBAgent::CAdminToolDispatch::GetDispatchTable().Process(
|
||||
CSendPacketAllServer(reinterpret_cast<char*>(&pktItemQtyControl),
|
||||
sizeof(PktItemQtyControl), CmdItemQtyCheck));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool AdminToolGetDataAck(CSendStream& SendStream, PktAdminToolGetData::GetDataType dataType,
|
||||
unsigned long dwRequestKey, unsigned long dwUID, unsigned long dwCID,
|
||||
const char* lpData, unsigned long dwDataSize, unsigned short usError,
|
||||
unsigned char cOldServerGroupID)
|
||||
{
|
||||
// <20>ִ<EFBFBD> <20><>Ŷ ũ<>⺸<EFBFBD><E2BAB8> ũ<><C5A9> <20><><EFBFBD><EFBFBD>
|
||||
if(sizeof(PktAdminToolGetDataAck) + dwDataSize <= MAX_PACKET_LEN)
|
||||
{
|
||||
char szPacket[PktMaxLen];
|
||||
|
||||
PktAdminToolGetDataAck* lpPktAdminToolGetDataAck =
|
||||
reinterpret_cast<PktAdminToolGetDataAck*>(szPacket);
|
||||
|
||||
lpPktAdminToolGetDataAck->m_dwRequestKey = dwRequestKey;
|
||||
lpPktAdminToolGetDataAck->m_dwUID = dwUID;
|
||||
lpPktAdminToolGetDataAck->m_dwCID = dwCID;
|
||||
lpPktAdminToolGetDataAck->m_cType = dataType;
|
||||
lpPktAdminToolGetDataAck->m_cOldServerGroupID = cOldServerGroupID; // Part2Selectable Ÿ<>Կ<EFBFBD><D4BF><EFBFBD> <20>ʿ<EFBFBD>.
|
||||
|
||||
if(0 != lpData && 0 < dwDataSize)
|
||||
{
|
||||
memcpy(lpPktAdminToolGetDataAck + 1, lpData, dwDataSize);
|
||||
}
|
||||
else
|
||||
{
|
||||
dwDataSize = 0;
|
||||
}
|
||||
|
||||
return SendStream.WrapCompress(szPacket,
|
||||
static_cast<unsigned short>(sizeof(PktAdminToolGetDataAck) + dwDataSize),
|
||||
CmdAdminToolGetData, 0, usError);
|
||||
}
|
||||
|
||||
ERRLOG4(g_Log, "UID:%10u / CID:%10u / dwSize:%u / DataType:%d "
|
||||
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> + <20><><EFBFBD><EFBFBD> ũ<>Ⱑ <20>ִ<EFBFBD> <20><>Ŷ ũ<><C5A9> <20>̻<EFBFBD><CCBB>Դϴ<D4B4>",
|
||||
dwUID, dwCID, dwDataSize, dataType);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool AdminToolSetDataAck(CSendStream& SendStream, unsigned long dwRequestKey,
|
||||
unsigned long dwUID, unsigned long dwCID,
|
||||
unsigned char cType, unsigned short eErrorCode)
|
||||
{
|
||||
PktNewAdminToolSetDataAck* lpSetDataAck = reinterpret_cast<PktNewAdminToolSetDataAck*>(
|
||||
SendStream.GetBuffer(sizeof(PktNewAdminToolSetDataAck)));
|
||||
|
||||
if(0 != lpSetDataAck)
|
||||
{
|
||||
lpSetDataAck->m_dwRequestKey = dwRequestKey;
|
||||
lpSetDataAck->m_dwUID = dwUID;
|
||||
lpSetDataAck->m_dwCID = dwCID;
|
||||
lpSetDataAck->m_cType = cType;
|
||||
|
||||
return SendStream.WrapHeader(sizeof(PktNewAdminToolSetDataAck),
|
||||
CmdAdminToolSetData, 0, eErrorCode);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
inline void CopyAndAdvanceDst(char*& lpWritePos, const void* lpData, unsigned long dwSize)
|
||||
{
|
||||
memcpy(lpWritePos, lpData, dwSize);
|
||||
lpWritePos += dwSize;
|
||||
}
|
||||
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EEBFB5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
bool TotalDataToAdminTool(CSendStream& SendStream, unsigned long dwRequestKey, IN_ADDR peerAddr,
|
||||
DataStorage::CStoreData& storeData, DataStorage::CCharacterData& characterData)
|
||||
{
|
||||
unsigned long dwUID = storeData.GetUID();
|
||||
unsigned long dwCID = characterData.GetCID();
|
||||
|
||||
const unsigned long MAX_CHAR_DATA_SIZE = DBUpdateData::MAX_DBUPDATE_SIZE +
|
||||
sizeof(unsigned short) * DBUpdateData::MAX_UPDATE_DB;
|
||||
|
||||
const unsigned long MAX_CHAR_EXTRA_DATA_SIZE = sizeof(CHAR_INFOEX) +
|
||||
sizeof(QUEST) + sizeof(HISTORY) + sizeof(CONFIG) + sizeof(STORE_INFO);
|
||||
|
||||
const unsigned long MAX_FRIEND_BAN_DATA_SIZE =
|
||||
std::max(CFriendList::MAX_FRIENDS_NUM * sizeof(FriendInfo),
|
||||
CBanList::MAX_BAN_NUM * sizeof(BanInfo));
|
||||
|
||||
const unsigned long MAX_ADMIN_TOOL_DATA_SIZE = std::max(
|
||||
std::max(MAX_CHAR_DATA_SIZE, MAX_CHAR_EXTRA_DATA_SIZE), MAX_FRIEND_BAN_DATA_SIZE);
|
||||
|
||||
char* szDataBuffer = new char[MAX_ADMIN_TOOL_DATA_SIZE];
|
||||
|
||||
if(0 == szDataBuffer)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
const int MAX_ADDR_LEN = 32;
|
||||
char szAdminToolAddr[MAX_ADDR_LEN];
|
||||
_snprintf(szAdminToolAddr, MAX_ADDR_LEN - 1, "%s", inet_ntoa(peerAddr));
|
||||
szAdminToolAddr[MAX_ADDR_LEN - 1] = 0;
|
||||
|
||||
// ------------------------------------------------------------------------------------------
|
||||
// CHAR_BASIC_DATA <20><><EFBFBD><EFBFBD>
|
||||
|
||||
unsigned long dwCharDataWritten = MAX_ADMIN_TOOL_DATA_SIZE -
|
||||
sizeof(unsigned short) * DBUpdateData::MAX_UPDATE_DB;
|
||||
|
||||
char* szCharData = szDataBuffer + sizeof(unsigned short) * DBUpdateData::MAX_UPDATE_DB;
|
||||
unsigned short* usSizeArray = reinterpret_cast<unsigned short*>(szDataBuffer);
|
||||
|
||||
if(characterData.SerializeOut(szCharData, usSizeArray,
|
||||
dwCharDataWritten, DBUpdateData::MAX_UPDATE_DB))
|
||||
{
|
||||
dwCharDataWritten += sizeof(unsigned short) * DBUpdateData::MAX_UPDATE_DB;
|
||||
|
||||
if(SendPacket::AdminToolGetDataAck(SendStream, PktAdminToolGetData::CHAR_BASIC_DATA,
|
||||
dwRequestKey, dwUID, dwCID, szDataBuffer, dwCharDataWritten, 0))
|
||||
{
|
||||
INFLOG3(g_Log, "UID:%10u / CID:%10u / IP:%15s / <20><EFBFBD><EEBFB5><EFBFBD><EFBFBD> CHAR_BASIC_DATA <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", dwUID, dwCID, szAdminToolAddr);
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------
|
||||
// CHAR_EXTRA_DATA <20><><EFBFBD><EFBFBD>
|
||||
|
||||
char* szExtraDataPos = szDataBuffer;
|
||||
|
||||
CopyAndAdvanceDst(szExtraDataPos, &characterData.GetInfoEx(), sizeof(CHAR_INFOEX));
|
||||
CopyAndAdvanceDst(szExtraDataPos, &characterData.GetQuest(), sizeof(QUEST));
|
||||
CopyAndAdvanceDst(szExtraDataPos, &characterData.GetHistory(), sizeof(HISTORY));
|
||||
CopyAndAdvanceDst(szExtraDataPos, &characterData.GetConfig(), sizeof(CONFIG));
|
||||
CopyAndAdvanceDst(szExtraDataPos, &storeData.GetStoreInfo(), sizeof(STORE_INFO));
|
||||
|
||||
if(SendPacket::AdminToolGetDataAck(SendStream,
|
||||
PktAdminToolGetData::CHAR_EXTRA_DATA, dwRequestKey, dwUID, dwCID, szDataBuffer,
|
||||
static_cast<unsigned long>(szExtraDataPos - szDataBuffer), 0))
|
||||
{
|
||||
INFLOG3(g_Log, "UID:%10u / CID:%10u / IP:%15s / <20><EFBFBD><EEBFB5><EFBFBD><EFBFBD> CHAR_EXTRA_DATA <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", dwUID, dwCID, szAdminToolAddr);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------------------------
|
||||
// CHAR_FRIEND_DATA
|
||||
// CHAR_BAN_DATA
|
||||
|
||||
unsigned long dwFriendBanWritten = MAX_FRIEND_BAN_DATA_SIZE;
|
||||
|
||||
if(characterData.GetFriendList().SerializeOut(szDataBuffer, dwFriendBanWritten))
|
||||
{
|
||||
if(SendPacket::AdminToolGetDataAck(SendStream, PktAdminToolGetData::CHAR_FRIEND_DATA,
|
||||
dwRequestKey, dwUID, dwCID, szDataBuffer, dwFriendBanWritten, 0))
|
||||
{
|
||||
INFLOG3(g_Log, "UID:%10u / CID:%10u / IP:%15s / <20><EFBFBD><EEBFB5><EFBFBD><EFBFBD> CHAR_FRIEND_DATA <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", dwUID, dwCID, szAdminToolAddr);
|
||||
}
|
||||
}
|
||||
|
||||
dwFriendBanWritten = MAX_FRIEND_BAN_DATA_SIZE;
|
||||
if(characterData.GetBanList().SerializeOut(szDataBuffer, dwFriendBanWritten))
|
||||
{
|
||||
if(SendPacket::AdminToolGetDataAck(SendStream, PktAdminToolGetData::CHAR_BAN_DATA,
|
||||
dwRequestKey, dwUID, dwCID, szDataBuffer, dwFriendBanWritten, 0))
|
||||
{
|
||||
INFLOG3(g_Log, "UID:%10u / CID:%10u / IP:%15s / <20><EFBFBD><EEBFB5><EFBFBD><EFBFBD> CHAR_BAN_DATA <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", dwUID, dwCID, szAdminToolAddr);
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------------------------
|
||||
// STORE_12_DATA
|
||||
|
||||
if(SendPacket::AdminToolGetDataAck(SendStream, PktAdminToolGetData::STORE_12_DATA,
|
||||
dwRequestKey, dwUID, dwCID, reinterpret_cast<const char*>(&storeData.GetStore1()), sizeof(STORE), 0))
|
||||
{
|
||||
INFLOG3(g_Log, "UID:%10u / CID:%10u / IP:%15s / <20><EFBFBD><EEBFB5><EFBFBD><EFBFBD> STORE_12_DATA <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", dwUID, dwCID, szAdminToolAddr);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------------------------
|
||||
// STORE_34_DATA
|
||||
|
||||
if(SendPacket::AdminToolGetDataAck(SendStream, PktAdminToolGetData::STORE_34_DATA,
|
||||
dwRequestKey, dwUID, dwCID, reinterpret_cast<const char*>(&storeData.GetStore2()), sizeof(STORE), 0))
|
||||
{
|
||||
INFLOG3(g_Log, "UID:%10u / CID:%10u / IP:%15s / <20><EFBFBD><EEBFB5><EFBFBD><EFBFBD> STORE_34_DATA <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", dwUID, dwCID, szAdminToolAddr);
|
||||
}
|
||||
|
||||
delete [] szDataBuffer;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
#ifndef _DBAGENT_SERVER_SEND_ADMIN_TOOL_H_
|
||||
#define _DBAGENT_SERVER_SEND_ADMIN_TOOL_H_
|
||||
|
||||
#include <ctime>
|
||||
#include <Network/Packet/PacketStruct/CharAdminPacket.h>
|
||||
|
||||
// forward decl.
|
||||
class CSendStream;
|
||||
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
|
||||
namespace DataStorage
|
||||
{
|
||||
// forward decl.
|
||||
class CStoreData;
|
||||
class CCharacterData;
|
||||
}
|
||||
|
||||
namespace SendPacket
|
||||
{
|
||||
|
||||
bool ItemQtyCheck(unsigned long dwItemTypeID, unsigned long dwItemQty,
|
||||
unsigned long dwCurrentItemQty, time_t tStartTime, time_t tEndTime,
|
||||
unsigned char cType, unsigned short usError = 0);
|
||||
|
||||
bool AdminToolGetDataAck(CSendStream& SendStream, PktAdminToolGetData::GetDataType dataType,
|
||||
unsigned long dwRequestKey, unsigned long dwUID, unsigned long dwCID,
|
||||
const char* lpData, unsigned long dwDataSize, unsigned short usError,
|
||||
unsigned char cOldServerGroupID = 0);
|
||||
|
||||
bool AdminToolSetDataAck(CSendStream& SendStream, unsigned long dwRequestKey,
|
||||
unsigned long dwUID, unsigned long dwCID, unsigned char cType, unsigned short eErrorCode);
|
||||
|
||||
bool TotalDataToAdminTool(CSendStream& SendStream, unsigned long dwRequestKey, IN_ADDR peerAddr,
|
||||
DataStorage::CStoreData& storeData, DataStorage::CCharacterData& characterData);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,331 @@
|
||||
#include "stdafx.h"
|
||||
#include "SendCharManage.h"
|
||||
|
||||
#include <Network/Stream/SendStream.h>
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
#include <Network/Packet/PacketStruct/AuthServerToDBAgentServer.h>
|
||||
#include <Network/Packet/PacketStruct/UnifiedCharPacket.h>
|
||||
#include <Network/Packet/PacketStruct/CharItemPacket.h>
|
||||
#include <Network/Packet/PacketStruct/CharStatusPacket.h>
|
||||
#include <Network/Dispatch/GameDispatch.h>
|
||||
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
|
||||
#include <DB/DBdefine.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace SendPacket
|
||||
{
|
||||
|
||||
// WORK_LIST 2.1 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD>
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
bool UserLogin(CSendStream& SendStream, unsigned long dwRequestKey, unsigned long dwUID,
|
||||
const CHAR_VIEW* lpCharView, const sGuildData* lpGuildData, const STORE_INFO* pStoreInfo, unsigned long dwCharViewNum,
|
||||
unsigned char cAccountNation, int nPlayTime, unsigned char cAdminLevel, unsigned char cBillingUser,
|
||||
unsigned char cBillingType, unsigned char cLoginType, unsigned short usError)
|
||||
{
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktULDAck));
|
||||
if(0 != lpBuffer)
|
||||
{
|
||||
PktULDAck* lpPktULDAck = reinterpret_cast<PktULDAck*>(lpBuffer);
|
||||
|
||||
lpPktULDAck->m_dwRequestKey = dwRequestKey;
|
||||
lpPktULDAck->m_wCmd = PktDD::SCmdUserLogin;
|
||||
|
||||
lpPktULDAck->m_nPlayTime = nPlayTime;
|
||||
lpPktULDAck->m_usAdminLevel = cAdminLevel;
|
||||
lpPktULDAck->m_cBillingUser = cBillingUser;
|
||||
lpPktULDAck->m_cBillingType = cBillingType;
|
||||
|
||||
lpPktULDAck->m_cLoginType = cLoginType;
|
||||
|
||||
lpPktULDAck->m_dwUserID = dwUID;
|
||||
|
||||
// WORK_LIST 2.1 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD>
|
||||
lpPktULDAck->m_cAccountNation = cAccountNation;
|
||||
|
||||
memset(lpPktULDAck->m_CharView, 0, sizeof(CHAR_VIEW) * PktULDAck::MAX_CHAR_VIEW);
|
||||
memset(lpPktULDAck->m_GuildData, 0, sizeof(sGuildData) * PktULDAck::MAX_CHAR_VIEW);
|
||||
memset(&lpPktULDAck->m_sStoreInfo, 0, sizeof(STORE_INFO));
|
||||
|
||||
if(0 != lpCharView && 0 != dwCharViewNum)
|
||||
{
|
||||
memcpy(lpPktULDAck->m_CharView, lpCharView,
|
||||
sizeof(CHAR_VIEW) * std::min(unsigned long(PktULDAck::MAX_CHAR_VIEW), dwCharViewNum));
|
||||
|
||||
memcpy(lpPktULDAck->m_GuildData, lpGuildData, sizeof(sGuildData) * PktULDAck::MAX_CHAR_VIEW);
|
||||
|
||||
memcpy(&lpPktULDAck->m_sStoreInfo, pStoreInfo, sizeof(STORE_INFO));
|
||||
}
|
||||
|
||||
return SendStream.WrapHeader(sizeof(PktULDAck), CmdDBGetData, 0, usError);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
bool CharSelect(CSendStream& SendStream, unsigned long dwRequestKey,
|
||||
unsigned char cZone, unsigned short usError)
|
||||
{
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktCSDAck));
|
||||
|
||||
if(0 != lpBuffer)
|
||||
{
|
||||
PktCSDAck* lpPktCSDAck = reinterpret_cast<PktCSDAck*>(lpBuffer);
|
||||
|
||||
lpPktCSDAck->m_dwRequestKey = dwRequestKey;
|
||||
lpPktCSDAck->m_wCmd = PktDD::SCmdCharSelect;
|
||||
lpPktCSDAck->m_cZone = cZone;
|
||||
|
||||
CUserPercentageInZone userPercentageInZone(
|
||||
lpPktCSDAck->m_wChannelNum, cZone, PktCSDAck::MAX_CHANNEL_NUM);
|
||||
|
||||
CGameDispatch::GetDispatchTable().Process(userPercentageInZone);
|
||||
|
||||
return SendStream.WrapHeader(sizeof(PktCSDAck), CmdDBGetData, 0, usError);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CharCreate(CSendStream& SendStream, unsigned long dwRequestKey,
|
||||
unsigned long dwCID, unsigned long dwSlot,
|
||||
const CHAR_VIEW& CharView, unsigned short usError)
|
||||
{
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktCCDAck));
|
||||
|
||||
if(0 != lpBuffer)
|
||||
{
|
||||
PktCCDAck* lpPktCCDAck = reinterpret_cast<PktCCDAck*>(lpBuffer);
|
||||
|
||||
lpPktCCDAck->m_dwRequestKey = dwRequestKey;
|
||||
lpPktCCDAck->m_wCmd = PktDD::SCmdCharCreate;
|
||||
|
||||
lpPktCCDAck->m_dwCharID = dwCID;
|
||||
lpPktCCDAck->m_dwSlot = dwSlot;
|
||||
lpPktCCDAck->m_CharView = CharView;
|
||||
|
||||
return SendStream.WrapHeader(sizeof(PktCCDAck), CmdDBGetData, 0, usError);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CharDelete(CSendStream& SendStream, unsigned long dwRequestKey,
|
||||
unsigned long dwUID, unsigned long dwSlot,
|
||||
unsigned long dwCID, unsigned short usError)
|
||||
{
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktCDD));
|
||||
|
||||
if(0 != lpBuffer)
|
||||
{
|
||||
PktCDD* lpPktCDDAck = reinterpret_cast<PktCDD*>(lpBuffer);
|
||||
|
||||
lpPktCDDAck->m_dwRequestKey = dwRequestKey;
|
||||
lpPktCDDAck->m_wCmd = PktDD::SCmdCharDelete;
|
||||
|
||||
lpPktCDDAck->m_dwUserID = dwUID;
|
||||
lpPktCDDAck->m_dwSlotNum = dwSlot;
|
||||
lpPktCDDAck->m_dwCharID = dwCID;
|
||||
|
||||
return SendStream.WrapHeader(sizeof(PktCDD), CmdDBGetData, 0, usError);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// WORK_LIST 2.1 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD>
|
||||
bool SelectAccountNation(CSendStream& SendStream, unsigned long dwRequestKey, unsigned long dwUID,
|
||||
unsigned char cType, unsigned char cAccountNation, unsigned short usError)
|
||||
{
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktSAND));
|
||||
|
||||
if (0 != lpBuffer)
|
||||
{
|
||||
PktSAND* lpPktSANDAck = reinterpret_cast<PktSAND*>(lpBuffer);
|
||||
|
||||
lpPktSANDAck->m_dwRequestKey = dwRequestKey;
|
||||
lpPktSANDAck->m_wCmd = PktDD::SCmdSelectNation;
|
||||
|
||||
lpPktSANDAck->m_dwUserID = dwUID;
|
||||
lpPktSANDAck->m_cType = cType;
|
||||
lpPktSANDAck->m_cAccountNation = cAccountNation;
|
||||
|
||||
return SendStream.WrapHeader(sizeof(PktSAND), CmdDBGetData, 0, usError);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// WORK_LIST 2.3 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
bool NationChangeResult(CSendStream& SendStream, unsigned long dwRequestKey, unsigned long dwUID,
|
||||
unsigned long* aryGID, unsigned long* aryFame)
|
||||
{
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktANCAck));
|
||||
|
||||
if (0 != lpBuffer)
|
||||
{
|
||||
PktANCAck* lpPktANCAck = reinterpret_cast<PktANCAck*>(lpBuffer);
|
||||
|
||||
lpPktANCAck->m_dwRequestKey = dwRequestKey;
|
||||
lpPktANCAck->m_wCmd = PktDD::SCmdNationChangeResult;
|
||||
|
||||
lpPktANCAck->m_dwUserID = dwUID;
|
||||
::memcpy(lpPktANCAck->m_dwGID, aryGID, sizeof(unsigned long) * PktANCAck::MAX_CHAR_VIEW);
|
||||
::memcpy(lpPktANCAck->m_dwFame, aryFame, sizeof(unsigned long) * PktANCAck::MAX_CHAR_VIEW);
|
||||
|
||||
return SendStream.WrapHeader(sizeof(PktANCAck), CmdDBGetData, 0, 0);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool UnifiedCharInfo(CSendStream& SendStream, unsigned long dwUID,
|
||||
unsigned char cTransferedCharCount, const USER_INFO& userInfo,
|
||||
const UnifiedStoreInfo* lpUnifiedStoreInfo, unsigned long dwUnifiedStoreNum,
|
||||
const UnifiedCharData* lpUnifiedCharData, unsigned long dwUnifiedCharNum)
|
||||
{
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktUnifiedCharInfo));
|
||||
|
||||
if (0 != lpBuffer)
|
||||
{
|
||||
PktUnifiedCharInfo* lpPktUnifiedCharInfo =
|
||||
reinterpret_cast<PktUnifiedCharInfo*>(lpBuffer);
|
||||
|
||||
lpPktUnifiedCharInfo->dwUID = dwUID;
|
||||
|
||||
unsigned long dwMinUnifiedStoreNum =
|
||||
std::min(unsigned long(PktUnifiedCharInfo::MAX_STORE_INFO), dwUnifiedStoreNum);
|
||||
|
||||
unsigned long dwMinUnifiedCharNum =
|
||||
std::min(unsigned long(PktUnifiedCharInfo::MAX_CHAR_DATA), dwUnifiedCharNum);
|
||||
|
||||
lpPktUnifiedCharInfo->cRestrictedPart1ToPart2Level =
|
||||
CServerSetup::GetInstance().GetRestrictedPart1ToPart2Level();
|
||||
|
||||
unsigned char cMaxTransferCount = CServerSetup::GetInstance().GetMaxTransferPart1ToPart2Count();
|
||||
|
||||
if (cTransferedCharCount <= cMaxTransferCount)
|
||||
{
|
||||
lpPktUnifiedCharInfo->cRemainCharTransferCount = cMaxTransferCount - cTransferedCharCount;
|
||||
}
|
||||
else
|
||||
{
|
||||
lpPktUnifiedCharInfo->cRemainCharTransferCount = 0;
|
||||
}
|
||||
|
||||
lpPktUnifiedCharInfo->userInfo = userInfo;
|
||||
|
||||
memcpy(lpPktUnifiedCharInfo->unifiedStoreInfo, lpUnifiedStoreInfo,
|
||||
sizeof(UnifiedStoreInfo) * dwMinUnifiedStoreNum);
|
||||
|
||||
memcpy(lpPktUnifiedCharInfo->unifiedCharData, lpUnifiedCharData,
|
||||
sizeof(UnifiedCharData) * dwMinUnifiedCharNum);
|
||||
|
||||
lpPktUnifiedCharInfo->cStoreInfoNum = static_cast<unsigned char>(dwMinUnifiedStoreNum);
|
||||
lpPktUnifiedCharInfo->cCharDataNum = static_cast<unsigned char>(dwMinUnifiedCharNum);
|
||||
|
||||
return SendStream.WrapHeader(sizeof(PktUnifiedCharInfo), CmdUnifiedCharInfo, 0, 0);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool UnifiedCharSelectReq(CSendStream& SendStream, unsigned long dwUID,
|
||||
unsigned long dwRequestKey, unsigned long* lpdwCID, unsigned long dwCIDNum,
|
||||
unsigned char cSelectedStoreServerGroup, unsigned char cSelectedNation)
|
||||
{
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktUnifiedCharSelectReq));
|
||||
|
||||
if (0 != lpBuffer)
|
||||
{
|
||||
PktUnifiedCharSelectReq* lpPktUnifiedCharSelectReq =
|
||||
reinterpret_cast<PktUnifiedCharSelectReq*>(lpBuffer);
|
||||
|
||||
memset(lpPktUnifiedCharSelectReq->szPassword,
|
||||
0, sizeof(char) * PktUnifiedCharSelectReq::MAX_PASSWORD_LEN);
|
||||
|
||||
lpPktUnifiedCharSelectReq->dwUID= dwUID;
|
||||
lpPktUnifiedCharSelectReq->dwRequestKey = dwRequestKey;
|
||||
|
||||
memcpy(lpPktUnifiedCharSelectReq->dwCID, lpdwCID,
|
||||
sizeof(unsigned long) * min(long(USER_INFO::MAX_CHAR_NUM), long(dwCIDNum)));
|
||||
|
||||
lpPktUnifiedCharSelectReq->cSelectedServerGroupID = cSelectedStoreServerGroup;
|
||||
lpPktUnifiedCharSelectReq->cSelectedNation = cSelectedNation;
|
||||
|
||||
return SendStream.WrapHeader(sizeof(PktUnifiedCharSelectReq), CmdUnifiedCharSelect, 0, 0);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool UnifiedCharSelectAck(CSendStream& SendStream, unsigned long dwUID,
|
||||
unsigned long dwRequestKey, unsigned short usError)
|
||||
{
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktUnifiedCharSelectAck));
|
||||
|
||||
if (0 != lpBuffer)
|
||||
{
|
||||
PktUnifiedCharSelectAck* lpPktUnifiedCharSelectAck =
|
||||
reinterpret_cast<PktUnifiedCharSelectAck*>(lpBuffer);
|
||||
|
||||
lpPktUnifiedCharSelectAck->dwUID = dwUID;
|
||||
lpPktUnifiedCharSelectAck->dwRequestKey = dwRequestKey;
|
||||
|
||||
return SendStream.WrapHeader(sizeof(PktUnifiedCharSelectAck),
|
||||
CmdUnifiedCharSelect, 0, usError);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CharUseCashItem(CSendStream& SendStream, unsigned long dwSender, unsigned long dwReceiver,
|
||||
Item::ItemPos itemPos, unsigned char cRemainItemNum, unsigned short usError)
|
||||
{
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktUI));
|
||||
|
||||
if (NULL != lpBuffer)
|
||||
{
|
||||
PktUI* lpPktUI = reinterpret_cast<PktUI*>(lpBuffer);
|
||||
|
||||
lpPktUI->m_dwSender = dwSender;
|
||||
lpPktUI->m_dwRecver = dwReceiver;
|
||||
lpPktUI->m_itemPos = itemPos;
|
||||
lpPktUI->m_cRemainItemNum = cRemainItemNum;
|
||||
|
||||
return SendStream.WrapCrypt(sizeof(PktUI), CmdCharUseCashItem, 0, usError);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CharExtraEvent(CSendStream& SendStream, unsigned long dwUID, unsigned long dwCID,
|
||||
unsigned long dwEventID, unsigned long dwValue1, unsigned long dwValue2, unsigned short usError)
|
||||
{
|
||||
// edith 2009.09.05 <20>ű<EFBFBD> <20>̺<EFBFBD>Ʈ <20><><EFBFBD>ۺκ<DBBA>
|
||||
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktExtraEvent));
|
||||
|
||||
if (NULL != lpBuffer)
|
||||
{
|
||||
PktExtraEvent* lpPktEE = reinterpret_cast<PktExtraEvent*>(lpBuffer);
|
||||
|
||||
lpPktEE->m_dwUserID = dwUID;
|
||||
lpPktEE->m_dwCharID = dwCID;
|
||||
lpPktEE->m_dwEventID = dwEventID;
|
||||
lpPktEE->m_dwValue1 = dwValue1;
|
||||
lpPktEE->m_dwValue2 = dwValue2;
|
||||
|
||||
return SendStream.WrapCrypt(sizeof(PktExtraEvent), CmdExtraEvent, 0, usError);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
#ifndef _DBAGENT_SERVER_SEND_CHAR_MANAGE_H_
|
||||
#define _DBAGENT_SERVER_SEND_CHAR_MANAGE_H_
|
||||
|
||||
#include <DB/DBdefine.h>
|
||||
#include <Item/Item.h>
|
||||
|
||||
// forward decl.
|
||||
class CSendStream;
|
||||
struct USER_INFO;
|
||||
struct CHAR_VIEW;
|
||||
struct sGuildData;
|
||||
struct UnifiedStoreInfo;
|
||||
struct UnifiedCharData;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
// forward delc.
|
||||
class CSessionData;
|
||||
}
|
||||
|
||||
namespace SendPacket
|
||||
{
|
||||
// WORK_LIST 2.1 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD>
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
bool UserLogin(CSendStream& SendStream, unsigned long dwRequestKey, unsigned long dwUID,
|
||||
const CHAR_VIEW* lpCharView, const sGuildData* lpGuildData, const STORE_INFO* pStoreInfo, unsigned long dwCharViewNum,
|
||||
unsigned char cAccountNation, int nPlayTime, unsigned char cAdminLevel, unsigned char cBillingUser,
|
||||
unsigned char cBillingType, unsigned char cLoginType, unsigned short usError);
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
bool CharSelect(CSendStream& SendStream, unsigned long dwRequestKey,
|
||||
unsigned char cZone, unsigned short usError);
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
bool CharCreate(CSendStream& SendStream, unsigned long dwRequestKey,
|
||||
unsigned long dwCID, unsigned long dwSlot, const CHAR_VIEW& CharView, unsigned short usError);
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
bool CharDelete(CSendStream& SendStream, unsigned long dwRequestKey,
|
||||
unsigned long dwUID, unsigned long dwSlot, unsigned long dwCID, unsigned short usError);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
bool CharCreateItem(CSendStream& SendStream, unsigned long dwRequestKey,
|
||||
unsigned char cZone, unsigned short usError);
|
||||
|
||||
// WORK_LIST 2.1 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
||||
bool SelectAccountNation(CSendStream& SendStream, unsigned long dwRequestKey, unsigned long dwUID,
|
||||
unsigned char cType, unsigned char cAccountNation, unsigned short usError);
|
||||
|
||||
// WORK_LIST 2.3 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
bool NationChangeResult(CSendStream& SendStream, unsigned long dwRequestKey, unsigned long dwUID,
|
||||
unsigned long* aryGID, unsigned long* aryFame);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD>սÿ<D5BD><C3BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
|
||||
bool UnifiedCharInfo(CSendStream& SendStream,
|
||||
unsigned long dwUID, unsigned char cTransferedCharCount, const USER_INFO& userInfo,
|
||||
const UnifiedStoreInfo* lpUnifiedStoreInfo, unsigned long dwUnifiedStoreNum,
|
||||
const UnifiedCharData* lpUnifiedCharData, unsigned long dwUnifiedCharNum);
|
||||
|
||||
// Part1 DB<44>߰輭<DFB0><E8BCAD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
bool UnifiedCharSelectReq(CSendStream& SendStream, unsigned long dwUID,
|
||||
unsigned long dwRequestKey, unsigned long* lpdwCID, unsigned long dwCIDNum,
|
||||
unsigned char cSelectedStoreServerGroup, unsigned char cSelectedNation);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD>и<EFBFBD> <20>ش<EFBFBD>.
|
||||
bool UnifiedCharSelectAck(CSendStream& SendStream, unsigned long dwUID,
|
||||
unsigned long dwRequestKey, unsigned short usError);
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
bool CharUseCashItem(CSendStream& SendStream, unsigned long dwSender, unsigned long dwReceiver,
|
||||
Item::ItemPos itemPos, unsigned char cRemainItemNum, unsigned short usError);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>̺<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
|
||||
bool CharExtraEvent(CSendStream& SendStream, unsigned long dwUID, unsigned long dwCID,
|
||||
unsigned long dwEventID, unsigned long dwValue1, unsigned long dwValue2, unsigned short usError);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,114 @@
|
||||
#include "stdafx.h"
|
||||
#include "SendGuild.h"
|
||||
|
||||
#include <Network/Packet/WrapPacket.h>
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
#include <Network/Packet/PacketStruct/GuildPacket.h>
|
||||
|
||||
#include <Network/Stream/SendStream.h>
|
||||
#include <Network/Dispatch/GameDispatch.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace SendPacket
|
||||
{
|
||||
|
||||
|
||||
bool GuildCmd(CSendStream* lpSendStream,
|
||||
unsigned long dwGID, unsigned long dwSenderID, unsigned long dwReferenceID,
|
||||
unsigned short wCmd, const char* szSenderName, const char* szGuildName, unsigned short wError)
|
||||
{
|
||||
PktGuildCmd pktGuildCmd;
|
||||
memset(&pktGuildCmd, 0, sizeof(PktGuildCmd));
|
||||
|
||||
pktGuildCmd.m_dwGID = dwGID;
|
||||
pktGuildCmd.m_dwSenderID = dwSenderID;
|
||||
pktGuildCmd.m_dwReferenceID = dwReferenceID;
|
||||
pktGuildCmd.m_wCmd = wCmd;
|
||||
|
||||
if(szSenderName)
|
||||
strncpy(pktGuildCmd.m_szSenderName, szSenderName, MAX_MEMBER_NAME_LEN);
|
||||
|
||||
if(szGuildName)
|
||||
strncpy(pktGuildCmd.m_szGuildName, szGuildName, MAX_GUILD_NAME_LEN);
|
||||
|
||||
|
||||
if (PktBase::NO_SERVER_ERR == wError)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktGuildCmd),
|
||||
sizeof(PktGuildCmd), CmdGuildCmd, 0, wError))
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktGuildCmd), sizeof(PktGuildCmd), CmdGuildCmd));
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else if(0 != lpSendStream)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD><CEB0><EFBFBD>, <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
return lpSendStream->WrapCompress(reinterpret_cast<char*>(&pktGuildCmd),
|
||||
sizeof(PktGuildCmd), CmdGuildCmd, 0, wError);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GuildMemberFameUpdate(unsigned long dwCID, unsigned long dwOurGID, unsigned char cType, int nAddFame, unsigned char cZone, unsigned long dwEnemyGID)
|
||||
{
|
||||
PktGuildMemberFameUpdate pktGuildMemberFameUpdate;
|
||||
memset(&pktGuildMemberFameUpdate, 0, sizeof(PktGuildMemberFameUpdate));
|
||||
|
||||
pktGuildMemberFameUpdate.m_dwCID = dwCID;
|
||||
pktGuildMemberFameUpdate.m_dwOurGID = dwOurGID;
|
||||
pktGuildMemberFameUpdate.m_dwEnemyGID = dwEnemyGID;
|
||||
pktGuildMemberFameUpdate.m_cType = cType;
|
||||
pktGuildMemberFameUpdate.m_nAddFame = nAddFame;
|
||||
|
||||
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktGuildMemberFameUpdate),
|
||||
sizeof(PktGuildMemberFameUpdate), CmdGuildMemberFameUpdate, 0, 0))
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketToZone(
|
||||
reinterpret_cast<char*>(&pktGuildMemberFameUpdate),
|
||||
sizeof(PktGuildMemberFameUpdate), CmdGuildMemberFameUpdate, cZone));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GuildMemberGoldUpdate(unsigned long dwCID, unsigned long dwGID, unsigned long dwGold, unsigned char cZone)
|
||||
{
|
||||
PktGuildMemberGoldUpdate pktGuildMemberGoldUpdate;
|
||||
memset(&pktGuildMemberGoldUpdate, 0, sizeof(PktGuildMemberGoldUpdate));
|
||||
|
||||
pktGuildMemberGoldUpdate.m_dwCID = dwCID;
|
||||
pktGuildMemberGoldUpdate.m_dwGID = dwGID;
|
||||
pktGuildMemberGoldUpdate.m_dwGold = dwGold;
|
||||
|
||||
if (PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktGuildMemberGoldUpdate),
|
||||
sizeof(PktGuildMemberGoldUpdate), CmdGuildMemberGoldUpdate, 0, 0))
|
||||
{
|
||||
DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketToZone(
|
||||
reinterpret_cast<char*>(&pktGuildMemberGoldUpdate),
|
||||
sizeof(PktGuildMemberGoldUpdate), CmdGuildMemberGoldUpdate, cZone));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*bool KeyInfo(unsigned long dwCID)
|
||||
{
|
||||
PktGuildMemberGoldUpdate pktGuildMemberGoldUpdate;
|
||||
memset(&pktGuildMemberGoldUpdate, 0, sizeof(PktGuildMemberGoldUpdate));
|
||||
|
||||
return false;
|
||||
}*/
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
#ifndef _DBAGENT_SERVER_SEND_GUILD_H_
|
||||
#define _DBAGENT_SERVER_SEND_GUILD_H_
|
||||
|
||||
// forward decl.
|
||||
class CSendStream;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace SendPacket
|
||||
{
|
||||
bool GuildCmd(CSendStream* lpSendStream,
|
||||
unsigned long dwGID, unsigned long dwSenderID, unsigned long dwReferenceID,
|
||||
unsigned short wCmd, const char* szSenderName, const char* szGuildName, unsigned short wError);
|
||||
|
||||
bool GuildMemberFameUpdate(unsigned long dwCID, unsigned long dwOurGID,
|
||||
unsigned char cType, int nAddFame, unsigned char cZone, unsigned long dwEnemyGID = 0);
|
||||
|
||||
bool GuildMemberGoldUpdate(unsigned long dwCID,
|
||||
unsigned long dwGID, unsigned long dwGold, unsigned char cZone);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,653 @@
|
||||
#include "stdafx.h"
|
||||
#include "SendLoginout.h"
|
||||
|
||||
#include <Network/Stream/SendStream.h>
|
||||
#include <Network/Packet/PacketStruct/CharLoginOutPacket.h>
|
||||
#include <Network/Packet/PacketStruct/CharLoginOutPacketStruct.h>
|
||||
#include <Network/Packet/PacketStruct/CharItemPacket.h>
|
||||
#include <Network/Packet/PacketStruct/CharQuestPacket.h>
|
||||
#include <Network/Packet/PacketStruct/CharConfigPacket.h>
|
||||
#include <Network/Packet/PacketStruct/AuthServerToDBAgentServer.h>
|
||||
|
||||
#include <DataStorage/StoreData.h>
|
||||
#include <DataStorage/CharacterData.h>
|
||||
#include <DataStorage/SessionData.h>
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
|
||||
#include <Community/Party/PartyDBInfo.h>
|
||||
#include <Community/Party/PartyDBMgr.h>
|
||||
|
||||
#include <Community/Guild/GuildDB.h>
|
||||
#include <Community/Guild/GuildDBMgr.h>
|
||||
|
||||
#include <DB/DBComponent.h>
|
||||
#include <DB/GameDBComponent.h>
|
||||
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
|
||||
#include <DataStorage/SessionDataMgr.h>
|
||||
|
||||
#include <GameTime/GameTimeConstants.h>
|
||||
#include <GameTime/GameTimeDBMgr.h>
|
||||
|
||||
#include <Network/Packet/PacketStruct/CharCommunityPacket.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace SendPacket
|
||||
{
|
||||
|
||||
// ģ<><C4A3> / <20>ź<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
bool Friend(CSendStream& SendStream, unsigned char cCmd, unsigned long dwRequestKey, unsigned long dwUID, unsigned long dwCID,
|
||||
unsigned long dwGID, unsigned short wClass, char cLevel, unsigned long dwServerID, const char* lpData, unsigned long dwDataLen);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>Ʈ / <20><><EFBFBD><EFBFBD><EFBFBD>丮 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
bool Quest(CSendStream& SendStream, unsigned long dwRequestKey,
|
||||
unsigned long dwUID, unsigned long dwCID,
|
||||
const char* lpQuestBuffer, unsigned long dwQuestSize,
|
||||
const char* lpHistoryBuffer, unsigned long dwHistorySize);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
bool ConfigInfo(CSendStream& SendStream, unsigned long dwRequestKey,
|
||||
unsigned long dwUID, unsigned long dwCID,
|
||||
const char* lpConfigBuffer, unsigned long dwConfigSize);
|
||||
|
||||
// â<><C3A2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
bool DepositData(CSendStream& SendStream, unsigned char cCmd,
|
||||
unsigned long dwRequestKey, unsigned long dwCID, const STORE_INFO& storeInfo);
|
||||
|
||||
// â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
bool DepositDBUpdate(CSendStream& SendStream, unsigned long dwRequestKey,
|
||||
unsigned long dwUID, unsigned long dwCID,
|
||||
unsigned char cTabNum, bool bComplete,
|
||||
const STORE_INFO& storeInfo, const STORE& store);
|
||||
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
bool StartSession(CSendStream& SendStream, unsigned long dwRequestKey,
|
||||
unsigned long dwUID, unsigned long dwSessionID,
|
||||
unsigned char cFirstLogin, unsigned short usError)
|
||||
{
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktSSD));
|
||||
if(0 != lpBuffer)
|
||||
{
|
||||
PktSSD* lpPktSSDAck = reinterpret_cast<PktSSD*>(lpBuffer);
|
||||
|
||||
lpPktSSDAck->m_dwRequestKey = dwRequestKey;
|
||||
lpPktSSDAck->m_wCmd = PktDD::SCmdStartSession;
|
||||
|
||||
lpPktSSDAck->m_dwUserID = dwUID;
|
||||
lpPktSSDAck->m_dwSessionID = dwSessionID;
|
||||
|
||||
lpPktSSDAck->m_cAgentServerType =
|
||||
static_cast<unsigned char>(CServerSetup::GetInstance().GetAgentServerType());
|
||||
|
||||
lpPktSSDAck->m_cFirstLogin =
|
||||
(UnifiedConst::Part2Selectable != lpPktSSDAck->m_cAgentServerType)
|
||||
? cFirstLogin : static_cast<unsigned char>(CServerSetup::GetInstance().GetSelectableUnifiedServerNum());
|
||||
|
||||
ZeroMemory(lpPktSSDAck->m_AccountName, sizeof(char)*PktSSD::MaxName);
|
||||
ZeroMemory(lpPktSSDAck->m_Password, sizeof(char)*PktSSD::MaxPass);
|
||||
|
||||
return SendStream.WrapHeader(sizeof(PktSSD), CmdDBGetData, 0, usError);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD>
|
||||
bool CharLogin(CSendStream& SendStream, DataStorage::CSessionData& SessionData,
|
||||
unsigned long dwRequestKey)
|
||||
{
|
||||
// DBAgent<6E><74> ij<><C4B3><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ƿԴ<C6BF>.
|
||||
// DB<44><42><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD> DataStorage::CCharacterData <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
|
||||
|
||||
const unsigned long MAX_BUFFER_SIZE = sizeof(PktDBUpdate) + DBUpdateData::MAX_DBUPDATE_SIZE;
|
||||
|
||||
char szBuffer[MAX_BUFFER_SIZE] = {0,};
|
||||
unsigned long dwBufferSize = MAX_BUFFER_SIZE;
|
||||
|
||||
DataStorage::CCharacterData* lpCharacterData = SessionData.GetCharacterData();
|
||||
DataStorage::CStoreData* lpStoreData = SessionData.GetStoreData();
|
||||
|
||||
if(0 == lpCharacterData || 0 == lpStoreData)
|
||||
{
|
||||
ERRLOG4(g_Log, "UID:%10u / CID:%10u / CCharacterData:%p / CStoreData:%p / "
|
||||
"ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.",
|
||||
SessionData.GetUID(), SessionData.GetCID(), lpCharacterData, lpStoreData);
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned long dwUID = SessionData.GetUID();
|
||||
unsigned long dwCID = lpCharacterData->GetCID();
|
||||
|
||||
PktDBUpdate* lpPktDBUpdate = reinterpret_cast<PktDBUpdate*>(szBuffer);
|
||||
char* lpDataPos = szBuffer + sizeof(PktDBUpdate);
|
||||
|
||||
unsigned long dwDataSize = MAX_BUFFER_SIZE - sizeof(PktDBUpdate);
|
||||
|
||||
memset(lpPktDBUpdate, 0, sizeof(PktDBUpdate));
|
||||
|
||||
if(!lpCharacterData->SerializeOut(lpDataPos, lpPktDBUpdate->m_usUpdate,
|
||||
dwDataSize, DBUpdateData::MAX_UPDATE_DB))
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / CID:%10u / ij<><C4B3><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SerializeOut<75><74> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.",
|
||||
SessionData.GetUID(), SessionData.GetCID());
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20>÷<EFBFBD><C3B7>̾<EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>ش<EFBFBD>.
|
||||
// <20>α<EFBFBD><CEB1><EFBFBD> <20>Ѵ<EFBFBD>.
|
||||
if (GameRYL::CHINA == CServerSetup::GetInstance().GetNationType())
|
||||
{
|
||||
DBComponent::GameDB::UpdatePlayTime(CDBSingleObject::GetInstance(), dwUID, 0);
|
||||
SessionData.GetPlayTimeFromDB(CDBSingleObject::GetInstance());
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8> <20><><EFBFBD><EFBFBD>
|
||||
DBComponent::GameDB::UpdatePremiumService(CDBSingleObject::GetInstance(), dwUID, 0);
|
||||
SessionData.GetPremiumServiceFromDB(CDBSingleObject::GetInstance());
|
||||
|
||||
|
||||
unsigned char cAdminLevel = SessionData.GetAdminLevel();
|
||||
DBUpdateData::UpdateType eUpdateType =
|
||||
(0 != cAdminLevel) ? DBUpdateData::ADMIN_LOGIN : DBUpdateData::LOGIN;
|
||||
|
||||
// <20>뺴 <20><><EFBFBD><EFBFBD>.
|
||||
CGuildDB* lpGuild = static_cast<CGuildDB*>(
|
||||
CGuildDBMgr::GetInstance().GetGuild(lpCharacterData->GetGID()));
|
||||
|
||||
unsigned char cTacticsFlag = 0;
|
||||
|
||||
if(lpGuild)
|
||||
{
|
||||
cTacticsFlag = lpGuild->GetTacticsMember(dwCID);
|
||||
}
|
||||
|
||||
lpPktDBUpdate->m_dlItemSerial = 0;
|
||||
lpPktDBUpdate->m_dwSessionID = SessionData.GetSessionID();
|
||||
lpPktDBUpdate->m_dwUserID = dwUID;
|
||||
lpPktDBUpdate->m_dwCharID = dwCID;
|
||||
lpPktDBUpdate->m_dwRequestKey = dwRequestKey;
|
||||
lpPktDBUpdate->m_Address = SessionData.GetRemoteAddress();
|
||||
lpPktDBUpdate->m_cAdminLevel = cAdminLevel;
|
||||
lpPktDBUpdate->m_cAdminFlag = lpCharacterData->GetAdminFlag();
|
||||
lpPktDBUpdate->m_cTacticsFlag = cTacticsFlag;
|
||||
|
||||
strncpy(lpPktDBUpdate->m_szAccountName,
|
||||
SessionData.GetAccountName(), CHAR_INFOST::MAX_ACCOUNT_LEN);
|
||||
|
||||
lpPktDBUpdate->m_szAccountName[CHAR_INFOST::MAX_ACCOUNT_LEN - 1] = 0;
|
||||
|
||||
// WORK_LIST 2.4 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
lpPktDBUpdate->m_cAccountNation = SessionData.GetAccountNation();
|
||||
lpPktDBUpdate->m_cNameChangeCount = lpCharacterData->GetInfoEx().cNameChangeCount;
|
||||
|
||||
// <20>ν<EFBFBD><CEBD>Ͻ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD><EFBFBD>ε<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20>ƴϸ<C6B4> OFF <20><> <20>ٲ<EFBFBD><D9B2>ش<EFBFBD>.
|
||||
if (lpCharacterData->GetInfoEx().GuildWarFlag == Creature::WAR_INSTANCE &&
|
||||
!CGameTimeDBMgr::GetInstance().IsGuildWarTime())
|
||||
{
|
||||
lpCharacterData->SetGuildWarFlag(Creature::WAR_OFF);
|
||||
}
|
||||
|
||||
if (lpCharacterData->GetInfoEx().RealmWarFlag == Creature::WAR_INSTANCE &&
|
||||
!CGameTimeDBMgr::GetInstance().IsRealmWarReadyTime() &&
|
||||
!CGameTimeDBMgr::GetInstance().IsRealmWarTime())
|
||||
{
|
||||
lpCharacterData->SetRealmWarFlag(Creature::WAR_OFF);
|
||||
}
|
||||
|
||||
|
||||
lpPktDBUpdate->m_cGuildWarFlag = lpCharacterData->GetInfoEx().GuildWarFlag;
|
||||
lpPktDBUpdate->m_cRealmWarFlag = lpCharacterData->GetInfoEx().RealmWarFlag;
|
||||
lpPktDBUpdate->m_cRealmPoint = lpCharacterData->GetInfoEx().RealmPoint;
|
||||
|
||||
lpPktDBUpdate->m_TypeCode = static_cast<unsigned short>(eUpdateType);
|
||||
lpPktDBUpdate->m_PlayTime = SessionData.GetPlayTime();
|
||||
lpPktDBUpdate->m_PremiumTime = SessionData.GetPremiumTime();
|
||||
lpPktDBUpdate->m_PremiumType = SessionData.GetPremiumType();
|
||||
|
||||
if(!SendStream.WrapCompress(szBuffer,
|
||||
static_cast<unsigned short>(sizeof(PktDBUpdate) + dwDataSize), CmdDBUpdateData, 0, 0))
|
||||
{
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
return false;
|
||||
}
|
||||
|
||||
// <20>ϴ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD><CFB7><EFBFBD> <20><><EFBFBD>Ĵ<EFBFBD>,
|
||||
|
||||
unsigned long dwGID = lpCharacterData->GetGID();
|
||||
unsigned short wClass = lpCharacterData->GetClass();
|
||||
char cLevel = lpCharacterData->GetLevel();
|
||||
|
||||
// Friend <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD>) //
|
||||
unsigned long dwMemberCID[CFriendList::MAX_FRIENDS_NUM] = {0,};
|
||||
|
||||
// ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> CID <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>´<EFBFBD>. //
|
||||
CFriendList friendList = lpCharacterData->GetFriendList();
|
||||
|
||||
friendList.GetCIDList(dwMemberCID);
|
||||
|
||||
for(unsigned char cIndex = 0; cIndex < friendList.GetFriendNum(); cIndex++)
|
||||
{
|
||||
DataStorage::CSessionData* lpTargetSessionData = DataStorage::CSessionDataMgr::GetInstance().GetCharLoadedSession(dwMemberCID[cIndex]);
|
||||
|
||||
CFriendList::Rebind* lpRebind = friendList.GetFriend(dwMemberCID[cIndex]);
|
||||
|
||||
if(lpRebind)
|
||||
{
|
||||
if(lpTargetSessionData)
|
||||
{
|
||||
DataStorage::CCharacterData* lpTargetCharacterData = lpTargetSessionData->GetCharacterData();
|
||||
|
||||
if(lpTargetCharacterData)
|
||||
{
|
||||
if (DataStorage::CSessionData::SE_USER_ENABLED != lpTargetSessionData->GetSessionState() &&
|
||||
DataStorage::CSessionData::SE_CHAR_ENABLED != lpTargetSessionData->GetSessionState())
|
||||
{
|
||||
lpRebind->UpdateServerID(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Frind <20>ʱ<EFBFBD>ȭ //
|
||||
lpRebind->InitializeFriendInfo(lpTargetCharacterData->GetServerID(), lpTargetCharacterData->GetGID(),
|
||||
lpTargetCharacterData->GetClass(), lpTargetCharacterData->GetLevel());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lpRebind->UpdateServerID(0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lpRebind->UpdateServerID(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ģ<><C4A3> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
|
||||
dwBufferSize = MAX_BUFFER_SIZE;
|
||||
if(friendList.SerializeOut(szBuffer, dwBufferSize))
|
||||
{
|
||||
SendPacket::Friend(SendStream, PktFriendDB::CMD::FRIEND_LIST, dwRequestKey, dwUID, dwCID,
|
||||
dwGID, wClass, cLevel, SessionData.GetServerID(), szBuffer, dwBufferSize);
|
||||
}
|
||||
|
||||
// Ban <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD>) //
|
||||
|
||||
CBanList banList = lpCharacterData->GetBanList();
|
||||
|
||||
// <20>źθ<C5BA><CEB8><EFBFBD>Ʈ<EFBFBD><C6AE> CID <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>´<EFBFBD>. //
|
||||
banList.GetCIDList(dwMemberCID);
|
||||
|
||||
for(unsigned char cIndex = 0; cIndex < banList.GetBanNum(); cIndex++)
|
||||
{
|
||||
DataStorage::CSessionData* lpTargetSessionData = DataStorage::CSessionDataMgr::GetInstance().GetCharLoadedSession(dwMemberCID[cIndex]);
|
||||
|
||||
CBanList::Rebind* lpRebind = banList.GetBan(dwMemberCID[cIndex]);
|
||||
|
||||
if(lpRebind)
|
||||
{
|
||||
if(lpTargetSessionData)
|
||||
{
|
||||
DataStorage::CCharacterData* lpTargetCharacterData = lpTargetSessionData->GetCharacterData();
|
||||
|
||||
if(lpTargetCharacterData)
|
||||
{
|
||||
if (DataStorage::CSessionData::SE_USER_ENABLED != lpTargetSessionData->GetSessionState() &&
|
||||
DataStorage::CSessionData::SE_CHAR_ENABLED != lpTargetSessionData->GetSessionState())
|
||||
{
|
||||
lpRebind->UpdateServerID(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Frind <20>ʱ<EFBFBD>ȭ //
|
||||
lpRebind->InitializeBanInfo(lpTargetCharacterData->GetServerID(), lpTargetCharacterData->GetGID(),
|
||||
lpTargetCharacterData->GetClass(), lpTargetCharacterData->GetLevel());
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
lpRebind->UpdateServerID(0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lpRebind->UpdateServerID(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// <20>ź<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
|
||||
dwBufferSize = MAX_BUFFER_SIZE;
|
||||
if(banList.SerializeOut(szBuffer, dwBufferSize))
|
||||
{
|
||||
SendPacket::Friend(SendStream, PktFriendDB::CMD::BAN_LIST, dwRequestKey, dwUID, dwCID,
|
||||
dwGID, wClass, cLevel, SessionData.GetServerID(), szBuffer, dwBufferSize);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
|
||||
const QUEST& quest = lpCharacterData->GetQuest();
|
||||
const HISTORY& history = lpCharacterData->GetHistory();
|
||||
|
||||
SendPacket::Quest(SendStream, dwRequestKey, dwUID, dwCID,
|
||||
quest.Data, quest.dwSize, history.Data, history.dwSize);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
const CONFIG& config = lpCharacterData->GetConfig();
|
||||
SendPacket::ConfigInfo(SendStream, dwRequestKey, dwUID, dwCID, config.Data, config.dwSize);
|
||||
|
||||
const STORE_INFO& storeInfo = lpStoreData->GetStoreInfo();
|
||||
|
||||
// â<><C3A2> <20>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD> <20><> â<><C3A2> <20>ݾ<EFBFBD> <20><><EFBFBD><EFBFBD>. <20>ݵ<EFBFBD><DDB5><EFBFBD> DepositDBUpdate<74><65><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
|
||||
SendPacket::DepositData(SendStream, PktDeposit::CMD::PASSWORD, dwRequestKey, dwCID, storeInfo);
|
||||
SendPacket::DepositData(SendStream, PktDeposit::CMD::GOLD, dwRequestKey, dwCID, storeInfo);
|
||||
|
||||
// â<><C3A2> <20><><EFBFBD><EFBFBD>
|
||||
const STORE& store1 = lpStoreData->GetStore1();
|
||||
const STORE& store2 = lpStoreData->GetStore2();
|
||||
|
||||
if (0 == store2.dwSize)
|
||||
{
|
||||
SendPacket::DepositDBUpdate(SendStream, dwRequestKey, dwUID, dwCID,
|
||||
PktDepositUpdateDB::TabNum::TAB_12, true, storeInfo, store1);
|
||||
}
|
||||
else
|
||||
{
|
||||
SendPacket::DepositDBUpdate(SendStream, dwRequestKey, dwUID, dwCID,
|
||||
PktDepositUpdateDB::TabNum::TAB_12, false, storeInfo, store1);
|
||||
|
||||
SendPacket::DepositDBUpdate(SendStream, dwRequestKey, dwUID, dwCID,
|
||||
PktDepositUpdateDB::TabNum::TAB_34, true, storeInfo, store2);
|
||||
}
|
||||
|
||||
// <20><>Ƽ <20>α<EFBFBD><CEB1><EFBFBD> ó<><C3B3>
|
||||
CPartyDBInfo* lpParty = CPartyDBMgr::GetInstance().OpenParty(
|
||||
CDBSingleObject::GetInstance(), lpCharacterData->GetPID());
|
||||
|
||||
if (0 != lpParty)
|
||||
{
|
||||
CPartyDBMgr::GetInstance().LoginPartyMember(
|
||||
lpParty, dwUID, dwCID, dwGID, wClass, SessionData.GetServerID(), cLevel);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> ó<><C3B3>
|
||||
if (0 != lpGuild)
|
||||
{
|
||||
lpGuild->SendLoginOutMember(dwCID, SessionData.GetServerID());
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ŷ.
|
||||
DataStorage::CSessionData::SaveEnemy* lpSaveEnemyInfo = SessionData.GetSaveEnemy();
|
||||
|
||||
unsigned long dwSaveEnemySize = sizeof(PktSaveEnemy) + sizeof(DataStorage::CSessionData::SaveEnemy)*4;
|
||||
|
||||
char* szSaveEnemyBuffer = SendStream.GetBuffer(dwSaveEnemySize);
|
||||
|
||||
PktSaveEnemy* lpPktSaveEnemy = reinterpret_cast<PktSaveEnemy*>(szSaveEnemyBuffer);
|
||||
lpPktSaveEnemy->m_dwCID = SessionData.GetCID();
|
||||
|
||||
DataStorage::CSessionData::SaveEnemy* lpPktSaveEnemyInfo = NULL;
|
||||
|
||||
unsigned long dwTick = ::GetTickCount();
|
||||
|
||||
for(unsigned char cIndex = 0; cIndex < DataStorage::CSessionData::SaveEnemy::MAX_SAVING_ENEMY; cIndex++)
|
||||
{
|
||||
if(!cIndex)
|
||||
{
|
||||
lpPktSaveEnemy->m_dwAttackedCID = lpSaveEnemyInfo[cIndex].m_dwCID;
|
||||
lpPktSaveEnemy->m_dwTick = dwTick - lpSaveEnemyInfo[cIndex].m_dwTick;
|
||||
lpPktSaveEnemyInfo = reinterpret_cast<DataStorage::CSessionData::SaveEnemy*>(szSaveEnemyBuffer+sizeof(PktSaveEnemy));
|
||||
}
|
||||
else
|
||||
{
|
||||
lpPktSaveEnemyInfo[cIndex-1].m_dwCID = lpSaveEnemyInfo[cIndex].m_dwCID;
|
||||
lpPktSaveEnemyInfo[cIndex-1].m_dwTick = 0;
|
||||
|
||||
if(lpSaveEnemyInfo[cIndex].m_dwCID)
|
||||
{
|
||||
lpPktSaveEnemyInfo[cIndex-1].m_dwTick = dwTick - lpSaveEnemyInfo[cIndex].m_dwTick;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!SendStream.WrapHeader((unsigned short)dwSaveEnemySize, CmdSaveEnemy, 0, 0))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// <20><><EFBFBD>̽<EFBFBD>ƽ Ű <20><><EFBFBD><EFBFBD>.
|
||||
KeyInfo* pKeyInfo = SessionData.GetKeyInfo();
|
||||
|
||||
if (pKeyInfo && pKeyInfo->m_cUsed)
|
||||
{
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktKeyInfo));
|
||||
|
||||
if(0 != lpBuffer)
|
||||
{
|
||||
PktKeyInfo* pPktKeyInfo = reinterpret_cast<PktKeyInfo*>(lpBuffer);;
|
||||
pPktKeyInfo->m_dwCID = dwCID;
|
||||
memcpy(pPktKeyInfo->m_dwKeyInfo, pKeyInfo->m_dwKeyInfo, sizeof(unsigned long)*PktKeyInfo::MAX_KEY_INFO);
|
||||
|
||||
SendStream.WrapCrypt(sizeof(PktKeyInfo), CmdKeyInfo, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
// <20>α<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
SessionData.LogCharData("ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD>");
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
bool CharLoginError(CSendStream& SendStream, unsigned long dwRequestKey,
|
||||
DBUpdateData::UpdateType eUpdateType,
|
||||
unsigned long dwUID, unsigned long dwCID, unsigned short usError)
|
||||
{
|
||||
if(0 != usError)
|
||||
{
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktDBUpdate));
|
||||
|
||||
if(0 != lpBuffer)
|
||||
{
|
||||
PktDBUpdate* lpPktDBUpdate = reinterpret_cast<PktDBUpdate*>(lpBuffer);
|
||||
memset(lpPktDBUpdate, 0, sizeof(PktDBUpdate));
|
||||
|
||||
lpPktDBUpdate->m_dlItemSerial = 0;
|
||||
lpPktDBUpdate->m_dwSessionID = 0;
|
||||
lpPktDBUpdate->m_dwUserID = dwUID;
|
||||
lpPktDBUpdate->m_dwCharID = dwCID;
|
||||
lpPktDBUpdate->m_dwRequestKey = dwRequestKey;
|
||||
|
||||
lpPktDBUpdate->m_Address.S_un.S_addr = 0;
|
||||
|
||||
lpPktDBUpdate->m_cAdminLevel = 0;
|
||||
|
||||
// WORK_LIST 2.4 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
lpPktDBUpdate->m_cAccountNation = 0;
|
||||
lpPktDBUpdate->m_cNameChangeCount = 0;
|
||||
lpPktDBUpdate->m_cGuildWarFlag = 0;
|
||||
lpPktDBUpdate->m_cRealmWarFlag = 0;
|
||||
lpPktDBUpdate->m_cTacticsFlag = 0;
|
||||
|
||||
lpPktDBUpdate->m_TypeCode = static_cast<unsigned short>(eUpdateType);
|
||||
|
||||
memset(lpPktDBUpdate->m_usUpdate, 0,
|
||||
sizeof(unsigned short) * DBUpdateData::MAX_UPDATE_DB);
|
||||
|
||||
return SendStream.WrapCrypt(sizeof(PktDBUpdate), CmdDBUpdateData, 0, usError);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
bool Friend(CSendStream& SendStream, unsigned char cCmd, unsigned long dwRequestKey, unsigned long dwUID, unsigned long dwCID,
|
||||
unsigned long dwGID, unsigned short wClass, char cLevel, unsigned long dwServerID, const char* lpData, unsigned long dwDataLen)
|
||||
{
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktFriendDB) + dwDataLen);
|
||||
if(0 != lpBuffer)
|
||||
{
|
||||
PktFriendDB* lpFriendDB = reinterpret_cast<PktFriendDB*>(lpBuffer);
|
||||
|
||||
lpFriendDB->m_cCmd = cCmd;
|
||||
lpFriendDB->m_dwRequestKey = dwRequestKey;
|
||||
lpFriendDB->m_wCmd = 0;
|
||||
|
||||
lpFriendDB->m_dwOwnerUID = dwUID;
|
||||
lpFriendDB->m_dwOwnerCID = dwCID;
|
||||
lpFriendDB->m_dwReferenceCID = 0;
|
||||
lpFriendDB->m_dwData = dwDataLen;
|
||||
|
||||
lpFriendDB->m_dwGID = dwGID;
|
||||
lpFriendDB->m_wClass = wClass;
|
||||
lpFriendDB->m_cLevel = cLevel;
|
||||
lpFriendDB->m_dwServerID = dwServerID;
|
||||
|
||||
memcpy(lpFriendDB + 1, lpData, dwDataLen);
|
||||
|
||||
return SendStream.WrapHeader(
|
||||
static_cast<unsigned short>(sizeof(PktFriendDB) + dwDataLen), CmdFriendDB, 0, 0);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Quest(CSendStream& SendStream, unsigned long dwRequestKey,
|
||||
unsigned long dwUID, unsigned long dwCID,
|
||||
const char* lpQuestBuffer, unsigned long dwQuestSize,
|
||||
const char* lpHistoryBuffer, unsigned long dwHistorySize)
|
||||
{
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktQuestDB) + dwQuestSize + dwHistorySize);
|
||||
|
||||
if(0 != lpBuffer)
|
||||
{
|
||||
PktQuestDB* lpPktQuestDB = reinterpret_cast<PktQuestDB*>(lpBuffer);
|
||||
|
||||
lpPktQuestDB->m_dwRequestKey = dwRequestKey;
|
||||
lpPktQuestDB->m_wCmd = 0;
|
||||
|
||||
lpPktQuestDB->m_dwUID = dwUID;
|
||||
lpPktQuestDB->m_dwCID = dwCID;
|
||||
|
||||
lpPktQuestDB->m_wExecuteQuestSize = static_cast<unsigned short>(dwQuestSize);
|
||||
lpPktQuestDB->m_wHistoryQuestSize = static_cast<unsigned short>(dwHistorySize);
|
||||
|
||||
memcpy(lpBuffer + sizeof(PktQuestDB), lpQuestBuffer, dwQuestSize);
|
||||
memcpy(lpBuffer + sizeof(PktQuestDB) + dwQuestSize, lpHistoryBuffer, dwHistorySize);
|
||||
|
||||
return SendStream.WrapHeader(
|
||||
static_cast<unsigned short>(sizeof(PktQuestDB) + dwQuestSize + dwHistorySize),
|
||||
CmdQuestDB, 0, 0);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ConfigInfo(CSendStream& SendStream, unsigned long dwRequestKey,
|
||||
unsigned long dwUID, unsigned long dwCID,
|
||||
const char* lpConfigBuffer, unsigned long dwConfigSize)
|
||||
{
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktConfigInfo) + dwConfigSize);
|
||||
|
||||
if(0 != lpBuffer)
|
||||
{
|
||||
PktConfigInfo* lpConfigInfo = reinterpret_cast<PktConfigInfo*>(lpBuffer);
|
||||
|
||||
lpConfigInfo->m_dwRequestKey = dwRequestKey;
|
||||
lpConfigInfo->m_wCmd = 0;
|
||||
|
||||
lpConfigInfo->m_dwUserID = dwUID;
|
||||
lpConfigInfo->m_dwCharID = dwCID;
|
||||
lpConfigInfo->m_wSize = static_cast<unsigned short>(dwConfigSize);
|
||||
|
||||
memcpy(lpBuffer + sizeof(PktConfigInfo), lpConfigBuffer, dwConfigSize);
|
||||
|
||||
return SendStream.WrapHeader(
|
||||
static_cast<unsigned short>(sizeof(PktConfigInfo) + dwConfigSize), CmdConfigInfoDB, 0, 0);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool DepositData(CSendStream& SendStream, unsigned char cCmd, unsigned long dwRequestKey,
|
||||
unsigned long dwCID, const STORE_INFO& storeInfo)
|
||||
{
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktDeposit));
|
||||
|
||||
if(0 != lpBuffer)
|
||||
{
|
||||
PktDeposit* lpPktDeposit = reinterpret_cast<PktDeposit*>(lpBuffer);
|
||||
|
||||
lpPktDeposit->m_cCmd = cCmd;
|
||||
lpPktDeposit->m_wCmd = 0;
|
||||
lpPktDeposit->m_dwRequestKey = dwRequestKey;
|
||||
|
||||
if (PktDeposit::CMD::PASSWORD == cCmd)
|
||||
{
|
||||
memcpy(&lpPktDeposit->m_szData[0], &dwCID, sizeof(unsigned long));
|
||||
memcpy(&lpPktDeposit->m_szData[4], storeInfo.Password, Deposit::PASSWORD_LENGTH);
|
||||
}
|
||||
else if (PktDeposit::CMD::GOLD == cCmd)
|
||||
{
|
||||
memcpy(&lpPktDeposit->m_szData[0], &dwCID, sizeof(unsigned long));
|
||||
memcpy(&lpPktDeposit->m_szData[4], &storeInfo.Gold, sizeof(unsigned long));
|
||||
}
|
||||
|
||||
return SendStream.WrapHeader(sizeof(PktDeposit), CmdDeposit, 0, 0);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool DepositDBUpdate(CSendStream& SendStream, unsigned long dwRequestKey,
|
||||
unsigned long dwUID, unsigned long dwCID,
|
||||
unsigned char cTabNum, bool bComplete,
|
||||
const STORE_INFO& storeInfo, const STORE& store)
|
||||
{
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktDepositUpdateDB) + store.dwSize);
|
||||
|
||||
if(0 != lpBuffer)
|
||||
{
|
||||
PktDepositUpdateDB* lpPktDepositUpdateDB =
|
||||
reinterpret_cast<PktDepositUpdateDB*>(lpBuffer);
|
||||
|
||||
lpPktDepositUpdateDB->m_dwRequestKey = dwRequestKey;
|
||||
lpPktDepositUpdateDB->m_wCmd = 0;
|
||||
|
||||
lpPktDepositUpdateDB->m_dwUID = dwUID;
|
||||
lpPktDepositUpdateDB->m_dwCID = dwCID;
|
||||
lpPktDepositUpdateDB->m_dwTabFlag = storeInfo.Flag;
|
||||
lpPktDepositUpdateDB->m_usDataSize = static_cast<unsigned short>(store.dwSize);
|
||||
lpPktDepositUpdateDB->m_cTabNum = cTabNum;
|
||||
lpPktDepositUpdateDB->m_bUpdateComplete = bComplete;
|
||||
|
||||
memcpy(lpBuffer + sizeof(PktDepositUpdateDB), store.Data, store.dwSize);
|
||||
|
||||
return SendStream.WrapHeader(
|
||||
static_cast<unsigned short>(sizeof(PktDepositUpdateDB) + store.dwSize), CmdDepositUpdate, 0, 0);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
#ifndef _DBAGENT_SERVER_SEND_LOGIN_OUT_H_
|
||||
#define _DBAGENT_SERVER_SEND_LOGIN_OUT_H_
|
||||
|
||||
#include <Network/Packet/PacketStruct/CharLoginOutPacketStruct.h>
|
||||
|
||||
// forward decl.
|
||||
class CSendStream;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
// forward delc.
|
||||
class CSessionData;
|
||||
}
|
||||
|
||||
namespace SendPacket
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
bool StartSession(CSendStream& SendStream, unsigned long dwRequestKey,
|
||||
unsigned long dwUID, unsigned long dwSessionID,
|
||||
unsigned char cFirstLogin, unsigned short usError);
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD>
|
||||
bool CharLogin(CSendStream& SendStream,
|
||||
DataStorage::CSessionData& SessionData, unsigned long dwRequestKey);
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20>αƿ<D7BE>
|
||||
bool CharLoginError(CSendStream& SendStream, unsigned long dwRequestKey,
|
||||
DBUpdateData::UpdateType eUpdateType,
|
||||
unsigned long dwUID, unsigned long dwCID, unsigned short usError);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,111 @@
|
||||
#include "stdafx.h"
|
||||
#include "SendMoveZone.h"
|
||||
|
||||
#include <Network/Stream/SendStream.h>
|
||||
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
#include <Network/Packet/PacketStruct/ServerInfo.h>
|
||||
#include <Network/Packet/PacketStruct/ServerPacket.h>
|
||||
#include <Network/Dispatch/GameDispatch.h>
|
||||
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace SendPacket
|
||||
{
|
||||
|
||||
bool CharMoveZone(CSendStream& SendStream, unsigned long dwRequestKey,
|
||||
unsigned char cZone, unsigned short usError)
|
||||
{
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktSZMvDAck));
|
||||
if(0 != lpBuffer)
|
||||
{
|
||||
PktSZMvDAck* lpPktSZMvDAck = reinterpret_cast<PktSZMvDAck*>(lpBuffer);
|
||||
|
||||
lpPktSZMvDAck->m_dwRequestKey = dwRequestKey;
|
||||
lpPktSZMvDAck->m_wCmd = PktDD::SCmdCharMoveZone;
|
||||
|
||||
lpPktSZMvDAck->m_cZone = cZone;
|
||||
|
||||
CUserPercentageInZone getUserPercentage(
|
||||
lpPktSZMvDAck->m_wChannelNum, cZone, PktSZMvDAck::MAX_CHANNEL_NUM);
|
||||
|
||||
CGameDispatch::GetDispatchTable().Process(getUserPercentage);
|
||||
|
||||
return SendStream.WrapHeader(sizeof(PktSZMvDAck), CmdAgentZone, 0, usError);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ServerZone(CSendStream& SendStream, unsigned long dwRequestKey,
|
||||
unsigned char cZone, unsigned char cChannel, unsigned short usError)
|
||||
{
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktSAAck));
|
||||
if(0 != lpBuffer)
|
||||
{
|
||||
unsigned short usError = 0;
|
||||
|
||||
PktSAAck* lpPktSAAck = reinterpret_cast<PktSAAck*>(lpBuffer);
|
||||
|
||||
lpPktSAAck->m_dwRequestKey = dwRequestKey;
|
||||
lpPktSAAck->m_wCmd = PktDD::SCmdServerZone;
|
||||
|
||||
lpPktSAAck->m_dwServerID = 0;
|
||||
lpPktSAAck->m_GameAddress.S_un.S_addr = 0;
|
||||
|
||||
if(0 == usError)
|
||||
{
|
||||
SERVER_ID serverID;
|
||||
serverID.sID.Type = CServerSetup::GameServer;
|
||||
serverID.sID.Group = CServerSetup::GetInstance().GetServerGroup();
|
||||
serverID.sID.Channel = cChannel;
|
||||
serverID.sID.ID = cZone;
|
||||
|
||||
GET_MULTI_DISPATCH(lpGameDispatch, serverID.dwID,
|
||||
CGameDispatch, CGameDispatch::GetDispatchTable());
|
||||
|
||||
int nUserLimit = static_cast<int>(CServerSetup::GetInstance().GetUserLimit());
|
||||
|
||||
if(0 == lpGameDispatch)
|
||||
{
|
||||
usError = PktSAAck::SERVER_ERROR;
|
||||
}
|
||||
else if(nUserLimit < lpGameDispatch->GetCharNum())
|
||||
{
|
||||
usError = PktSAAck::FAIL_USER_LIMIT;
|
||||
}
|
||||
else
|
||||
{
|
||||
lpPktSAAck->m_dwServerID = lpGameDispatch->GetServerID();
|
||||
lpPktSAAck->m_GameAddress = lpGameDispatch->GetRemoteAddr().get_addr_in().sin_addr;
|
||||
}
|
||||
}
|
||||
|
||||
return SendStream.WrapHeader(sizeof(PktSAAck), CmdAgentZone, 0, usError);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ServerZoneEnd(CSendStream& SendStream, unsigned long dwRequestKey)
|
||||
{
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktDD));
|
||||
|
||||
if(0 != lpBuffer)
|
||||
{
|
||||
PktDD* lpPktDD = reinterpret_cast<PktDD*>(lpBuffer);
|
||||
|
||||
lpPktDD->m_dwRequestKey = dwRequestKey;
|
||||
lpPktDD->m_wCmd = PktDD::SCmdServerZoneEnd;
|
||||
|
||||
return SendStream.WrapHeader(sizeof(PktDD), CmdAgentZone, 0, 0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
#ifndef _DBAGENT_SERVER_SEND_MOVE_ZONE_H_
|
||||
#define _DBAGENT_SERVER_SEND_MOVE_ZONE_H_
|
||||
|
||||
|
||||
// forward decl.
|
||||
class CSendStream;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace SendPacket
|
||||
{
|
||||
bool CharMoveZone(CSendStream& SendStream, unsigned long dwRequestKey,
|
||||
unsigned char cZone, unsigned short usError);
|
||||
|
||||
bool ServerZone(CSendStream& SendStream, unsigned long dwRequestKey,
|
||||
unsigned char cZone, unsigned char cChannel, unsigned short usError = 0);
|
||||
|
||||
bool ServerZoneEnd(CSendStream& SendStream, unsigned long dwRequestKey);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,111 @@
|
||||
#include "stdafx.h"
|
||||
#include "SendParty.h"
|
||||
#include <Community/Party/PartyDBInfo.h>
|
||||
#include <Network/Packet/WrapPacket.h>
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
#include <Network/Packet/PacketStruct/DataPacket.h>
|
||||
#include <Network/Packet/PacketStruct/PartyPacket.h>
|
||||
#include <Network/Dispatch/GameDispatch.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace SendPacket
|
||||
{
|
||||
|
||||
bool DeleteParty(CPartyDBInfo* lpParty)
|
||||
{
|
||||
if(0 != lpParty)
|
||||
{
|
||||
PktDPD pktDPD;
|
||||
memset(&pktDPD, 0, sizeof(PktDPD));
|
||||
|
||||
pktDPD.m_wCmd = PktDD::SCmdDeleteParty;
|
||||
pktDPD.m_dwPartyID = lpParty->GetPID();
|
||||
|
||||
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktDPD),
|
||||
sizeof(PktDPD), CmdAgentParty, 0, 0))
|
||||
{
|
||||
CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktDPD), sizeof(PktDPD), CmdAgentParty));
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool PartyCmd(CSendStream& SendStream, unsigned short cSubCmd, unsigned long dwPID, unsigned long dwSenderID, unsigned long dwGID,
|
||||
unsigned short wClass, unsigned long dwServerID, char cLevel, const char* szSenderName, unsigned short usError)
|
||||
{
|
||||
char* lpBuffer = SendStream.GetBuffer(sizeof(PktPMD));
|
||||
|
||||
if(0 != lpBuffer)
|
||||
{
|
||||
PktPMD* lpPktPMD = reinterpret_cast<PktPMD*>(lpBuffer);
|
||||
|
||||
lpPktPMD->m_wCmd = cSubCmd;
|
||||
lpPktPMD->m_dwPartyID = dwPID;
|
||||
lpPktPMD->m_dwSenderID = dwSenderID;
|
||||
lpPktPMD->m_dwGID = dwGID;
|
||||
lpPktPMD->m_wClass = wClass;
|
||||
lpPktPMD->m_dwServerID = dwServerID;
|
||||
lpPktPMD->m_cLevel = cLevel;
|
||||
|
||||
if(0 != szSenderName)
|
||||
{
|
||||
strncpy(lpPktPMD->m_strSenderName, szSenderName, CHAR_INFOST::MAX_NAME_LEN);
|
||||
lpPktPMD->m_strSenderName[CHAR_INFOST::MAX_NAME_LEN - 1] = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
memset(lpPktPMD->m_strSenderName, 0, sizeof(char) * CHAR_INFOST::MAX_NAME_LEN);
|
||||
}
|
||||
|
||||
return SendStream.WrapHeader(sizeof(PktPMD), CmdAgentParty, 0, usError);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool PartyCmd(unsigned short cSubCmd, unsigned long dwPID, unsigned long dwSenderID, unsigned long dwGID,
|
||||
unsigned short wClass, unsigned long dwServerID, char cLevel, const char* szSenderName)
|
||||
{
|
||||
PktPMD pktPMD;
|
||||
memset(&pktPMD, 0, sizeof(PktPMD));
|
||||
|
||||
pktPMD.m_wCmd = cSubCmd;
|
||||
pktPMD.m_dwPartyID = dwPID;
|
||||
pktPMD.m_dwSenderID = dwSenderID;
|
||||
pktPMD.m_dwGID = dwGID;
|
||||
pktPMD.m_wClass = wClass;
|
||||
pktPMD.m_dwServerID = dwServerID;
|
||||
pktPMD.m_cLevel = cLevel;
|
||||
|
||||
if (0 != szSenderName)
|
||||
{
|
||||
strncpy(pktPMD.m_strSenderName, szSenderName, CHAR_INFOST::MAX_NAME_LEN);
|
||||
pktPMD.m_strSenderName[CHAR_INFOST::MAX_NAME_LEN - 1];
|
||||
}
|
||||
else
|
||||
{
|
||||
memset(pktPMD.m_strSenderName, 0, sizeof(char) * CHAR_INFOST::MAX_NAME_LEN);
|
||||
}
|
||||
|
||||
if(PacketWrap::WrapHeader(reinterpret_cast<char*>(&pktPMD),
|
||||
sizeof(PktPMD), CmdAgentParty, 0, 0))
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD> //
|
||||
CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer(
|
||||
reinterpret_cast<char*>(&pktPMD), sizeof(PktPMD), CmdAgentParty));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user