Files
Client/Server/RylServerProject/RylDBAgentServer/Community/Party/PartyDBMgr.cpp
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

710 lines
23 KiB
C++
Raw 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 "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);
}
}
}
}
}
}
}