Files
LGram16 dd97ddec92 Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 20:17:20 +09:00

1902 lines
64 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "stdafx.h"
#include <Utility/Setup/ServerSetup.h>
#include <Log/LogStruct.h>
#include <Log/ItemLog.h>
#include <Network/Dispatch/ParseUtils.h>
#include <Network/Dispatch/ServerRequest.h>
#include <Network/Dispatch/GameClient/SendCharLoginOut.h>
#include <Network/Dispatch/GameClient/SendCharQuest.h>
#include <Network/Dispatch/GameClient/SendCharCommunity.h>
#include <Network/Dispatch/GameClient/SendCharEtc.h>
#include <Network/Dispatch/GameClient/SendCharLevelUp.h>
#include <Network/Dispatch/GameClient/SendCharAdmin.h>
#include <Network/Dispatch/GameClient/ParseCharAdmin.h>
#include <Network/Dispatch/GameClient/SendCharItem.h>
#include <Network/Dispatch/GameClient/SendCharCastle.h>
#include <Network/Dispatch/Chat/ChatDispatch.h>
#include <Network/Packet/WrapPacket.h>
#include <Network/Packet/PacketCommand.h>
#include <Network/Packet/PacketStruct/ServerInfo.h>
#include <Network/Packet/PacketStruct/ServerPacket.h>
#include <Network/Packet/PacketStruct/PartyPacket.h>
#include <Network/Packet/PacketStruct/CharQuestPacket.h>
#include <Network/Packet/PacketStruct/CharConfigPacket.h>
#include <Network/Packet/PacketStruct/GameEventPacket.h>
#include <Network/Packet/PacketStruct/CharAdminPacket.h>
#include <Network/Packet/PacketStruct/CharStatusPacket.h>
#include <Network/Dispatch/DBAgent/DBAgentPacketParse.h>
#include <GameTime/GameTimeConstants.h>
#include <Creature/Monster/Monster.h>
#include <Creature/Character/ExpTable.h>
#include <Creature/Monster/AwardTable.h>
#include <Community/Party/PartyMgr.h>
#include <Community/Guild/Guild.h>
#include <Community/Guild/GuildMgr.h>
#include <Item/ItemMgr.h>
#include <Item/ItemFactory.h>
#include <Item/ItemStructure.h>
#include <Ranking/RankingMgr.h>
#include <Quest/QuestMgr.h>
#include "DBAgentRequest.h"
#include "DBAgentDispatch.h"
#include "DBAgentPacketParse.h"
#include <Creature/Threat.h>
struct Respawn
{
bool operator() (CCharacter* lpCharacter)
{
if (NULL != lpCharacter)
{
lpCharacter->Respawn();
}
return true;
}
};
bool DBAgentPacketParse::SendAbnormalLogout(unsigned long dwUID, unsigned long dwCID, unsigned long dwSessionID,
unsigned long dwRequestKey, CGameClientDispatch* lpGameClientDispatch)
{
GET_SINGLE_DISPATCH(lpDBAgentDispatch,
CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable());
if (0 != lpDBAgentDispatch)
{
CSendStream& agentSendStream = lpDBAgentDispatch->GetSendStream();
PktDBUpdate* lpPktDBUpdate = reinterpret_cast<PktDBUpdate*>(
agentSendStream.GetBuffer(sizeof(PktDBUpdate)));
if (0 != lpPktDBUpdate)
{
memset(lpPktDBUpdate, 0, sizeof(PktDBUpdate));
lpPktDBUpdate->m_dlItemSerial = Item::CItemFactory::GetInstance().GetItemUID();
lpPktDBUpdate->m_dwSessionID = dwSessionID;
lpPktDBUpdate->m_dwUserID = dwUID;
lpPktDBUpdate->m_dwCharID = dwCID;
lpPktDBUpdate->m_TypeCode = DBUpdateData::ABNORMAL_LOGOUT;
lpPktDBUpdate->m_dwRequestKey = 0;
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;
return agentSendStream.WrapHeader(sizeof(PktDBUpdate), CmdDBUpdateData, 0, 0);
}
}
unsigned long dwDispatchUID = 0;
if (0 != lpGameClientDispatch)
{
dwDispatchUID = lpGameClientDispatch->GetUID();
}
ERRLOG5(g_Log, "UID:%d/CID:0x%08x/DP:0x%p/RequestKey:%d/DPUID:%d/DBRequest Failed - "
"Login failed. But cannot send abnormal logout packet",
dwUID, dwCID, lpGameClientDispatch, dwRequestKey, dwDispatchUID);
return false;
}
bool DBAgentPacketParse::ParseDepositUpdate(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase)
{
PktDepositUpdateDB* lpPktDepoistUpdateDB = static_cast<PktDepositUpdateDB*>(lpPktBase);
// <20><>Ŷ <20><><EFBFBD><EFBFBD> <20>˻<EFBFBD>.
CHECK_PACKET_SIZE(
size_t nPacketLength = lpPktBase->GetLen();
if (nPacketLength < sizeof(PktDepositUpdateDB))
{
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ŷ <20><><EFBFBD>̰<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. <20>ּ<EFBFBD> ũ<><C5A9>:%d, <20><><EFBFBD><EFBFBD> ũ<><C5A9>:%d", sizeof(PktDepositUpdateDB), nPacketLength);
return false;
}
size_t nTotalLength = lpPktDepoistUpdateDB->m_usDataSize + sizeof(PktDepositUpdateDB);
if (nTotalLength != nPacketLength)
{
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ŷ <20><><EFBFBD>̰<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. <20><>Ŷ ũ<><C5A9>:%d, <20><>ü ũ<><C5A9>:%d", nPacketLength, nTotalLength);
return false;
}
);
CServerRequest::Result result(lpPktDepoistUpdateDB->m_dwRequestKey,
lpPktDepoistUpdateDB->m_bUpdateComplete);
CGameClientDispatch* lpGameClientDispatch =
static_cast<CGameClientDispatch*>(result.GetDispatch());
unsigned long dwCID = lpPktDepoistUpdateDB->m_dwCID;
if (0 != lpGameClientDispatch)
{
CCharacter* lpCharacter = lpGameClientDispatch->GetCharacter();
if (0 != lpCharacter && dwCID == lpCharacter->GetCID())
{
Item::CDepositContainer& Deposit = lpCharacter->GetDeposit();
// <20>ݵ<EFBFBD><DDB5><EFBFBD> <20><><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD> <20>Ѵ<EFBFBD>.
Deposit.SetTabFlag(lpPktDepoistUpdateDB->m_dwTabFlag);
if (!Deposit.SerializeIn(reinterpret_cast<char*>(lpPktDepoistUpdateDB + 1), lpPktDepoistUpdateDB->m_usDataSize))
{
ERRLOG1(g_Log, "CID:0x%08x â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.", dwCID);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>Ϸ<EFBFBD><CFB7>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD>, Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
CGameClientDispatch* lpGameClientDispatch = lpCharacter->GetDispatcher();
if (lpPktDepoistUpdateDB->m_bUpdateComplete && 0 != lpGameClientDispatch)
{
LOG_INOUT(DETLOG6(g_Log, "UID:%d/CID:0x%08x(0x%p)/DispatchUID:%d/DispatchPointer:0x%p <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>մϴ<D5B4>.(%s) "
"DBAgent<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD> <20>޾<EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.",
lpCharacter->GetUID(), dwCID, lpCharacter, lpGameClientDispatch->GetUID(),
lpGameClientDispatch, (lpCharacter->IsPeaceMode()) ? "<EFBFBD><EFBFBD>ȭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>" : "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"));
lpCharacter->PrepareLogin();
// ij<><C4B3><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return GameClientSendPacket::SendCharLogin(lpGameClientDispatch->GetSendStream(),
lpCharacter, &lpGameClientDispatch->GetRemoteAddr().get_addr_in(), PktBase::NO_SERVER_ERR);
}
}
else
{
ERRLOG5(g_Log, "UID:%d/CID:0x%08x(0x%p)/RequestKey:%d/CharacterCID:0x%08x/ Invalid CID",
lpPktDepoistUpdateDB->m_dwUID, lpPktDepoistUpdateDB->m_dwCID, lpCharacter,
lpPktDepoistUpdateDB->m_dwRequestKey, (0 != lpCharacter) ? lpCharacter->GetCID() : 0);
}
}
else
{
ERRLOG3(g_Log, "UID:%d/CID:0x%08x/RequestKey:%d/ DBRequest Failed - Requestkey is invalid",
lpPktDepoistUpdateDB->m_dwUID, lpPktDepoistUpdateDB->m_dwCID, lpPktDepoistUpdateDB->m_dwRequestKey);
}
return true;
}
bool DBAgentPacketParse::ParseDepositCmd(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase)
{
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktDeposit), DBAgentDispatch);
PktDeposit* lpPktDeposit = static_cast<PktDeposit*>(lpPktBase);
unsigned long dwCID = *reinterpret_cast<unsigned long*>(lpPktDeposit->m_szData);
CServerRequest::Result result(lpPktDeposit->m_dwRequestKey, false);
CGameClientDispatch* lpGameClientDispatch =
static_cast<CGameClientDispatch*>(result.GetDispatch());
if (0 != lpGameClientDispatch)
{
CCharacter* lpCharacter = lpGameClientDispatch->GetCharacter();
if (0 != lpCharacter && dwCID == lpCharacter->GetCID())
{
switch (lpPktDeposit->m_cCmd)
{
case PktDeposit::PASSWORD:
lpCharacter->GetDeposit().SetPassword(lpPktDeposit->m_szData +
sizeof(unsigned long), Deposit::PASSWORD_LENGTH);
break;
case PktDeposit::GOLD:
lpCharacter->GetDeposit().AddGold(
*reinterpret_cast<unsigned long*>(lpPktDeposit->m_szData + sizeof(unsigned long)));
break;
};
}
else
{
ERRLOG5(g_Log, "UID:%d/CID:0x%08x(0x%p)/RequestKey:%d/CharacterCID:0x%08x/ Invalid CID",
0, dwCID, lpCharacter, lpPktDeposit->m_dwRequestKey,
(0 != lpCharacter) ? lpCharacter->GetCID() : 0);
}
}
else
{
ERRLOG3(g_Log, "UID:%d/CID:0x%08x/RequestKey:%d/ DBRequest Failed - Requestkey is invalid",
0, dwCID, lpPktDeposit->m_dwRequestKey);
}
return true;
}
bool DBAgentPacketParse::ParseConfigInfoDB(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase)
{
PktConfigInfo* lpConfigDB = static_cast<PktConfigInfo*>(lpPktBase);
unsigned long dwUserID = lpConfigDB->m_dwUserID;
unsigned long dwCharID = lpConfigDB->m_dwCharID;
unsigned short wSize = lpConfigDB->m_wSize;
char* lpDataPointer = reinterpret_cast<char *>(lpConfigDB) + sizeof(PktConfigInfo);
CServerRequest::Result result(lpConfigDB->m_dwRequestKey, false);
CGameClientDispatch* lpGameClientDispatch =
static_cast<CGameClientDispatch*>(result.GetDispatch());
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> ã<><C3A3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ѵ<EFBFBD>.
if (0 != lpGameClientDispatch)
{
CCharacter* lpCharacter = lpGameClientDispatch->GetCharacter();
if (0 != lpCharacter && dwCharID == lpCharacter->GetCID())
{
if (0 != wSize)
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E4B8B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, DB <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϹǷ<CFB9> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD>ܵд<DCB5>. (2005-05-31 by <20>ε<EFBFBD>)
PeaceModeInfo PeaceMode;
PeaceModeInfo* lpPeaceModeInfo = reinterpret_cast<PeaceModeInfo *>(lpDataPointer);
PeaceMode = *lpPeaceModeInfo;
// lpCharacter->SetPeaceMode(PeaceMode, true);
lpDataPointer += sizeof(PeaceModeInfo);
RejectOption Reject;
RejectOption* lpRejectOption = reinterpret_cast<RejectOption *>(lpDataPointer);
Reject = *lpRejectOption;
lpCharacter->ControlOption(Reject, true);
lpDataPointer += sizeof(RejectOption);
}
}
else
{
ERRLOG5(g_Log, "UID:%d/CID:0x%08x(0x%p)/RequestKey:%d/CharacterCID:0x%08x/ Invalid CID",
dwUserID, dwCharID, lpCharacter, lpConfigDB->m_dwRequestKey,
(0 != lpCharacter) ? lpCharacter->GetCID() : 0);
}
}
else
{
ERRLOG3(g_Log, "UID:%d/CID:0x%08x/RequestKey:%d/ DBRequest Failed - Requestkey is invalid",
dwUserID, dwCharID, lpConfigDB->m_dwRequestKey);
}
return true;
}
bool DBAgentPacketParse::ParseUpdateDBData(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase)
{
PktDBUpdate* lpPktDBUpdate = static_cast<PktDBUpdate*>(lpPktBase);
// <20><>Ŷ <20><><EFBFBD><EFBFBD> <20>˻<EFBFBD>.
CHECK_PACKET_SIZE(
size_t nPacketLength = lpPktBase->GetLen();
if (nPacketLength < sizeof(PktDBUpdate))
{
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ŷ <20><><EFBFBD>̰<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. <20>ּ<EFBFBD> ũ<><C5A9>:%d, <20><><EFBFBD><EFBFBD> ũ<><C5A9>:%d", sizeof(PktDBUpdate), nPacketLength);
return false;
}
unsigned short* lpUpdateBegin = lpPktDBUpdate->m_usUpdate;
unsigned short* lpUpdatePastEnd = lpUpdateBegin + DBUpdateData::MAX_UPDATE_DB;
size_t nTotalLength = std::accumulate(lpUpdateBegin, lpUpdatePastEnd, 0) + sizeof(PktDBUpdate);
if (nTotalLength != nPacketLength)
{
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ŷ <20><><EFBFBD>̰<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. <20><>Ŷ ũ<><C5A9>:%d, <20><>ü ũ<><C5A9>:%d", nPacketLength, nTotalLength);
return false;
}
);
unsigned long dwSessionID = lpPktDBUpdate->m_dwSessionID;
unsigned long dwUID = lpPktDBUpdate->m_dwUserID;
unsigned long dwCID = lpPktDBUpdate->m_dwCharID;
unsigned long dwRequestKey = lpPktDBUpdate->m_dwRequestKey;
// 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>
unsigned char cAccountNation = lpPktDBUpdate->m_cAccountNation;
unsigned char cNameChangeCount = lpPktDBUpdate->m_cNameChangeCount;
unsigned char cGuildWarFlag = lpPktDBUpdate->m_cGuildWarFlag;
unsigned char cRealmWarFlag = lpPktDBUpdate->m_cRealmWarFlag;
unsigned char cRealmPoint = lpPktDBUpdate->m_cRealmPoint;
unsigned char cTacticsFlag = lpPktDBUpdate->m_cTacticsFlag;
unsigned short usTypeCode = lpPktDBUpdate->m_TypeCode;
unsigned int dwPlayTime = lpPktDBUpdate->m_PlayTime;
long lPremiumTime = lpPktDBUpdate->m_PremiumTime;
int iPremiumType = lpPktDBUpdate->m_PremiumType;
unsigned short wError = lpPktDBUpdate->GetError();
unsigned long dwDispatchUID = 0;
CServerRequest::Result result(dwRequestKey, false);
CGameClientDispatch* lpGameClientDispatch =
static_cast<CGameClientDispatch*>(result.GetDispatch());
bool bSuccessGetDispatch = true;
if (0 == lpGameClientDispatch)
{
ERRLOG4(g_Log, "UID:%d/CID:0x%08x/DP:0x%p/RequestKey:%d/ "
"DBRequest Failed - Invalid GameClientDispatch",
dwUID, dwCID, lpGameClientDispatch, dwRequestKey);
wError = 1;
}
else
{
unsigned long dwDispatchRequestKey = lpGameClientDispatch->PopRequestKey();
if (dwRequestKey != dwDispatchRequestKey)
{
ERRLOG6(g_Log, "UID:%d/CID:0x%08x(0x%p)/DP:0x%p/RequestKey:%d/DPRequestKey:%d/ "
"DBRequest Failed - Requestkey is invalid",
dwUID, dwCID, lpGameClientDispatch->GetCharacter(),
lpGameClientDispatch, dwRequestKey, dwDispatchRequestKey);
wError = 1;
}
else
{
DETLOG6(g_Log, "UID:%d/CID:0x%08x(0x%p)/DP:0x%p/RequestKey:%d/DPRequestKey:%d/ "
"DBRequest Success - Requestkey is same",
dwUID, dwCID, lpGameClientDispatch->GetCharacter(),
lpGameClientDispatch, dwRequestKey, dwDispatchRequestKey);
}
dwDispatchUID = lpGameClientDispatch->GetUID();
if (dwUID != dwDispatchUID)
{
ERRLOG7(g_Log, "UID:%d/CID:0x%08x(0x%p)/DP:0x%p/RequestKey:%d/DPRequestKey:%d/DPUID:%d "
"DBRequest Failed - UID is Invalid",
dwUID, dwCID, lpGameClientDispatch->GetCharacter(), lpGameClientDispatch,
dwRequestKey, dwDispatchRequestKey, dwDispatchUID);
wError = 1;
}
}
if (0 == wError && (DBUpdateData::LOGIN != usTypeCode && DBUpdateData::ADMIN_LOGIN != usTypeCode))
{
ERRLOG3(g_Log, "CID:0x%08x DBAgent<6E>κ<EFBFBD><CEBA><EFBFBD> <20>̻<EFBFBD><CCBB><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD>ϴ<EFBFBD>. "
"Ÿ<EFBFBD><EFBFBD> <20>ڵ<EFBFBD><DAB5><EFBFBD> %d, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD> 0x%p", dwCID, usTypeCode, lpGameClientDispatch);
wError = 1;
}
if (0 != wError)
{
ERRLOG3(g_Log, "UID:%d/CID:0x%08x <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD>. %d", dwUID, dwCID, wError);
}
else
{
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
CCharacter* lpCharacter = CCreatureManager::GetInstance().CreateCharacter(dwCID, dwSessionID);
if (0 == lpCharacter)
{
wError = 1;
ERRLOG2(g_Log, "UID:%d/CID:0x%08x/Character create failed.", dwUID, dwCID);
}
else if (!lpCharacter->Initialize(lpGameClientDispatch))
{
wError = 1;
ERRLOG2(g_Log, "UID:%d/CID:0x%08x/Character initialize failed.", dwUID, dwCID);
}
else
{
// Admin<69><6E><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (usTypeCode == DBUpdateData::ADMIN_LOGIN)
{
DETLOG3(g_Log, "UID:%d/CID:0x%08x Admin <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>. <20><EFBFBD><EEBFB5> <20><><EFBFBD><EFBFBD> : %d",
dwUID, dwCID, lpPktDBUpdate->m_cAdminLevel);
lpCharacter->SetAdminLevel(lpPktDBUpdate->m_cAdminLevel);
lpCharacter->SetGMModelFlag(lpPktDBUpdate->m_cAdminFlag);
}
// 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>
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
lpCharacter->SetNation(cAccountNation);
lpCharacter->SetNameChangeCount(cNameChangeCount);
lpCharacter->SetGuildWarFlag(cGuildWarFlag);
lpCharacter->SetRealmWarFlag(cRealmWarFlag);
lpCharacter->SetTacticsFlag(cTacticsFlag);
lpCharacter->SetAccountName(lpPktDBUpdate->m_szAccountName);
lpCharacter->SetRealmPoint(cRealmPoint);
lpCharacter->SetPlayTime(dwPlayTime);
lpCharacter->SetPremiumService(lPremiumTime, iPremiumType);
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (false == lpCharacter->SetCharacterInfo(reinterpret_cast<char*>(lpPktDBUpdate + 1), lpPktDBUpdate->m_usUpdate))
{
wError = 1;
ERRLOG2(g_Log, "UID:%d/CID:0x%08x/CharacterInfo setting failed.", dwUID, dwCID);
}
// <20><>ų<EFBFBD><C5B3> <20><><EFBFBD>Ἲ üũ
lpCharacter->CheckSkillVaild();
// ij<><C4B3><EFBFBD><EFBFBD> <20>޴<EFBFBD><DEB4><EFBFBD> <20><><EFBFBD><EFBFBD> - ij<><C4B3><EFBFBD><EFBFBD> <20≯<EFBFBD> Map<61><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <20><>. - by Sparrowhawk.
if (0 == wError && !CCreatureManager::GetInstance().AddCreature(lpCharacter))
{
wError = 1;
ERRLOG2(g_Log, "UID:%d/CID:0x%08x/CCreatureManager register failed.", dwUID, dwCID);
}
if (0 != wError)
{
// <20><><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>~~
lpGameClientDispatch->SetCharacter(0);
CCreatureManager::GetInstance().DeleteCharacter(lpCharacter);
lpCharacter = 0;
}
// â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD>.
// ä<><C3A4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ä<>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޾ƿ´<C6BF>.
GET_SINGLE_DISPATCH(lpChatDispatch, CChatDispatch, CChatDispatch::GetDispatchTable());
if(lpChatDispatch)
{
char* lpBuffer = lpChatDispatch->GetSendStream().GetBuffer(sizeof(PktChatBanInfo));
if(lpBuffer)
{
PktChatBanInfo* lpChaBanInfo = reinterpret_cast<PktChatBanInfo*>(lpBuffer);
lpChaBanInfo->m_dwCID = dwCID;
lpChatDispatch->GetSendStream().WrapCrypt(sizeof(PktChatBanInfo), CmdChatBanInfo, 0, 0);
}
}
}
}
if (0 != wError)
{
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α׾ƿ<D7BE><C6BF><EFBFBD> <20><><EFBFBD><EFBFBD>.
if (0 == lpPktDBUpdate->GetError())
{
// <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD>Ҹ<EFBFBD> <20><><EFBFBD><EFBFBD>.
SendAbnormalLogout(dwUID, dwCID, dwSessionID, dwRequestKey, lpGameClientDispatch);
}
if (0 != wError && 0 != lpGameClientDispatch)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20>Ұ<EFBFBD>.
return GameClientSendPacket::SendCharLogin(lpGameClientDispatch->GetSendStream(), 0, 0, wError);
}
}
return true;
}
bool DBAgentPacketParse::ParseAgentParty(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase)
{
int nPacketLength = lpPktBase->GetLen();
if (nPacketLength < sizeof(PktDD))
{
ERRLOG0(g_Log, "<EFBFBD><EFBFBD>Ŷ <20><><EFBFBD>̰<EFBFBD> <20>ʹ<EFBFBD> <20>۽<EFBFBD><DBBD>ϴ<EFBFBD>.");
return false;
}
PktDD* lpPktDD = static_cast<PktDD*>(lpPktBase);
CCharacterParty* lpParty = NULL;
// <20><><EFBFBD><EFBFBD> <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20>ϸ<EFBFBD> <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
switch (lpPktDD->m_wCmd)
{
case PktDD::SCmdCreateParty:
{
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktCPDAck), DBAgentDispatch);
PktCPDAck* lpCPDAck = static_cast<PktCPDAck*>(lpPktBase);
lpParty = new CCharacterParty(lpCPDAck->m_Party, true);
if (NULL == lpParty)
{
ERRLOG1(g_Log, "PID:0x%08x <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.", lpCPDAck->m_Party.m_dwPartyID);
}
else
{
PARTY party = lpCPDAck->m_Party;
PARTYLOG(DETLOG3(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD>(<28><><EFBFBD><EFBFBD>) - PID:0x%08x <20><><EFBFBD><EFBFBD>:0x%08x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:0x%08x",
party.m_dwPartyID, party.m_dwLeaderID, party.MemberCID[1]));
lpParty->UpdatePartyMemberInfo(lpCPDAck->m_dwLeaderID, lpCPDAck->m_dwLeaderGID, lpCPDAck->m_wLeaderClass, lpCPDAck->m_cLeaderLevel, true);
lpParty->UpdatePartyMemberInfo(lpCPDAck->m_dwMemberID, lpCPDAck->m_dwMemberGID, lpCPDAck->m_wMemberClass, lpCPDAck->m_cMemberLevel, true);
}
break;
}
case PktDD::SCmdDeleteParty:
{
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktDPD), DBAgentDispatch);
PktDPD* lpDPD = static_cast<PktDPD*>(lpPktBase);
unsigned long dwPartyID = lpDPD->m_dwPartyID;
lpParty = reinterpret_cast<CCharacterParty*>(CPartyMgr::GetInstance().GetParty(dwPartyID));
if (NULL != lpParty)
{
if (false == lpParty->Destory(0, 0))
{
ERRLOG1(g_Log, "PID:0x%08x <20><>Ƽ <20>Ҹ<EFBFBD> <20><><EFBFBD><EFBFBD>.", dwPartyID);
break;
}
else
{
PARTYLOG(DETLOG1(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD>(<28><>ü) - PID:0x%08x", dwPartyID));
}
CPartyMgr::GetInstance().DeleteParty(lpDPD->m_dwPartyID);
}
break;
}
case PktDD::SCmdGetPartyInfo:
{
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktPIDAck), DBAgentDispatch);
PktPIDAck* lpPIDAck = static_cast<PktPIDAck*>(lpPktBase);
CCharacterParty* lpParty = static_cast<CCharacterParty*>(
CPartyMgr::GetInstance().GetParty(lpPIDAck->m_Party.m_dwPartyID));
if (0 == lpParty)
{
lpParty = new CCharacterParty(lpPIDAck->m_Party, false);
if (0 == lpParty)
{
ERRLOG1(g_Log, "PID:0x%08x <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.", lpPIDAck->m_Party.m_dwPartyID);
}
}
if (0 != lpParty)
{
PARTY party = lpPIDAck->m_Party;
PARTYLOG(DETLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD>(<28><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD>) - PID:0x%08x <20><><EFBFBD><EFBFBD>:0x%08x", party.m_dwPartyID, party.m_dwLeaderID));
if(lpPIDAck->m_dwCharID)
{
lpParty->UpdatePartyMemberInfo(lpPIDAck->m_dwCharID, lpPIDAck->m_dwGID, lpPIDAck->m_wClass, lpPIDAck->m_cLevel, true);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20>ٸ<EFBFBD><D9B8><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //
lpParty->SendMemberInfoAllNZone(lpPIDAck->m_dwCharID);
}
}
break;
}
case PktDD::SCmdLoginPartyMem:
{
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktPMD), DBAgentDispatch);
PktPMD* lpPMD = static_cast<PktPMD*>(lpPktBase);
unsigned long dwPartyID = lpPMD->m_dwPartyID;
unsigned long dwSenderID = lpPMD->m_dwSenderID;
unsigned long dwGID = lpPMD->m_dwGID;
unsigned long dwServerID = lpPMD->m_dwServerID;
unsigned short wClass = lpPMD->m_wClass;
char cLevel = lpPMD->m_cLevel;
if (PktPMD::FAIL_WRONG_PARTY == lpPMD->GetError())
{
CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(dwSenderID);
if (NULL != lpCharacter)
{
lpCharacter->SetPID(0);
}
ERRLOG1(g_Log, "CID:0x%08x <20>߸<EFBFBD><DFB8><EFBFBD> <20><>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>.", dwSenderID);
break;
}
// <20><>Ƽ <20><><EFBFBD><EFBFBD>
lpParty = reinterpret_cast<CCharacterParty*>(CPartyMgr::GetInstance().GetParty(dwPartyID));
if (NULL != lpParty)
{
lpParty->Login(dwSenderID, dwServerID);
PARTYLOG(DETLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD>(<28>α<EFBFBD><CEB1><EFBFBD>) - PID:0x%08x <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD>ѳ<EFBFBD>:0x%08x", dwPartyID, dwSenderID));
lpParty->UpdatePartyMemberInfo(dwSenderID, dwGID, wClass, cLevel, true);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //
char* szPacket = reinterpret_cast<char*>(lpPMD);
if (PacketWrap::WrapCrypt(szPacket, sizeof(PktPMD), CmdCharPartyMemData, 0, 0))
{
lpParty->SendAllLoggedMember(
szPacket, sizeof(PktPMD), 0, CmdCharPartyMemData);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20>ٸ<EFBFBD><D9B8><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //
lpParty->SendMemberInfoAllNZone(dwSenderID);
}
else
{
if (CServerSetup::GetInstance().GetServerID() == dwServerID)
{
GET_SINGLE_DISPATCH(lpDBAgentDispatch,
CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable());
if (0 == lpDBAgentDispatch)
{
ERRLOG0(g_Log, "DBAgent Dispatch <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>");
break;
}
else
{
CSendStream& SendStream = lpDBAgentDispatch->GetSendStream();
char* lpBuffer = SendStream.GetBuffer(sizeof(PktPID));
if (NULL != lpBuffer)
{
PktPID* lpPktPID = reinterpret_cast<PktPID*>(lpBuffer);
lpPktPID->m_wCmd = PktDD::SCmdGetPartyInfo;
lpPktPID->m_dwCharID = dwSenderID;
lpPktPID->m_dwPartyID = dwPartyID;
lpPktPID->m_dwGID = dwGID;
lpPktPID->m_dwServerID = dwServerID;
lpPktPID->m_wClass = wClass;
lpPktPID->m_cLevel = cLevel;
PARTYLOG(DETLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD>(<28><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD> <20><>û) - PID:0x%08x <20><><EFBFBD><EFBFBD>:0x%08x", dwPartyID, dwSenderID));
SendStream.WrapHeader(sizeof(PktPID), CmdAgentParty, 0, 0);
}
}
}
}
break;
}
case PktDD::SCmdLogoutPartyMem:
{
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktPMD), DBAgentDispatch);
PktPMD* lpPMD = static_cast<PktPMD*>(lpPktBase);
unsigned long dwPartyID = lpPMD->m_dwPartyID;
unsigned long dwSenderID = lpPMD->m_dwSenderID;
unsigned long dwReferenceID = lpPMD->m_dwGID;
// <20><>Ƽ <20><><EFBFBD><EFBFBD>
lpParty = reinterpret_cast<CCharacterParty*>(CPartyMgr::GetInstance().GetParty(dwPartyID));
if (NULL != lpParty)
{
unsigned long dwLeader = lpParty->GetLeader();
int result = lpParty->Logout(dwSenderID, dwReferenceID);
// <20>ٸ<EFBFBD> <20><> ij<><C4B3><EFBFBD>Ϳ<EFBFBD> <20>α׾ƿ<D7BE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>͵鿡<CDB5><E9BFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. //
lpParty->SendMemberInfoOutNZone(dwSenderID, PktDD::SCmdLogoutPartyMem);
if (1 == result)
{
// <20><>Ƽ <20>Ҹ<EFBFBD> -- Fix Minbobo(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׻<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD> <20><>).
//PARTYLOG(DETLOG2(g_Log, "<22><>Ƽ <20>α<EFBFBD>(<28>α׾ƿ<D7BE>::<3A><>ü<EFBFBD>Ҹ<EFBFBD>) - PID:0x%08x <20>α׾ƿ<D7BE><C6BF>ѳ<EFBFBD>:0x%08x", dwPartyID, dwSenderID));
//CPartyMgr::GetInstance().DeleteParty(dwPartyID);
lpParty->SetLeader(dwReferenceID);
break;
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α׾ƿ<D7BE> <20><> <20><><EFBFBD><EFBFBD>ٸ<EFBFBD>...
if (dwLeader == dwSenderID)
{
lpParty->TransferLeader(dwReferenceID);
dwLeader = lpParty->GetLeader();
}
}
PARTYLOG(DETLOG3(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD>(<28>α׾ƿ<D7BE>) - PID:0x%08x <20>α׾ƿ<D7BE><C6BF>ѳ<EFBFBD>:0x%08x <20><><EFBFBD><EFBFBD>:0x%08x", dwPartyID, dwSenderID, dwLeader));
}
break;
}
case PktDD::SCmdInsertPartyMem:
{
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktPMD), DBAgentDispatch);
PktPMD* lpPMD = static_cast<PktPMD*>(lpPktBase);
unsigned long dwPartyID = lpPMD->m_dwPartyID;
unsigned long dwSenderID = lpPMD->m_dwSenderID;
unsigned long dwServerID = lpPMD->m_dwServerID;
unsigned short wClass = lpPMD->m_wClass;
unsigned long dwGID = lpPMD->m_dwGID;
char cLevel = lpPMD->m_cLevel;
// <20><>Ƽ <20><><EFBFBD><EFBFBD>
lpParty = reinterpret_cast<CCharacterParty*>(CPartyMgr::GetInstance().GetParty(dwPartyID));
if (NULL != lpParty)
{
lpParty->Join(dwSenderID, dwServerID, lpPMD->m_strSenderName);
lpParty->UpdatePartyMemberInfo(dwSenderID, dwGID, wClass, cLevel, true);
char* szPacket = reinterpret_cast<char*>(lpPMD);
if (PacketWrap::WrapCrypt(szPacket, sizeof(PktPMD), CmdCharPartyMemData, 0, 0))
{
lpParty->SendAllLoggedMember(
szPacket, sizeof(PktPMD), 0, CmdCharPartyMemData);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20>ٸ<EFBFBD><D9B8><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //
lpParty->SendMemberInfoAllNZone(dwSenderID);
PARTYLOG(DETLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD>(<28><><EFBFBD><EFBFBD>) - PID:0x%08x <20><><EFBFBD><EFBFBD><EFBFBD>ѳ<EFBFBD>:0x%08x", dwPartyID, dwSenderID));
}
break;
}
case PktDD::SCmdDeletePartyMem:
{
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktPMD), DBAgentDispatch);
PktPMD* lpPMD = static_cast<PktPMD*>(lpPktBase);
unsigned long dwPartyID = lpPMD->m_dwPartyID;
unsigned long dwSenderID = lpPMD->m_dwSenderID;
unsigned long dwReferenceID = lpPMD->m_dwGID;
// <20><>Ƽ <20><><EFBFBD><EFBFBD>
lpParty = reinterpret_cast<CCharacterParty*>(CPartyMgr::GetInstance().GetParty(dwPartyID));
if (NULL != lpParty)
{
unsigned long dwLeader = lpParty->GetLeader();
// <20>ٸ<EFBFBD> <20><> ij<><C4B3><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>͵鿡<CDB5><E9BFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. //
lpParty->SendMemberInfoOutNZone(dwSenderID, PktDD::SCmdDeletePartyMem);
if (1 == lpParty->Leave(dwSenderID, dwReferenceID))
{
// <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><>Ƽ <20>Ҹ<EFBFBD>
PARTYLOG(DETLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD><><C5BB>::<3A><>ü<EFBFBD>Ҹ<EFBFBD>) - PID:0x%08x Ż<><C5BB><EFBFBD>ѳ<EFBFBD>:0x%08x", dwPartyID, dwSenderID));
CPartyMgr::GetInstance().DeleteParty(dwPartyID);
break;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ٸ<EFBFBD>...
if (dwLeader == dwSenderID)
{
lpParty->TransferLeader(dwReferenceID);
}
PARTYLOG(DETLOG3(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD><><C5BB>) - PID:0x%08x Ż<><C5BB><EFBFBD>ѳ<EFBFBD>:0x%08x <20><><EFBFBD><EFBFBD>:0x%08x",
dwPartyID, dwSenderID, lpParty->GetLeader()));
}
break;
}
case PktDD::SCmdTransferLeader:
{
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktPMD), DBAgentDispatch);
PktPMD* lpPMD = static_cast<PktPMD*>(lpPktBase);
unsigned long dwPartyID = lpPMD->m_dwPartyID;
unsigned long dwSenderID = lpPMD->m_dwSenderID;
// <20><>Ƽ <20><><EFBFBD><EFBFBD>
lpParty = reinterpret_cast<CCharacterParty*>(CPartyMgr::GetInstance().GetParty(dwPartyID));
if (NULL == lpParty)
{
ERRLOG1(g_Log, "PID:0x%08x <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.", dwPartyID);
break;
}
lpParty->TransferLeader(dwSenderID);
PARTYLOG(DETLOG2(g_Log, "<EFBFBD><EFBFBD>Ƽ <20>α<EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD>絵) - PID:0x%08x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:0x%08x", dwPartyID, dwSenderID));
break;
}
case PktDD::SCmdAutoRoutingOn:
{
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktPMD), DBAgentDispatch);
PktPMD* lpPMD = static_cast<PktPMD*>(lpPktBase);
unsigned long dwPartyID = lpPMD->m_dwPartyID;
unsigned long dwSenderID = lpPMD->m_dwSenderID;
// <20><>Ƽ <20><><EFBFBD><EFBFBD>
lpParty = reinterpret_cast<CCharacterParty*>(CPartyMgr::GetInstance().GetParty(dwPartyID));
if (NULL == lpParty)
{
ERRLOG1(g_Log, "PID:0x%08x <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.", dwPartyID);
break;
}
if (false == lpParty->AdjustAutoRouting(dwSenderID, true))
{
ERRLOG1(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ѱ<EFBFBD> <20><><EFBFBD><EFBFBD>(CID<49><44> 0<≯<EFBFBD> ALL)", dwSenderID);
}
lpParty->UpdatePartyMemberAutoRouting(dwSenderID, true);
char* szPacket = reinterpret_cast<char*>(lpPMD);
if (PacketWrap::WrapCrypt(szPacket, sizeof(PktPMD), CmdCharPartyMemData, 0, 0))
{
lpParty->SendAllLoggedMember(
szPacket, sizeof(PktPMD), 0, CmdCharPartyMemData);
// <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> //
lpParty->SendMemberInfoNZone(szPacket, sizeof(PktPMD), dwSenderID, CmdCharPartyMemData);
}
break;
}
case PktDD::SCmdAutoRoutingOff:
{
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktPMD), DBAgentDispatch);
PktPMD* lpPMD = static_cast<PktPMD*>(lpPktBase);
unsigned long dwPartyID = lpPMD->m_dwPartyID;
unsigned long dwSenderID = lpPMD->m_dwSenderID;
// <20><>Ƽ <20><><EFBFBD><EFBFBD>
lpParty = reinterpret_cast<CCharacterParty*>(CPartyMgr::GetInstance().GetParty(dwPartyID));
if (NULL == lpParty)
{
ERRLOG1(g_Log, "PID:0x%08x <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.", dwPartyID);
break;
}
if (false == lpParty->AdjustAutoRouting(dwSenderID, false))
{
ERRLOG1(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(CID<49><44> 0<≯<EFBFBD> ALL)", dwSenderID);
}
lpParty->UpdatePartyMemberAutoRouting(dwSenderID, false);
char* szPacket = reinterpret_cast<char*>(lpPMD);
if (PacketWrap::WrapCrypt(szPacket, sizeof(PktPMD), CmdCharPartyMemData, 0, 0))
{
lpParty->SendAllLoggedMember(
szPacket, sizeof(PktPMD), 0, CmdCharPartyMemData);
// <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> //
lpParty->SendMemberInfoNZone(szPacket, sizeof(PktPMD), dwSenderID, CmdCharPartyMemData);
}
break;
}
case PktDD::SCmdDeadPartyMem:
{
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktDeadInfo), DBAgentDispatch);
PktDeadInfo* lpPktDeadInfo = static_cast<PktDeadInfo*>(lpPktBase);
// <20><>Ƽ <20><><EFBFBD><EFBFBD>
lpParty = reinterpret_cast<CCharacterParty*>(
CPartyMgr::GetInstance().GetParty(lpPktDeadInfo->m_dwDeadPID));
if (NULL == lpParty)
{
ERRLOG1(g_Log, "PID:0x%08x <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.", lpPktDeadInfo->m_dwDeadPID);
}
else
{
char* szPacket = reinterpret_cast<char*>(lpPktDeadInfo);
if (PacketWrap::WrapCrypt(szPacket, sizeof(PktDeadInfo), CmdCharDeadInfo, 0, 0))
{
lpParty->SendAllLoggedMember(szPacket, sizeof(PktDeadInfo), 0, CmdCharDeadInfo);
}
}
break;
}
case PktDD::SCmdMoveZonePartyMem: // <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD>̵<EFBFBD> <20><><EFBFBD><EFBFBD>.
case PktDD::SCmdLevelUpPartyMem: // <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
case PktDD::SCmdChangeClassPartyMem: // <20><>Ƽ<EFBFBD><C6BC> Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
case PktDD::SCmdChangeGuildPartyMem: // <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
{
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktPMD), DBAgentDispatch);
PktPMD* lpPMD = static_cast<PktPMD*>(lpPktBase);
unsigned long dwPartyID = lpPMD->m_dwPartyID;
unsigned long dwSenderID = lpPMD->m_dwSenderID;
// <20><>Ƽ <20><><EFBFBD><EFBFBD>
lpParty = reinterpret_cast<CCharacterParty*>(CPartyMgr::GetInstance().GetParty(dwPartyID));
if (0 != lpParty)
{
if(lpPktDD->m_wCmd==PktDD::SCmdLevelUpPartyMem)
{
lpParty->UpdatePartyMemberLevel(lpPMD->m_dwSenderID, lpPMD->m_cLevel);
}
if(lpPktDD->m_wCmd==PktDD::SCmdMoveZonePartyMem)
{
lpParty->UpdatePartyMemberServer(lpPMD->m_dwSenderID, lpPMD->m_dwServerID);
}
if(lpPktDD->m_wCmd==PktDD::SCmdChangeClassPartyMem)
{
lpParty->UpdatePartyMemberClass(lpPMD->m_dwSenderID, lpPMD->m_wClass);
}
if(lpPktDD->m_wCmd==PktDD::SCmdChangeGuildPartyMem)
{
lpParty->UpdatePartyMemberGuild(lpPMD->m_dwSenderID, lpPMD->m_dwGID);
}
char* szPacket = reinterpret_cast<char*>(lpPMD);
if (PacketWrap::WrapCrypt(szPacket, sizeof(PktPMD), CmdCharPartyMemData, 0, 0))
{
lpParty->SendAllLoggedMember(
szPacket, sizeof(PktPMD), 0, CmdCharPartyMemData);
// <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> //
lpParty->SendMemberInfoNZone(szPacket, sizeof(PktPMD), dwSenderID, CmdCharPartyMemData);
}
}
else
{
ERRLOG1(g_Log, "PID:0x%08x <20><>Ƽ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.", dwPartyID);
}
break;
}
}
return true;
}
bool DBAgentPacketParse::ParseAgentZone(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase)
{
size_t nPacketLength = lpPktBase->GetLen();
if (nPacketLength < sizeof(PktDD))
{
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ŷ <20><><EFBFBD>̰<EFBFBD> <20>̻<EFBFBD><CCBB>մϴ<D5B4>. packetLength:%d, sizeof(PktDD):%d", nPacketLength, sizeof(PktDD));
return false;
}
PktDD* lpPktDD = static_cast<PktDD*>(lpPktBase);
unsigned long dwRequestKey = lpPktDD->m_dwRequestKey;
unsigned short wError = lpPktBase->GetError();
CServerRequest::Result result(dwRequestKey);
CGameClientDispatch* lpDispatch = static_cast<CGameClientDispatch*>(result.GetDispatch());
CCharacter* lpCharacter = lpDispatch->GetCharacter();
unsigned long dwUID = (NULL != lpCharacter) ? lpCharacter->GetUID() : 0;
unsigned long dwCID = (NULL != lpCharacter) ? lpCharacter->GetCID() : 0;
unsigned long dwDispatchRequestKey = lpDispatch->PopRequestKey();
if (dwRequestKey != dwDispatchRequestKey)
{
ERRLOG6(g_Log, "UID:%d/CID:0x%08x(0x%p)/DispatchPointer:0x%p/DBRequest Failed - RequestKey<65><79> <20>ٸ<EFBFBD><D9B8>ϴ<EFBFBD> : <20><><EFBFBD><EFBFBD> Ű:%d, Dispatcher<65><72> Ű:%d",
dwUID, dwCID, lpCharacter, lpDispatch, dwRequestKey, dwDispatchRequestKey);
}
else
{
DETLOG6(g_Log, "UID:%d/CID:0x%08x(0x%p)/DispatchPointer:0x%p/DBRequest Success - <20><><EFBFBD><EFBFBD> Ű:%d, Dispatcher<65><72> Ű:%d",
dwUID, dwCID, lpCharacter, lpDispatch, dwRequestKey, dwDispatchRequestKey);
}
if (NULL == lpDispatch)
{
ERRLOG0(g_Log, "GameClientDispatch<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.");
}
else
{
CSendStream& SendStream = lpDispatch->GetSendStream();
bool bSendResult = true;
switch (lpPktDD->m_wCmd)
{
case PktDD::SCmdCharMoveZone:
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ص<EFBFBD> <20><> <20><><EFBFBD>ν<EFBFBD><CEBD><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ <20>ؾ<EFBFBD><D8BE>Ѵ<EFBFBD>.
// <20>ȱ׷<C8B1> <20><><EFBFBD>Ŀ<EFBFBD> <20><><EFBFBD>̵<EFBFBD> <20>޽<EFBFBD><DEBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ȴ<EFBFBD>. <20>׷<EFBFBD><D7B7><EFBFBD> <20>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20>α׾ƿ<D7BE><C6BF><EFBFBD> <20>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD> <20>Ҽ<EFBFBD><D2BC><EFBFBD> <20><><EFBFBD><EFBFBD>.
// if (PktBase::NO_SERVER_ERR != wError && NULL != lpCharacter)
if (NULL != lpCharacter)
{
lpCharacter->ResetOperationFlag(CCharacter::MOVEZONE_PROCESSED);
}
PktSZMvDAck* lpSZMvDAck = static_cast<PktSZMvDAck*>(lpPktDD);
bSendResult = GameClientSendPacket::SendCharMoveZone(SendStream,
lpSZMvDAck->m_wChannelNum, PktSZMvDAck::MAX_CHANNEL_NUM, lpSZMvDAck->m_cZone, wError);
char cZone = lpSZMvDAck->m_cZone;
// edith 2009.06.27 <20><><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ش<EFBFBD>.
// edith 2009.07.19 <20>̰<EFBFBD><CCB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> lpCharacter<65><72> NULL <20>ϼ<EFBFBD><CFBC><EFBFBD> <20>ִ<EFBFBD>. 6<><36><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD> <20>ٿ<EFBFBD><D9BF><EFBFBD> <20>Ͼ Ȯ<><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
if (0 != wError && NULL != lpCharacter)
{
if (SERVER_ID::CAPITAL == cZone)
{
lpCharacter->SetGuildWarFlag(Creature::WAR_OFF);
// Client <20><> <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD>
GameClientSendPacket::SendWarOnOff(lpDispatch->GetSendStream(), lpCharacter->GetCID(), GameTime::GUILD, Creature::WAR_OFF, 0);
// DBAgent<6E><74> <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD>
GameClientSendPacket::SendWarOnOff(DBAgentDispatch.GetSendStream(), lpCharacter->GetCID(), GameTime::GUILD, Creature::WAR_OFF, 0);
}
else if (SERVER_ID::STONE_WAR1 <= cZone && cZone <= SERVER_ID::STONE_WAR3)
{
lpCharacter->SetRealmWarFlag(Creature::WAR_OFF);
// Client <20><> <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD>
GameClientSendPacket::SendWarOnOff(lpDispatch->GetSendStream(), lpCharacter->GetCID(), GameTime::REALM, Creature::WAR_OFF, 0);
// DBAgent<6E><74> <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD>
GameClientSendPacket::SendWarOnOff(DBAgentDispatch.GetSendStream(), lpCharacter->GetCID(), GameTime::REALM, Creature::WAR_OFF, 0);
}
}
break;
}
case PktDD::SCmdServerZone:
{
PktSAAck* lpSAAck = static_cast<PktSAAck*>(lpPktDD);
if (0 == wError)
{
if (NULL != lpCharacter)
{
lpCharacter->MoveZoneProcess(lpSAAck->m_dwServerID);
}
}
lpDispatch->SetMoveAddress(lpSAAck->m_dwServerID,
INET_Addr(lpSAAck->m_GameAddress, CServerSetup::GetGameServerTCPPort(lpSAAck->m_dwServerID)));
if (0 == wError)
{
CSendStream& DBASendStream = DBAgentDispatch.GetSendStream();
char* lpBuffer = DBASendStream.GetBuffer(sizeof(PktDD));
if (0 != lpBuffer)
{
CDBRequest DBRequest(*lpDispatch, 600);
if (DBRequest.IsValid())
{
PktDD* lpPktDD = reinterpret_cast<PktDD*>(lpBuffer);
lpPktDD->InitPtSubCmd(DBRequest.GetRequestKey(), PktDD::SCmdServerZoneEnd);
if (DBASendStream.WrapHeader(sizeof(PktDD), CmdAgentZone, 0, 0))
{
DETLOG4(g_Log, "SS:0x%p/DP:0x%p/sCmd:0x%02x/RequestKey:%d/DBRequest Send success.",
&lpDispatch->GetSession(), lpDispatch, PktSA::SCmdServerZoneEnd, DBRequest.GetRequestKey());
lpDispatch->PushRequestKey(DBRequest.GetRequestKey());
break;
}
else
{
DBRequest.CancelRequest();
}
}
}
}
bSendResult = GameClientSendPacket::SendServerZone(SendStream,
lpDispatch->GetMoveServerID(), lpDispatch->GetMoveAddress().get_addr_in(), wError);
break;
}
case PktDD::SCmdServerZoneEnd:
{
bSendResult = GameClientSendPacket::SendServerZone(SendStream,
lpDispatch->GetMoveServerID(), lpDispatch->GetMoveAddress().get_addr_in(), 0);
break;
}
default:
{
ERRLOG2(g_Log, "this:0x%p DB<44>κ<EFBFBD><CEBA><EFBFBD> <20>̻<EFBFBD><CCBB><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD>ϴ<EFBFBD>. Ŀ<>ǵ<EFBFBD>:%x ",
lpDispatch, lpPktDD->m_wCmd);
break;
}
}
if (false == bSendResult)
{
lpDispatch->Disconnect();
}
}
return true;
}
bool DBAgentPacketParse::ParseSysServerLogin(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase)
{
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktSLAck), DBAgentDispatch);
PktSLAck* lpPktSLAck = static_cast<PktSLAck*>(lpPktBase);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> <20>ʱ<EFBFBD>ȭ
Item::CItemFactory& ItemFactory = Item::CItemFactory::GetInstance();
if (ItemFactory.GetItemUID() < lpPktSLAck->m_dlItemUID)
{
ItemFactory.SetItemUID(lpPktSLAck->m_dlItemUID);
}
CServerSetup::GetInstance().SetClientVer(lpPktSLAck->m_dwClientVer);
CServerSetup::GetInstance().SetCheckSum(lpPktSLAck->m_dwCheckSum);
CDBAgentDispatch::GetDispatchTable().SetDispatch(&DBAgentDispatch);
return true;
}
bool DBAgentPacketParse::ParseSysServerVerUpdate(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase)
{
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktSVU), DBAgentDispatch);
PktSVU* lpPktSVU = static_cast<PktSVU*>(lpPktBase);
CServerSetup::GetInstance().SetClientVer(lpPktSVU->m_dwClientVer);
CServerSetup::GetInstance().SetCheckSum(lpPktSVU->m_dwCheckSum);
return true;
}
bool DBAgentPacketParse::ParseSysChannelUpdate(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase)
{
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktSCInfo), DBAgentDispatch);
PktSCInfo* lpPktSCInfo = static_cast<PktSCInfo*>(lpPktBase);
CCreatureManager::GetInstance().CalculateEliteBonus(lpPktSCInfo->m_usChannelClientNum);
return true;
}
bool DBAgentPacketParse::ParseSysRankingUpdate(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase)
{
PktRankingInfo* lpRankingInfo = static_cast<PktRankingInfo *>(lpPktBase);
unsigned short wNum = lpRankingInfo->m_wNum;
SERLOG1(g_Log, "ParseSysRankingUpdate : %d", wNum);
RankingNode* lpRankingNode = reinterpret_cast<RankingNode *>(lpRankingInfo + 1);
for (int nIndex = 0; nIndex < wNum; ++nIndex)
{
// SERLOG4(g_Log, "Ranking %d - Name : %s, Class : %d, Level : %d", nIndex, lpRankingNode[nIndex].m_szCharName, lpRankingNode[nIndex].m_cClass, lpRankingNode[nIndex].m_cLevel);
CRankingMgr::GetInstance().UpdateRanking(lpRankingNode[nIndex]);
}
return true;
}
bool DBAgentPacketParse::ParseUserKill(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase)
{
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktUK), DBAgentDispatch)
PktUK* lpPktUK = static_cast<PktUK*>(lpPktBase);
unsigned long dwUID = lpPktUK->m_dwUserID;
unsigned long dwCID = lpPktUK->m_dwCharID;
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(dwCID);
if (0 == lpCharacter)
{
ERRLOG2(g_Log, "UID:%u/CID:0x%08x/ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.", dwUID, dwCID);
SendUserKill(DBAgentDispatch, dwUID, 2);
}
else
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher();
if (0 == lpDispatch)
{
// <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20>Ŀ<EFBFBD> <20>α׾ƿ<D7BE><C6BF><EFBFBD> <20><> <20><><EFBFBD>̴<EFBFBD>.
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̱<EFBFBD> <20><><EFBFBD>и<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʿ䰡 <20><><EFBFBD><EFBFBD>.
// SendUserKill(DBAgentDispatch, dwUID, 2);
if (lpCharacter->IsLogined() && !lpCharacter->IsLogout())
{
SERLOG2(g_Log, "UID:%u/CID:0x%08x/CGameClientDispatch<63><68> NULL<4C><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>α׾ƿ<D7BE><C6BF><EFBFBD> <20><><EFBFBD>õ<EFBFBD><C3B5><EFBFBD> <20>ʾҽ<CABE><D2BD>ϴ<EFBFBD>.", dwUID, dwCID);
}
}
else if (dwUID != lpDispatch->GetUID())
{
ERRLOG4(g_Log, "UID:%d/CID:0x%08x/UID<49>ٸ<EFBFBD>. <20><><EFBFBD><EFBFBD> UID:%d ij<><C4B3><EFBFBD><EFBFBD> UID:%d",
lpDispatch->GetUID(), dwCID, dwUID, lpCharacter->GetUID());
SendUserKill(DBAgentDispatch, dwUID, 2);
}
else
{
DETLOG2(g_Log, "UID:%d/CID:0x%08x/<2F><><EFBFBD><EFBFBD> <20><><EFBFBD>̱<EFBFBD> <20><><EFBFBD><EFBFBD>.", dwUID, dwCID);
if (0 != lpDispatch)
{
// <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD>
lpDispatch->Disconnect();
lpDispatch->Disconnected();
}
}
}
return true;
}
bool DBAgentPacketParse::SendUserKill(CDBAgentDispatch& DBAgentDispatch, unsigned long dwUserID, unsigned short wError)
{
CSendStream& SendStream = DBAgentDispatch.GetSendStream();
char* szBuffer = SendStream.GetBuffer(sizeof(PktUK));
if (0 != szBuffer)
{
PktUK* lpPktUK = reinterpret_cast<PktUK*>(szBuffer);
lpPktUK->m_dwServerID = CServerSetup::GetInstance().GetServerID();
lpPktUK->m_dwUserID = dwUserID;
lpPktUK->m_dwCharID = 0;
return SendStream.WrapHeader(sizeof(PktUK), CmdUserKill, 0, wError);
}
return false;
}
bool DBAgentPacketParse::SendServerLogout(CDBAgentDispatch& DBAgentDispatch)
{
CSendStream& SendStream = DBAgentDispatch.GetSendStream();
char* szBuffer = SendStream.GetBuffer(sizeof(PktBase));
if (0 != szBuffer)
{
return SendStream.WrapHeader(sizeof(PktBase), CmdSysServerLogout, 0, 0);
}
return false;
}
// ģ<><C4A3> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
bool DBAgentPacketParse::ParseFriendList(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase)
{
PktFriendDB* lpPktFriendDB = static_cast<PktFriendDB*>(lpPktBase);
CHECK_PACKET_SIZE(
{
size_t nPacketLength = lpPktBase->GetLen();
if (nPacketLength < sizeof(PktFriendDB))
{
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ŷ <20><><EFBFBD>̰<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. <20>ּ<EFBFBD> ũ<><C5A9>:%d, <20><><EFBFBD><EFBFBD> ũ<><C5A9>:%d", sizeof(PktFriendDB), nPacketLength);
return false;
}
size_t nTotalLength = lpPktFriendDB->m_dwData + sizeof(PktFriendDB);
if (nTotalLength != nPacketLength)
{
ERRLOG2(g_Log, "<EFBFBD><EFBFBD>Ŷ <20><><EFBFBD>̰<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. <20><>Ŷ ũ<><C5A9>:%d, <20><>ü ũ<><C5A9>:%d", nPacketLength, nTotalLength);
return false;
}
}
)
CServerRequest::Result result(lpPktFriendDB->m_dwRequestKey, false);
CGameClientDispatch* lpGameClientDispatch =
static_cast<CGameClientDispatch*>(result.GetDispatch());
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> ã<><C3A3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ѵ<EFBFBD>.
if (0 != lpGameClientDispatch)
{
CCharacter* lpCharacter = lpGameClientDispatch->GetCharacter();
if (0 != lpCharacter && lpPktFriendDB->m_dwOwnerCID == lpCharacter->GetCID())
{
switch (lpPktFriendDB->m_cCmd)
{
case PktFriendDB::FRIEND_LIST:
lpCharacter->GetFriendList().SerializeIn(
reinterpret_cast<char*>(lpPktFriendDB + 1), lpPktFriendDB->m_dwData);
break;
case PktFriendDB::BAN_LIST:
lpCharacter->GetBanList().SerializeIn(
reinterpret_cast<char*>(lpPktFriendDB + 1), lpPktFriendDB->m_dwData);
break;
default:
SERLOG2(g_Log, "CID:0x%08x DBAgent<6E>κ<EFBFBD><CEBA><EFBFBD> <20>߸<EFBFBD><DFB8><EFBFBD> Ŀ<>ǵ<EFBFBD><C7B5><EFBFBD> ģ<><C4A3> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>Խ<EFBFBD><D4BD>ϴ<EFBFBD>. %d",
lpPktFriendDB->m_dwOwnerCID, lpPktFriendDB->m_cCmd);
break;
};
}
else
{
ERRLOG5(g_Log, "UID:%d/CID:0x%08x(0x%p)/RequestKey:%d/CharacterCID:0x%08x/ Invalid CID",
lpPktFriendDB->m_dwOwnerUID, lpPktFriendDB->m_dwOwnerCID,
lpCharacter, lpPktFriendDB->m_dwRequestKey,
(0 != lpCharacter) ? lpCharacter->GetCID() : 0);
}
}
else
{
ERRLOG3(g_Log, "UID:%d/CID:0x%08x/RequestKey:%d/ DBRequest Failed - Requestkey is invalid",
lpPktFriendDB->m_dwOwnerUID, lpPktFriendDB->m_dwOwnerCID, lpPktFriendDB->m_dwRequestKey);
}
return true;
}
// <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
bool DBAgentPacketParse::ParseQuestDB(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase)
{
PktQuestDB* lpPktQuestDB = static_cast<PktQuestDB *>(lpPktBase);
CServerRequest::Result result(lpPktQuestDB->m_dwRequestKey, false);
CGameClientDispatch* lpGameClientDispatch =
static_cast<CGameClientDispatch*>(result.GetDispatch());
if (NULL != lpGameClientDispatch)
{
CSendStream& SendStream = lpGameClientDispatch->GetSendStream();
CCharacter* lpCharacter = lpGameClientDispatch->GetCharacter();
if (NULL != lpCharacter && lpPktQuestDB->m_dwCID == lpCharacter->GetCID())
{
int nSize = 0;
int nIndex = 0;
Quest::ExecutingQuest* aryExecutingQuest = lpCharacter->GetExecutingQuest();
unsigned short* aryHistoryQuest = lpCharacter->GetHistoryQuest();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
while (nSize < lpPktQuestDB->m_wExecuteQuestSize)
{
PktQuestDB::ExecutingQuest* lpExecuteQuest =
reinterpret_cast<PktQuestDB::ExecutingQuest *>(reinterpret_cast<char *>(lpPktBase) + sizeof(PktQuestDB) + nSize);
Quest::QuestNode* lpQuest = CQuestMgr::GetInstance().GetQuestNode(lpExecuteQuest->m_wQuestID);
if (NULL != lpQuest && false == lpQuest->CheckNationDependent(lpCharacter->GetNation()))
{
aryExecutingQuest[nIndex] =
Quest::ExecutingQuest(lpExecuteQuest->m_wQuestID, lpExecuteQuest->m_cPhase, lpExecuteQuest->m_cTriggerCount);
++nIndex;
}
nSize += sizeof(PktQuestDB::ExecutingQuest);
}
nIndex = 0;
bool bDeleteQuest = false;
// <20>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
while (nSize < lpPktQuestDB->m_wExecuteQuestSize + lpPktQuestDB->m_wHistoryQuestSize)
{
unsigned short* lpHistoryQuest =
reinterpret_cast<unsigned short *>(reinterpret_cast<char *>(lpPktBase) + sizeof(PktQuestDB) + nSize);
Quest::QuestNode* lpQuest = CQuestMgr::GetInstance().GetQuestNode(*lpHistoryQuest);
if (NULL == lpQuest || lpQuest->CheckNationDependent( lpCharacter->GetNation() ))
{
bDeleteQuest = true;
}
else
{
aryHistoryQuest[nIndex] = *lpHistoryQuest;
++nIndex;
}
nSize += sizeof(unsigned short);
}
GameClientSendPacket::SendCharQuestInfo(SendStream, lpCharacter);
// <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20>޴<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
lpCharacter->CalculateStatusData(false);
if (true == bDeleteQuest)
{
if (true == lpCharacter->CalculateMaxSkillSlot())
{
GameClientSendPacket::SendCharStateRedistribution(SendStream,
lpCharacter->GetCID(), lpCharacter->GetState(), lpCharacter->GetSkill(), PktBase::NO_SERVER_ERR);
}
}
}
else
{
ERRLOG5(g_Log, "UID:%d/CID:0x%08x(0x%p)/RequestKey:%d/CharacterCID:0x%08x/ Invalid CID",
lpPktQuestDB->m_dwUID, lpPktQuestDB->m_dwCID,
lpCharacter, lpPktQuestDB->m_dwRequestKey,
(NULL != lpCharacter) ? lpCharacter->GetCID() : 0);
}
}
else
{
ERRLOG3(g_Log, "UID:%d/CID:0x%08x/RequestKey:%d/ DBRequest Failed - Requestkey is invalid",
lpPktQuestDB->m_dwUID, lpPktQuestDB->m_dwCID, lpPktQuestDB->m_dwRequestKey);
}
return true;
}
bool DBAgentPacketParse::ParseBillingTimeoutNotify(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase)
{
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktBTN), DBAgentDispatch)
PktBTN* lpPktBTN = static_cast<PktBTN*>(lpPktBase);
unsigned long dwUID = lpPktBTN->m_dwUserID;
unsigned long dwCID = lpPktBTN->m_dwCharID;
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(dwCID);
if (0 == lpCharacter)
{
ERRLOG1(g_Log, "CID:0x%08x ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.", dwCID);
}
else
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher();
if (NULL == lpDispatch)
{
ERRLOG1(g_Log, "CID:0x%08x CGameClientDispatch<63><68><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.", dwCID);
}
else
{
if (dwUID != lpDispatch->GetUID())
{
ERRLOG4(g_Log, "UID:%d/CID:0x%08x UID<49>ٸ<EFBFBD>. <20><><EFBFBD><EFBFBD> UID:%d ij<><C4B3><EFBFBD><EFBFBD> UID:%d",
lpDispatch->GetUID(), dwCID, dwUID, lpCharacter->GetUID());
}
else
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
CSendStream& SendStream = lpDispatch->GetSendStream();
char* szBuffer = SendStream.GetBuffer(sizeof(PktBTN));
if (NULL != szBuffer)
{
memcpy(szBuffer, lpPktBTN, sizeof(PktBTN));
SendStream.WrapCrypt(sizeof(PktBTN), CmdBillingTimeoutNotify, 0, 0);
}
}
}
}
return true;
}
bool DBAgentPacketParse::ParseBillingTimeCheckNotify(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase)
{
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktBTN), DBAgentDispatch)
PktBTN* lpPktBTN = static_cast<PktBTN*>(lpPktBase);
unsigned long dwUID = lpPktBTN->m_dwUserID;
unsigned long dwCID = lpPktBTN->m_dwCharID;
ERRLOG1(g_Log, "CID:0x%08x üŷ1.", dwCID); // üŷ 1
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(dwCID);
if (0 == lpCharacter)
{
ERRLOG1(g_Log, "CID:0x%08x ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.", dwCID);
}
else
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher();
if (NULL == lpDispatch)
{
ERRLOG1(g_Log, "CID:0x%08x CGameClientDispatch<63><68><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.", dwCID);
}
else
{
ERRLOG1(g_Log, "CID:0x%08x üŷ2.", dwCID); // üŷ 2
if (dwUID != lpDispatch->GetUID())
{
ERRLOG4(g_Log, "UID:%d/CID:0x%08x UID<49>ٸ<EFBFBD>. <20><><EFBFBD><EFBFBD> UID:%d ij<><C4B3><EFBFBD><EFBFBD> UID:%d",
lpDispatch->GetUID(), dwCID, dwUID, lpCharacter->GetUID());
}
else
{
ERRLOG1(g_Log, "CID:0x%08x üŷ3.", dwCID); // üŷ 3
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
CSendStream& SendStream = lpDispatch->GetSendStream();
char* szBuffer = SendStream.GetBuffer(sizeof(PktBTN));
if (NULL != szBuffer)
{
memcpy(szBuffer, lpPktBTN, sizeof(PktBTN));
SendStream.WrapCrypt(sizeof(PktBTN), CmdBillingTimeCheckNotify, 0, 0);
}
}
}
}
return true;
}
bool DBAgentPacketParse::ParseCharUseCashItem(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase)
{
// DBAgent<6E><74><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޴°<DEB4>
// <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1<><31> <20><><EFBFBD>̰<EFBFBD> <20>ش<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ƴٱ<C6B4> <20>˸<EFBFBD><CBB8><EFBFBD>.
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktUI), DBAgentDispatch)
PktUI* lpPktUI = static_cast<PktUI*>(lpPktBase);
Item::ItemPos itemPos = lpPktUI->m_itemPos;
CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(lpPktUI->m_dwSender);
CGameClientDispatch* pDispatch = lpCharacter->GetDispatcher();
CHECK_CHARACTER_PTR(lpCharacter, *pDispatch, lpPktBase->GetCmd());
Item::CUseItem* lpUseItem = Item::CUseItem::DowncastToUseItem(lpCharacter->GetItem(itemPos));
unsigned short usError = lpPktBase->GetError();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>α׸<CEB1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
GAMELOG::LogUseItem(*lpCharacter, itemPos, lpUseItem, usError);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<><30><EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD>
unsigned char cRemainItemNum = 0;
if(usError == 0)
{
cRemainItemNum = lpUseItem->GetNumOrDurability();
if (0 < cRemainItemNum)
{
--cRemainItemNum;
lpUseItem->SetNumOrDurability(cRemainItemNum);
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD> ?<3F><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD>ش<EFBFBD>.
long dwTime = (lpCharacter->GetPremiumTime()+1440*lpUseItem->GetItemInfo().m_UseItemInfo.m_dwAmount);
lpCharacter->SetPremiumService(dwTime, 1);
if (0 == cRemainItemNum)
{
if (lpCharacter->RemoveItem(itemPos))
{
if (TakeType::TS_STALL == lpUseItem->GetRealPos().m_cPos)
{
lpCharacter->GetStall().RemoveItem(lpUseItem->GetRealPos());
}
}
DELITEMLOG(DETLOG1(g_Log, "this:0X%08x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.", lpUseItem));
DELETE_ITEM(lpUseItem);
}
}
return GameClientSendPacket::SendCharUseCashItem(pDispatch->GetSendStream(),
lpPktUI->m_dwSender, lpPktUI->m_dwRecver, itemPos, cRemainItemNum, usError);
}
bool DBAgentPacketParse::ParseExtraEvent(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase)
{
// edith 2009.09.05 <20>ű<EFBFBD> <20>̺<EFBFBD>Ʈ <20><><EFBFBD>ۺκ<DBBA>
// DBAgent<6E><74><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޴°<DEB4>
// <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1<><31> <20><><EFBFBD>̰<EFBFBD> <20>ش<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ƴٱ<C6B4> <20>˸<EFBFBD><CBB8><EFBFBD>.
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktExtraEvent), DBAgentDispatch)
PktExtraEvent* lpPktEE = static_cast<PktExtraEvent*>(lpPktBase);
CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(lpPktEE->m_dwCharID);
CGameClientDispatch* pDispatch = lpCharacter->GetDispatcher();
unsigned short usError = lpPktBase->GetError();
if(usError == 0)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(lpPktEE->m_dwEventID == 0x001e0001 )
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD> 7<><37><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD>ش<EFBFBD>.
long dwTime = (lpCharacter->GetPremiumTime()+1440*7);
lpCharacter->SetPremiumService(dwTime, 1);
}
else if(lpPktEE->m_dwEventID == 0x003c0001 )
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD> 7<><37><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD>ش<EFBFBD>.
long dwTime = (lpCharacter->GetPremiumTime()+1440*15);
lpCharacter->SetPremiumService(dwTime, 1);
}
else if(lpPktEE->m_dwEventID == 0x005a0001 )
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD> 7<><37><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD>ش<EFBFBD>.
long dwTime = (lpCharacter->GetPremiumTime()+1440*30);
lpCharacter->SetPremiumService(dwTime, 1);
}
}
return GameClientSendPacket::SendExtraEvent(pDispatch->GetSendStream(),
lpPktEE->m_dwUserID, lpPktEE->m_dwCharID, lpPktEE->m_dwEventID, lpPktEE->m_dwValue1, lpPktEE->m_dwValue2, usError);
}
bool DBAgentPacketParse::ParseEventDropItem(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase)
{
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktEventDropItem), DBAgentDispatch)
PktEventDropItem* lpPktEDI = static_cast<PktEventDropItem *>(lpPktBase);
unsigned short usItemID = lpPktEDI->m_usItemID;
CGameEventMgr::GetInstance().PushDropEventItem(usItemID);
return true;
}
// <20><EFBFBD><EEBFB5> <20><><EFBFBD><EFBFBD> ó<><C3B3>
bool DBAgentPacketParse::ParseCharAdminCmd(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3>
{
CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktAdmin), DBAgentDispatch);
PktAdmin* lpPktAdmin = static_cast<PktAdmin*>(lpPktBase);
// <20>ش<EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>α<EFBFBD> <20>ƿ<EFBFBD><C6BF><EFBFBD> <20><><EFBFBD><EFBFBD>
if (lpPktAdmin->GetError() == PktAdmin::E_LOGOUT_CHAR)
{
// Admin ij<><C4B3><EFBFBD>͸<EFBFBD> <20><>ǥ ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20>̵<EFBFBD> <20><>Ų<EFBFBD><C5B2>.
CCharacter* lpAdmin = CCreatureManager::GetInstance().GetCharacter(lpPktAdmin->m_dwAdminCID);
if (NULL == lpAdmin)
{
switch (lpPktAdmin->m_usCmd)
{
case PktAdmin::TRACE_CHAR:
ERRLOG1(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : %s ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> NULL <20>Դϴ<D4B4>.", lpPktAdmin->m_stName);
break;
case PktAdmin::INFO_CHAR:
ERRLOG1(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : %s ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> NULL <20>Դϴ<D4B4>.", lpPktAdmin->m_stName);
break;
}
return true;
}
CGameClientDispatch* lpDispatch = lpAdmin->GetDispatcher();
if (NULL != lpDispatch)
{
GameClientSendPacket::SendCharAdmin(lpDispatch->GetSendStream(), lpPktAdmin, PktAdmin::E_LOGOUT_CHAR);
}
return true;
}
CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(lpPktAdmin->m_stName);
if (NULL == lpCharacter && lpPktAdmin->m_usCmd != PktAdmin::TRACE_CHAR)
{
// <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> ã<>Ƽ<EFBFBD>, <20><EFBFBD>ڰ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
return true;
}
return GameClientParsePacket::ProcessAdminCmd(NULL, lpCharacter, lpPktAdmin);
}
// <20>ӽ<EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
bool DBAgentPacketParse::ParseGiveItemToTempInven(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase)
{
PktGiveItemToTempInven* lpGiveItemToTempInven =
static_cast<PktGiveItemToTempInven*>(lpPktBase);
GiveItemInfo* lpPos = lpGiveItemToTempInven->m_GiveItemInfo;
GiveItemInfo* lpEnd = lpPos + lpGiveItemToTempInven->m_cGiveItemNum;
CCreatureManager& creatureManager = CCreatureManager::GetInstance();
for(; lpPos != lpEnd; ++lpPos)
{
lpPos->m_dwItemUID = 0LL;
CCharacter* lpCharacter = creatureManager.GetCharacter(lpPos->m_dwCID);
if (0 != lpCharacter &&
lpCharacter->GetUID() == lpPos->m_dwUID &&
lpCharacter->GetCID() == lpPos->m_dwCID)
{
// <20>ӽ<EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if (false == lpCharacter->GetTempInven().IsFull())
{
lpCharacter->GiveItemByDBAgentRequest(*lpPos);
}
else
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѵд<D1B5>.
lpPos->m_dwItemUID = Item::GiveItem::PENDING_ITEM_UID;
}
}
}
// <20><><EFBFBD><EFBFBD> <20><>Ŷ <20>״<EFBFBD><D7B4>ο<EFBFBD><CEBF><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UID<49>߰<EFBFBD><DFB0>ؼ<EFBFBD> DB<44>߰輭<DFB0><E8BCAD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
char* lpSendBuffer = reinterpret_cast<char*>(lpGiveItemToTempInven);
if(PacketWrap::WrapHeader(lpSendBuffer, sizeof(PktGiveItemToTempInven), CmdGiveItemToTempInven, 0, 0))
{
return DBAgentDispatch.GetSendStream().PutBuffer(
lpSendBuffer, sizeof(PktGiveItemToTempInven), CmdGiveItemToTempInven);
}
return false;
}
// <20≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ack
bool DBAgentPacketParse::ParseCharNameChangeAck(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase)
{
unsigned short usError = lpPktBase->GetError();
PktCharNameChange* lpPktCharNameChange =
reinterpret_cast<PktCharNameChange*>(lpPktBase);
const char* szChangedName = lpPktCharNameChange->m_szCharName;
unsigned long dwUID = lpPktCharNameChange->m_dwUID;
unsigned long dwCID = lpPktCharNameChange->m_dwCID;
unsigned char cNameChangeCount = lpPktCharNameChange->m_cNameChangeCount;
Item::ItemPos ItemPos = lpPktCharNameChange->m_ItemPos; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B0A1> <20><>ġ
CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(dwCID);
CGameClientDispatch* lpGameDispatch = 0;
if (0 != lpCharacter && 0 != (lpGameDispatch = lpCharacter->GetDispatcher()))
{
if (0 == usError)
{
// <20><><EFBFBD><20>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if(!lpCharacter->CheckRenameWarrant(ItemPos, true))
{
usError = PktCharNameChange::ERR_NAMECHANGE_ITEM;
}
char szOldName[CHAR_INFOST::MAX_NAME_LEN];
strncpy(szOldName, lpCharacter->GetCharacterName(), CHAR_INFOST::MAX_NAME_LEN);
szOldName[CHAR_INFOST::MAX_NAME_LEN - 1] = 0;
if (CCreatureManager::GetInstance().ChangeCharacterName(dwCID, szChangedName))
{
// <20>̳<EFBFBD><CCB3><EFBFBD> <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20≯<EFBFBD> <20><><EFBFBD><EFBFBD>
if (0 != lpCharacter->GetPID() && 0 != lpCharacter->GetParty())
{
lpCharacter->GetParty()->ChangeName(dwCID, szChangedName);
}
// <20>̳<EFBFBD><CCB3><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20≯<EFBFBD> <20><><EFBFBD><EFBFBD>
Guild::CGuild* lpGuild = 0;
if (0 != lpCharacter->GetGID() &&
0 != (lpGuild = Guild::CGuildMgr::GetInstance().GetGuild(lpCharacter->GetGID())))
{
lpGuild->ChangeMemberName(dwCID, szChangedName);
}
INFLOG4(g_Log, "UID:%10u / CID:%10u / OldName:%s / ChangedName:%s / ij<><C4B3><EFBFBD><EFBFBD> <20≯<EFBFBD> <20>ٲٱ<D9B2> <20><><EFBFBD><EFBFBD>",
dwUID, dwCID, szOldName, szChangedName);
lpCharacter->SetNameChangeCount(cNameChangeCount);
}
}
GameClientSendPacket::SendCharNameChange(lpGameDispatch->GetSendStream(),
dwUID, dwCID, szChangedName, cNameChangeCount, &ItemPos, usError);
}
return true;
}
bool DBAgentPacketParse::ParseSaveEnemy(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase)
{
PktSaveEnemy* lpPktSaveEnemy = reinterpret_cast<PktSaveEnemy*>(lpPktBase);
CThreat::SaveEnemyInfo* lpPktSaveEnemyInfo = reinterpret_cast<CThreat::SaveEnemyInfo*>((char*)lpPktBase+sizeof(PktSaveEnemy));
unsigned long dwCID = lpPktSaveEnemy->m_dwCID;
unsigned long dwTick = ::GetTickCount();
unsigned long dwSavingTicCount = CThreat::SaveEnemyInfo::MAX_SAVING_TICKCOUNT;
CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(dwCID);
if (lpCharacter)
{
CThreat::SaveEnemyInfo* lpSaveEnemyInfo = lpCharacter->GetThreat().GetSaveEnemyInfo();
if (lpSaveEnemyInfo)
{
if (lpPktSaveEnemy->m_dwAttackedCID && lpPktSaveEnemy->m_dwTick<dwSavingTicCount)
{
lpSaveEnemyInfo[0].m_dwCID = lpPktSaveEnemy->m_dwAttackedCID;
lpSaveEnemyInfo[0].m_dwTickCount = dwTick-lpPktSaveEnemy->m_dwTick;
}
for (unsigned char cIndex = 1; cIndex < CThreat::SaveEnemyInfo::MAX_SAVING_ENEMY; cIndex++)
{
if (lpSaveEnemyInfo[cIndex].m_dwCID && lpSaveEnemyInfo[cIndex].m_dwTickCount<dwSavingTicCount)
{
lpSaveEnemyInfo[cIndex].m_dwCID = lpPktSaveEnemyInfo[cIndex-1].m_dwCID;
lpSaveEnemyInfo[cIndex].m_dwTickCount = lpPktSaveEnemyInfo[cIndex-1].m_dwTickCount;
}
}
}
}
return true;
}
bool DBAgentPacketParse::ParseKeyInfo(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase)
{
PktKeyInfo* lpPktKeyInfo = reinterpret_cast<PktKeyInfo*>(lpPktBase);
unsigned long dwCID = lpPktKeyInfo->m_dwCID;
CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(dwCID);
if (lpCharacter)
{
CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher();
if (lpDispatch)
{
GameClientSendPacket::SendKeyInfo(lpDispatch->GetSendStream(), lpCharacter->GetCID(), lpPktKeyInfo->m_dwKeyInfo);
}
}
return true;
}