#include "stdafx.h" #include "ParseParty.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace DBAgent { namespace ParseParty { bool CreateParty(CSendStream& SendStream, PktCPD* lpPktCPD); bool DeleteParty(CSendStream& SendStream, PktDPD* lpPktDPD); bool GetPartyInfo(CSendStream& SendStream, PktPID* lpPktPID); bool TransferLeader(CSendStream& SendStream, PktPMD* lpPktPMD); bool InsertPartyMember(CSendStream& SendStream, PktPMD* lpPktPMD); bool DeletePartyMember(CSendStream& SendStream, PktPMD* lpPktPMD); bool AutoRoutingOn(CSendStream& SendStream, PktPMD* lpPktPMD); bool AutoRoutingOff(CSendStream& SendStream, PktPMD* lpPktPMD); bool RelayPacket(CSendStream& SendStream, PktDD* lpPktDD); bool Parse(CSendStream& SendStream, PktBase* lpPktBase) { bool bResult = false; PktDD* lpPktDD = static_cast(lpPktBase); switch (lpPktDD->m_wCmd) { case PktDD::SCmdCreateParty: bResult = CreateParty(SendStream, static_cast(lpPktDD)); break; // ÆÄƼ »ý¼º case PktDD::SCmdDeleteParty: bResult = DeleteParty(SendStream, static_cast(lpPktDD)); break; // ÆÄƼ »èÁ¦ case PktDD::SCmdGetPartyInfo: bResult = GetPartyInfo(SendStream, static_cast(lpPktDD)); break; // ÆÄƼ Á¤º¸ ¾ò±â case PktDD::SCmdTransferLeader: bResult = TransferLeader(SendStream, static_cast(lpPktDD)); break; // ÆÄÇÇ ¸®´õ ¾çµµ case PktDD::SCmdInsertPartyMem: bResult = InsertPartyMember(SendStream, static_cast(lpPktDD)); break; // ÆÄƼ ¸â¹ö Ãß°¡ case PktDD::SCmdDeletePartyMem: bResult = DeletePartyMember(SendStream, static_cast(lpPktDD)); break; // ÆÄƼ ¸â¹ö »èÁ¦ case PktDD::SCmdDeadPartyMem: case PktDD::SCmdMoveZonePartyMem: case PktDD::SCmdLevelUpPartyMem: case PktDD::SCmdChangeClassPartyMem: case PktDD::SCmdChangeGuildPartyMem: bResult = RelayPacket(SendStream, lpPktDD); break; case PktDD::SCmdAutoRoutingOn: bResult = AutoRoutingOn(SendStream, static_cast(lpPktDD)); break; // ÆÄƼ ¿ÀÅä·çÆÃ Äѱâ case PktDD::SCmdAutoRoutingOff: bResult = AutoRoutingOff(SendStream, static_cast(lpPktDD)); break; // ÆÄƼ ¿ÀÅä·çÆÃ ²ô±â default: bResult = true; ERRLOG1(g_Log, "ÆÄƼ ·Î±× : Cmd:0x%02x ¾Ë ¼ö ¾ø´Â ÆÄƼ ¸í·ÉÀÓ", lpPktDD->m_wCmd); break; } if(!bResult) { ERRLOG1(g_Log, "ÆÄƼ ·Î±× : Cmd:0x%02x ¸í·É ó¸® ½ÇÆÐ.", lpPktDD->m_wCmd); } return true; } bool CreateParty(CSendStream& SendStream, PktCPD* lpPktCPD) { // ÆÄƼ »ý¼º CPartyDBInfo* lpParty = CPartyDBMgr::GetInstance().CreateParty(CDBSingleObject::GetInstance(), lpPktCPD->m_dwLeaderID, lpPktCPD->m_cLeaderLevel, lpPktCPD->m_wLeaderClass, lpPktCPD->m_dwLeaderGID, lpPktCPD->m_dwMemberID, lpPktCPD->m_cMemberLevel, lpPktCPD->m_wMemberClass, lpPktCPD->m_dwMemberGID); char* lpBuffer = 0; if (0 == lpParty) { ERRLOG2(g_Log, "ÆÄƼ ·Î±× : LeaderCID:%10u / MemberCID:%10u / ÆÄƼ »ý¼º ½ÇÆÐ : ÆÄƼ »ý¼º ½ÇÆÐ", lpPktCPD->m_dwLeaderID, lpPktCPD->m_dwMemberID); } else { PktCPDAck sPktCPDAck; memset(&sPktCPDAck, 0, sizeof(PktCPDAck)); sPktCPDAck.m_wCmd = lpPktCPD->m_wCmd; sPktCPDAck.m_Party = lpParty->GetParty(); sPktCPDAck.m_dwLeaderID = lpPktCPD->m_dwLeaderID; sPktCPDAck.m_dwMemberID = lpPktCPD->m_dwMemberID; sPktCPDAck.m_dwLeaderGID = lpPktCPD->m_dwLeaderGID; sPktCPDAck.m_wLeaderClass = lpPktCPD->m_wLeaderClass; sPktCPDAck.m_cLeaderLevel = lpPktCPD->m_cLeaderLevel; sPktCPDAck.m_dwMemberGID = lpPktCPD->m_dwMemberGID; sPktCPDAck.m_wMemberClass = lpPktCPD->m_wMemberClass; sPktCPDAck.m_cMemberLevel = lpPktCPD->m_cMemberLevel; // ij¸¯ÅÍ Á¤º¸ ¾÷µ¥ÀÌÆ® // lpParty->SetUserInfoLevel(lpPktCPD->m_dwLeaderID, lpPktCPD->m_cLeaderLevel); lpParty->SetUserInfoClass(lpPktCPD->m_dwLeaderID, lpPktCPD->m_wLeaderClass); lpParty->SetUserInfoGID(lpPktCPD->m_dwLeaderID, lpPktCPD->m_dwLeaderGID); lpParty->SetUserInfoLevel(lpPktCPD->m_dwMemberID, lpPktCPD->m_cMemberLevel); lpParty->SetUserInfoClass(lpPktCPD->m_dwMemberID, lpPktCPD->m_wMemberClass); lpParty->SetUserInfoGID(lpPktCPD->m_dwMemberID, lpPktCPD->m_dwMemberGID); if(PacketWrap::WrapHeader(reinterpret_cast(&sPktCPDAck), sizeof(PktCPDAck), CmdAgentParty, 0, 0)) { // °ÔÀÓ ¼­¹ö·Î ºê·Îµåij½ºÆÃ // DBAgent::CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer( reinterpret_cast(&sPktCPDAck), sizeof(PktCPDAck), CmdAgentParty)); return true; } } return false; } bool DeleteParty(CSendStream& SendStream, PktDPD* lpPktDPD) { // ÆÄƼ »èÁ¦ if (!CPartyDBMgr::GetInstance().DestoryParty( CDBSingleObject::GetInstance(), lpPktDPD->m_dwPartyID)) { ERRLOG1(g_Log, "ÆÄƼ ·Î±× : PID:%10u / ÆÄƼ »èÁ¦ ½ÇÆÐ", lpPktDPD->m_dwPartyID); } return true; } bool GetPartyInfo(CSendStream& SendStream, PktPID* lpPktPID) { unsigned long dwPID = lpPktPID->m_dwPartyID; unsigned long dwCID = lpPktPID->m_dwCharID; // ÆÄƼ ¿­±â CPartyDBInfo* lpParty = CPartyDBMgr::GetInstance().OpenParty( CDBSingleObject::GetInstance(), dwPID); if (0 == lpParty) { ERRLOG2(g_Log, "ÆÄƼ ·Î±× : PID:%10u / CID:%10u / ÆÄƼ Á¤º¸ ¾ò±â ½ÇÆÐ : ÆÄƼ ¾ò±â ½ÇÆÐ", dwPID, dwCID); } else { unsigned long dwServerID = 0; using namespace DataStorage; CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(dwCID); if(0 != lpSessionData) { dwServerID = lpSessionData->GetServerID(); } // lpParty->PartyMemAllLogout(); // lpParty->PartyMemLogin(dwCID, dwSID); // lpParty->SetLeader(dwCID); DETLOG2(g_Log, "ÆÄƼ ·Î±× : PID:%10u / CID:%10u / ÆÄƼ Á¤º¸ ¾ò±â", dwPID, dwCID); // ÆÐŶ º¸³»±â PktPIDAck pktPIDAck; memset(&pktPIDAck, 0, sizeof(PktPIDAck)); pktPIDAck.m_wCmd = lpPktPID->m_wCmd; pktPIDAck.m_Party = lpParty->GetParty(); pktPIDAck.m_dwCharID = lpPktPID->m_dwCharID; pktPIDAck.m_dwGID = lpPktPID->m_dwGID; pktPIDAck.m_wClass = lpPktPID->m_wClass; pktPIDAck.m_cLevel = lpPktPID->m_cLevel; pktPIDAck.m_dwServerID = lpPktPID->m_dwServerID; if(PacketWrap::WrapHeader(reinterpret_cast(&pktPIDAck), sizeof(PktPIDAck), CmdAgentParty, 0, 0)) { // °ÔÀÓ ¼­¹ö·Î ºê·Îµåij½ºÆÃ // CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer( reinterpret_cast(&pktPIDAck), sizeof(PktPIDAck), CmdAgentParty)); return true; } } return true; } bool TransferLeader(CSendStream& SendStream, PktPMD* lpPktPMD) { unsigned long dwPartyID = lpPktPMD->m_dwPartyID; unsigned long dwSenderID = lpPktPMD->m_dwSenderID; unsigned long dwReferenceID = lpPktPMD->m_dwGID; using namespace DataStorage; CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(dwSenderID); CCharacterData* lpCharacterData = 0; CPartyDBInfo* lpParty = 0; if(0 == lpSessionData) { ERRLOG2(g_Log, "ÆÄƼ ·Î±× : PID:%10u / CID:%10u / ¸®´õ ÀÌ¾ç ½ÇÆÐ : ij¸¯ÅÍ Ã£±â ½ÇÆÐ", dwPartyID, dwSenderID); } else if(0 == (lpCharacterData = lpSessionData->GetCharacterData())) { ERRLOG2(g_Log, "ÆÄƼ ·Î±× : PID:%10u / CID:%10u / ¸®´õ ÀÌ¾ç ½ÇÆÐ : ij¸¯ÅÍ µ¥ÀÌÅÍ ¾øÀ½", dwPartyID, dwSenderID); } else if(0 == (lpParty = CPartyDBMgr::GetInstance().FindPartyMap(dwPartyID))) { ERRLOG2(g_Log, "ÆÄƼ ·Î±× : PID:%10u / CID:%10u / ¸®´õ ÀÌ¾ç ½ÇÆÐ : ÆÄƼ ã±â ½ÇÆÐ", dwPartyID, dwSenderID); } else if(!lpParty->TransferLeader(dwReferenceID, dwSenderID)) { ERRLOG3(g_Log, "ÆÄƼ ·Î±× : PID:%10u / OldLeaderCID:%10u / NewLeaderCID:%10u / ¸®´õ ÀÌ¾ç ½ÇÆÐ", dwPartyID, dwReferenceID, dwSenderID); } else { DETLOG3(g_Log, "ÆÄƼ ·Î±× : PID:%10u / OldLeaderCID:%10u / NewLeaderCID:%10u / ¸®´õ ÀÌ¾ç ¼º°ø", dwPartyID, dwReferenceID, dwSenderID); SendPacket::PartyCmd(PktDD::SCmdTransferLeader, lpParty->GetPID(), dwSenderID, 0, 0, lpSessionData->GetServerID(), 0, lpCharacterData->GetName()); } return true; } bool InsertPartyMember(CSendStream& SendStream, PktPMD* lpPktPMD) { unsigned long dwPartyID = lpPktPMD->m_dwPartyID; unsigned long dwSenderID = lpPktPMD->m_dwSenderID; unsigned long dwGID = lpPktPMD->m_dwGID; unsigned short wClass = lpPktPMD->m_wClass; char cLevel = lpPktPMD->m_cLevel; // ÆÄƼ¿ø Ãß°¡ if (!CPartyDBMgr::GetInstance().InsertPartyMember( CDBSingleObject::GetInstance(), dwPartyID, dwSenderID, dwGID, wClass, cLevel)) { ERRLOG2(g_Log, "ÆÄƼ ·Î±× : PID:%10u / CID:%10u / ÆÄƼ ¸â¹ö Ãß°¡ ½ÇÆÐ", dwPartyID, dwSenderID); } CPartyDBInfo* lpParty = CPartyDBMgr::GetInstance().OpenParty(CDBSingleObject::GetInstance(), dwPartyID); if(lpParty) { // ij¸¯ÅÍ Á¤º¸ ¾÷µ¥ÀÌÆ® // lpParty->SetUserInfoLevel(dwSenderID, cLevel); lpParty->SetUserInfoClass(dwSenderID, wClass); lpParty->SetUserInfoGID(dwSenderID, dwGID); } return true; } bool DeletePartyMember(CSendStream& SendStream, PktPMD* lpPktPMD) { unsigned long dwPartyID = lpPktPMD->m_dwPartyID; unsigned long dwSenderID = lpPktPMD->m_dwSenderID; unsigned long dwReferenceID = lpPktPMD->m_dwGID; // űÀÇ °æ¿ì if (dwSenderID != dwReferenceID) { dwReferenceID = 0; } CPartyDBInfo* lpParty = CPartyDBMgr::GetInstance().OpenParty(CDBSingleObject::GetInstance(), dwPartyID); if(lpParty) { // ij¸¯ÅÍ Á¤º¸ ¾÷µ¥ÀÌÆ® // lpParty->SetUserInfoLevel(dwSenderID, 0); lpParty->SetUserInfoClass(dwSenderID, 0); lpParty->SetUserInfoGID(dwSenderID, 0); } // ÆÄƼ¿ø »èÁ¦ if (!CPartyDBMgr::GetInstance().DeletePartyMember( CDBSingleObject::GetInstance(), dwPartyID, dwSenderID, dwReferenceID)) { ERRLOG2(g_Log, "ÆÄƼ ·Î±× : PID:%10u / CID:%10u / ÆÄƼ ¸â¹ö »èÁ¦ ½ÇÆÐ", dwPartyID, dwSenderID); } return true; } bool AutoRoutingOn(CSendStream& SendStream, PktPMD* lpPktPMD) { unsigned long dwPartyID = lpPktPMD->m_dwPartyID; unsigned long dwSenderID = lpPktPMD->m_dwSenderID; unsigned long dwReferenceID = lpPktPMD->m_dwGID; // ¿ÀÅä·çÆÃ Äѱâ if (!CPartyDBMgr::GetInstance().AutoRoutingOn( CDBSingleObject::GetInstance(), dwPartyID, dwSenderID)) { ERRLOG2(g_Log, "ÆÄƼ ·Î±× : PID:%10u / CID:%10u / ij¸¯ÅÍÀÇ ¿ÀÅä·çÆÃ ÄÑ±â ½ÇÆÐ (CID °¡ 0À̸é ALL)", dwPartyID, dwSenderID); } return true; } bool AutoRoutingOff(CSendStream& SendStream, PktPMD* lpPktPMD) { unsigned long dwPartyID = lpPktPMD->m_dwPartyID; unsigned long dwSenderID = lpPktPMD->m_dwSenderID; unsigned long dwReferenceID = lpPktPMD->m_dwGID; // ¿ÀÅä·çÆÃ ²ô±â if (!CPartyDBMgr::GetInstance().AutoRoutingOff( CDBSingleObject::GetInstance(), dwPartyID, dwSenderID)) { ERRLOG2(g_Log, "ÆÄƼ ·Î±× : PID:%10u / CID:%10u / ij¸¯ÅÍÀÇ ¿ÀÅä·çÆÃ ²ô±â ½ÇÆÐ (CID °¡ 0À̸é ALL)", dwPartyID, dwSenderID); } return true; } bool RelayPacket(CSendStream& SendStream, PktDD* lpPktDD) { unsigned short usPacketSize = lpPktDD->GetLen(); switch(lpPktDD->m_wCmd) { case PktDD::SCmdLevelUpPartyMem: case PktDD::SCmdChangeClassPartyMem: case PktDD::SCmdChangeGuildPartyMem: { PktPMD* lpPktPMD = static_cast(lpPktDD); CPartyDBInfo* lpParty = CPartyDBMgr::GetInstance().OpenParty(CDBSingleObject::GetInstance(), lpPktPMD->m_dwPartyID); if(lpParty) { // ij¸¯ÅÍ Á¤º¸ ¾÷µ¥ÀÌÆ® // if(PktDD::SCmdLevelUpPartyMem) { lpParty->SetUserInfoLevel(lpPktPMD->m_dwSenderID, lpPktPMD->m_cLevel); } if(PktDD::SCmdChangeClassPartyMem) { lpParty->SetUserInfoClass(lpPktPMD->m_dwSenderID, lpPktPMD->m_wClass); } if(PktDD::SCmdChangeGuildPartyMem) { lpParty->SetUserInfoGID(lpPktPMD->m_dwSenderID, lpPktPMD->m_dwGID); } } } break; } if(PacketWrap::WrapHeader(reinterpret_cast(lpPktDD), usPacketSize, CmdAgentParty, 0, 0)) { CGameDispatch::GetDispatchTable().Process(CSendPacketAllServer( reinterpret_cast(lpPktDD), usPacketSize, CmdAgentParty)); } return true; } } }