#include "stdafx.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "DBAgentRequest.h" #include "DBAgentDispatch.h" #include "DBAgentPacketParse.h" #include 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( 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 °èÁ¤ ±¹ÀûÀ» °ÔÀÓ¼­¹öÀÇ Ä³¸¯ÅͰ¡ °¡Áöµµ·Ï ±¸Çö 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(lpPktBase); // ÆÐŶ ±æÀÌ °Ë»ç. CHECK_PACKET_SIZE( size_t nPacketLength = lpPktBase->GetLen(); if (nPacketLength < sizeof(PktDepositUpdateDB)) { ERRLOG2(g_Log, "ÆÐŶ ±æÀ̰¡ ¸ÂÁö ¾Ê½À´Ï´Ù. ÃÖ¼Ò Å©±â:%d, ÇöÀç Å©±â:%d", sizeof(PktDepositUpdateDB), nPacketLength); return false; } size_t nTotalLength = lpPktDepoistUpdateDB->m_usDataSize + sizeof(PktDepositUpdateDB); if (nTotalLength != nPacketLength) { ERRLOG2(g_Log, "ÆÐŶ ±æÀ̰¡ ¸ÂÁö ¾Ê½À´Ï´Ù. ÆÐŶ Å©±â:%d, Àüü Å©±â:%d", nPacketLength, nTotalLength); return false; } ); CServerRequest::Result result(lpPktDepoistUpdateDB->m_dwRequestKey, lpPktDepoistUpdateDB->m_bUpdateComplete); CGameClientDispatch* lpGameClientDispatch = static_cast(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(); // ¹Ýµå½Ã ¸ÕÀú ³Ö¾î¾ß ÇÑ´Ù. Deposit.SetTabFlag(lpPktDepoistUpdateDB->m_dwTabFlag); if (!Deposit.SerializeIn(reinterpret_cast(lpPktDepoistUpdateDB + 1), lpPktDepoistUpdateDB->m_usDataSize)) { ERRLOG1(g_Log, "CID:0x%08x â°í µ¥ÀÌÅÍÀÇ ¾÷µ¥ÀÌÆ®¿¡ ½ÇÆÐÇß½À´Ï´Ù.", dwCID); } // ¾÷µ¥ÀÌÆ®°¡ ¿Ï·áµÇ´Â °æ¿ì, Ŭ¶óÀÌ¾ðÆ®·Î ·Î±×ÀÎÀ» º¸³½´Ù. 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 ·Î±×ÀÎÀ» ó¸®ÇÕ´Ï´Ù.(%s) " "DBAgent¿¡¼­ ·Î±×ÀÎÀ» ¹Þ¾Æ ij¸¯ÅÍ¿¡ ¼¼ÆÃÇß½À´Ï´Ù.", lpCharacter->GetUID(), dwCID, lpCharacter, lpGameClientDispatch->GetUID(), lpGameClientDispatch, (lpCharacter->IsPeaceMode()) ? "ÆòÈ­¸ðµå" : "ÀüÀï¸ðµå")); lpCharacter->PrepareLogin(); // ij¸¯ÅÍ ·Î±×ÀÎ º¸³»±â 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(lpPktBase); unsigned long dwCID = *reinterpret_cast(lpPktDeposit->m_szData); CServerRequest::Result result(lpPktDeposit->m_dwRequestKey, false); CGameClientDispatch* lpGameClientDispatch = static_cast(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(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(lpPktBase); unsigned long dwUserID = lpConfigDB->m_dwUserID; unsigned long dwCharID = lpConfigDB->m_dwCharID; unsigned short wSize = lpConfigDB->m_wSize; char* lpDataPointer = reinterpret_cast(lpConfigDB) + sizeof(PktConfigInfo); CServerRequest::Result result(lpConfigDB->m_dwRequestKey, false); CGameClientDispatch* lpGameClientDispatch = static_cast(result.GetDispatch()); // Ŭ¶óÀÌ¾ðÆ®¸¦ ã¾Æ ¾÷µ¥ÀÌÆ®ÇÑ´Ù. if (0 != lpGameClientDispatch) { CCharacter* lpCharacter = lpGameClientDispatch->GetCharacter(); if (0 != lpCharacter && dwCharID == lpCharacter->GetCID()) { if (0 != wSize) { // ¹ÝÀü ¸ðµå´Â °³³ä¸¸ÀÌ ³²¾ÆÀÖÁö¸¸, DB ±¸Á¶ º¯°æÀÌ ºÒÆíÇϹǷΠ²®µ¥±â¸¸ ³²°ÜµÐ´Ù. (2005-05-31 by ·Îµò) PeaceModeInfo PeaceMode; PeaceModeInfo* lpPeaceModeInfo = reinterpret_cast(lpDataPointer); PeaceMode = *lpPeaceModeInfo; // lpCharacter->SetPeaceMode(PeaceMode, true); lpDataPointer += sizeof(PeaceModeInfo); RejectOption Reject; RejectOption* lpRejectOption = reinterpret_cast(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(lpPktBase); // ÆÐŶ ±æÀÌ °Ë»ç. CHECK_PACKET_SIZE( size_t nPacketLength = lpPktBase->GetLen(); if (nPacketLength < sizeof(PktDBUpdate)) { ERRLOG2(g_Log, "ÆÐŶ ±æÀ̰¡ ¸ÂÁö ¾Ê½À´Ï´Ù. ÃÖ¼Ò Å©±â:%d, ÇöÀç Å©±â:%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, "ÆÐŶ ±æÀ̰¡ ¸ÂÁö ¾Ê½À´Ï´Ù. ÆÐŶ Å©±â:%d, Àüü Å©±â:%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 °èÁ¤ ±¹ÀûÀ» °ÔÀÓ¼­¹öÀÇ Ä³¸¯ÅͰ¡ °¡Áöµµ·Ï ±¸Çö 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(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·ÎºÎÅÍ ÀÌ»óÇÑ µ¥ÀÌÅͰ¡ µé¾î¿Ô½À´Ï´Ù. " "ŸÀÔ ÄÚµå´Â %d, À¯Àú ¼¼¼Ç Æ÷ÀÎÅÍ´Â 0x%p", dwCID, usTypeCode, lpGameClientDispatch); wError = 1; } if (0 != wError) { ERRLOG3(g_Log, "UID:%d/CID:0x%08x ·Î±×ÀÎ ¿¡·¯. %d", dwUID, dwCID, wError); } else { // ij¸¯ÅÍ »ý¼º 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±ÇÇÑ ¼¼ÆÃ if (usTypeCode == DBUpdateData::ADMIN_LOGIN) { DETLOG3(g_Log, "UID:%d/CID:0x%08x Admin ±ÇÇÑÀ» °¡Áø ij¸¯ÅͰ¡ ·Î±×ÀÎÇß½À´Ï´Ù. ¿î¿µÀÚ ±ÇÇÑ : %d", dwUID, dwCID, lpPktDBUpdate->m_cAdminLevel); lpCharacter->SetAdminLevel(lpPktDBUpdate->m_cAdminLevel); lpCharacter->SetGMModelFlag(lpPktDBUpdate->m_cAdminFlag); } // WORK_LIST 2.4 °èÁ¤ ±¹ÀûÀ» °ÔÀÓ¼­¹öÀÇ Ä³¸¯ÅͰ¡ °¡Áöµµ·Ï ±¸Çö // ij¸¯ÅÍ °èÁ¤ ±¹Àû ¼¼ÆÃ 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¸¯ÅÍ Á¤º¸ ¼¼ÆÃ if (false == lpCharacter->SetCharacterInfo(reinterpret_cast(lpPktDBUpdate + 1), lpPktDBUpdate->m_usUpdate)) { wError = 1; ERRLOG2(g_Log, "UID:%d/CID:0x%08x/CharacterInfo setting failed.", dwUID, dwCID); } // ½ºÅ³ÀÇ ¹«°á¼º üũ lpCharacter->CheckSkillVaild(); // ij¸¯ÅÍ ¸Þ´ÏÀú µî·Ï - ij¸¯ÅÍ À̸§ Map¶§¹®¿¡, ij¸¯ÅÍ Á¤º¸ ¼¼ÆÃ ÈÄ µî·ÏÇØ¾ß ÇÔ. - 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) { // ¿¡·¯ ¹ß»ýÇßÀ¸¸é ÀüºÎ »èÁ¦~~ lpGameClientDispatch->SetCharacter(0); CCreatureManager::GetInstance().DeleteCharacter(lpCharacter); lpCharacter = 0; } // â°í µ¥ÀÌÅͰ¡ ÀüºÎ ¿À¸é Ŭ¶óÀÌ¾ðÆ®·Î ·Î±×ÀÎ º¸³¿. // äÆÃ ±ÝÁö Á¤º¸¸¦ äÆÃ¼­¹ö¿¡¼­ ¹Þ¾Æ¿Â´Ù. GET_SINGLE_DISPATCH(lpChatDispatch, CChatDispatch, CChatDispatch::GetDispatchTable()); if(lpChatDispatch) { char* lpBuffer = lpChatDispatch->GetSendStream().GetBuffer(sizeof(PktChatBanInfo)); if(lpBuffer) { PktChatBanInfo* lpChaBanInfo = reinterpret_cast(lpBuffer); lpChaBanInfo->m_dwCID = dwCID; lpChatDispatch->GetSendStream().WrapCrypt(sizeof(PktChatBanInfo), CmdChatBanInfo, 0, 0); } } } } if (0 != wError) { // ij¸¯ÅÍ µ¥ÀÌÅÍ ¼¼ÆÃ¿¡ ½ÇÆÐÇßÀ¸´Ï ºñÁ¤»ó ·Î±×¾Æ¿ôÀ» º¸³¿. if (0 == lpPktDBUpdate->GetError()) { // ·Î±×ÀÎÀº Á¤»óÀûÀ¸·Î 󸮵Ǿú¾úÀ¸¸é, ·Î±×ÀÎ Ãë¼Ò¸¦ º¸³¿. SendAbnormalLogout(dwUID, dwCID, dwSessionID, dwRequestKey, lpGameClientDispatch); } if (0 != wError && 0 != lpGameClientDispatch) { // ¿¡·¯°¡ µé¾î¿ÔÀ¸¸é ·Î±×ÀÎ ºÒ°¡. 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, "ÆÐŶ ±æÀ̰¡ ³Ê¹« ÀÛ½À´Ï´Ù."); return false; } PktDD* lpPktDD = static_cast(lpPktBase); CCharacterParty* lpParty = NULL; // Á¸¿¡ ÆÄƼ¿øÀÌ ¾ø¾îµµ ´Ù¸¥ Á¸¿¡ ÆÄƼ¿øÀÌ ·Î±×ÀÎ ÇÏ¸é ÆÄÆ¼¸¦ ¾ò¾î¿Â´Ù. switch (lpPktDD->m_wCmd) { case PktDD::SCmdCreateParty: { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktCPDAck), DBAgentDispatch); PktCPDAck* lpCPDAck = static_cast(lpPktBase); lpParty = new CCharacterParty(lpCPDAck->m_Party, true); if (NULL == lpParty) { ERRLOG1(g_Log, "PID:0x%08x ÆÄƼ »ý¼º ½ÇÆÐ.", lpCPDAck->m_Party.m_dwPartyID); } else { PARTY party = lpCPDAck->m_Party; PARTYLOG(DETLOG3(g_Log, "ÆÄƼ ·Î±×(»ý¼º) - PID:0x%08x ¸®´õ:0x%08x °¡ÀÔÀÚ: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(lpPktBase); unsigned long dwPartyID = lpDPD->m_dwPartyID; lpParty = reinterpret_cast(CPartyMgr::GetInstance().GetParty(dwPartyID)); if (NULL != lpParty) { if (false == lpParty->Destory(0, 0)) { ERRLOG1(g_Log, "PID:0x%08x ÆÄƼ ¼Ò¸ê ½ÇÆÐ.", dwPartyID); break; } else { PARTYLOG(DETLOG1(g_Log, "ÆÄƼ ·Î±×(ÇØÃ¼) - 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(lpPktBase); CCharacterParty* lpParty = static_cast( 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 ÆÄƼ »ý¼º ½ÇÆÐ.", lpPIDAck->m_Party.m_dwPartyID); } } if (0 != lpParty) { PARTY party = lpPIDAck->m_Party; PARTYLOG(DETLOG2(g_Log, "ÆÄƼ ·Î±×(°´Ã¼»ý¼º) - PID:0x%08x ¸®´õ: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); // Á¢¼ÓÇÑ Ä³¸¯ÅÍ¿¡°Ô ´Ù¸¥Á¸¿¡ Àִ ij¸¯ÅÍ Á¤º¸¸¦ º¸³½´Ù // lpParty->SendMemberInfoAllNZone(lpPIDAck->m_dwCharID); } } break; } case PktDD::SCmdLoginPartyMem: { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktPMD), DBAgentDispatch); PktPMD* lpPMD = static_cast(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 À߸øµÈ ÆÄƼ Á¤º¸¸¦ °¡Áö°í ÀÖ½À´Ï´Ù.", dwSenderID); break; } // ÆÄƼ ¾ò±â lpParty = reinterpret_cast(CPartyMgr::GetInstance().GetParty(dwPartyID)); if (NULL != lpParty) { lpParty->Login(dwSenderID, dwServerID); PARTYLOG(DETLOG2(g_Log, "ÆÄƼ ·Î±×(·Î±×ÀÎ) - PID:0x%08x ·Î±×ÀÎÇѳð:0x%08x", dwPartyID, dwSenderID)); lpParty->UpdatePartyMemberInfo(dwSenderID, dwGID, wClass, cLevel, true); // °°Àº Á¸¿¡ Àִ ij¸¯ÅÍ¿¡°Ô º¸³½´Ù // char* szPacket = reinterpret_cast(lpPMD); if (PacketWrap::WrapCrypt(szPacket, sizeof(PktPMD), CmdCharPartyMemData, 0, 0)) { lpParty->SendAllLoggedMember( szPacket, sizeof(PktPMD), 0, CmdCharPartyMemData); } // Á¢¼ÓÇÑ Ä³¸¯ÅÍ¿¡°Ô ´Ù¸¥Á¸¿¡ Àִ ij¸¯ÅÍ Á¤º¸¸¦ º¸³½´Ù // lpParty->SendMemberInfoAllNZone(dwSenderID); } else { if (CServerSetup::GetInstance().GetServerID() == dwServerID) { GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable()); if (0 == lpDBAgentDispatch) { ERRLOG0(g_Log, "DBAgent Dispatch ¾ò±â ½ÇÆÐ"); break; } else { CSendStream& SendStream = lpDBAgentDispatch->GetSendStream(); char* lpBuffer = SendStream.GetBuffer(sizeof(PktPID)); if (NULL != lpBuffer) { PktPID* lpPktPID = reinterpret_cast(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, "ÆÄƼ ·Î±×(°´Ã¼»ý¼º ¿äû) - PID:0x%08x ¸®´õ: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(lpPktBase); unsigned long dwPartyID = lpPMD->m_dwPartyID; unsigned long dwSenderID = lpPMD->m_dwSenderID; unsigned long dwReferenceID = lpPMD->m_dwGID; // ÆÄƼ ¾ò±â lpParty = reinterpret_cast(CPartyMgr::GetInstance().GetParty(dwPartyID)); if (NULL != lpParty) { unsigned long dwLeader = lpParty->GetLeader(); int result = lpParty->Logout(dwSenderID, dwReferenceID); // ´Ù¸¥ Á¸ ij¸¯ÅÍ¿¡ ·Î±×¾Æ¿ô Á¤º¸¸¦ ij¸¯Å͵鿡°Ô º¸³½´Ù. // lpParty->SendMemberInfoOutNZone(dwSenderID, PktDD::SCmdLogoutPartyMem); if (1 == result) { // ÆÄƼ ¼Ò¸ê -- Fix Minbobo(Á¤º¸´Â Ç×»ó À¯Áö°¡ µÇ¾î¾ß ÇÔ). //PARTYLOG(DETLOG2(g_Log, "ÆÄƼ ·Î±×(·Î±×¾Æ¿ô::°´Ã¼¼Ò¸ê) - PID:0x%08x ·Î±×¾Æ¿ôÇѳð:0x%08x", dwPartyID, dwSenderID)); //CPartyMgr::GetInstance().DeleteParty(dwPartyID); lpParty->SetLeader(dwReferenceID); break; } else { // ¸®´õ°¡ ·Î±×¾Æ¿ô ÇÑ °æ¿ì¿´´Ù¸é... if (dwLeader == dwSenderID) { lpParty->TransferLeader(dwReferenceID); dwLeader = lpParty->GetLeader(); } } PARTYLOG(DETLOG3(g_Log, "ÆÄƼ ·Î±×(·Î±×¾Æ¿ô) - PID:0x%08x ·Î±×¾Æ¿ôÇѳð:0x%08x ¸®´õ:0x%08x", dwPartyID, dwSenderID, dwLeader)); } break; } case PktDD::SCmdInsertPartyMem: { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktPMD), DBAgentDispatch); PktPMD* lpPMD = static_cast(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; // ÆÄƼ ¾ò±â lpParty = reinterpret_cast(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(lpPMD); if (PacketWrap::WrapCrypt(szPacket, sizeof(PktPMD), CmdCharPartyMemData, 0, 0)) { lpParty->SendAllLoggedMember( szPacket, sizeof(PktPMD), 0, CmdCharPartyMemData); } // Á¢¼ÓÇÑ Ä³¸¯ÅÍ¿¡°Ô ´Ù¸¥Á¸¿¡ Àִ ij¸¯ÅÍ Á¤º¸¸¦ º¸³½´Ù // lpParty->SendMemberInfoAllNZone(dwSenderID); PARTYLOG(DETLOG2(g_Log, "ÆÄƼ ·Î±×(°¡ÀÔ) - PID:0x%08x °¡ÀÔÇѳð:0x%08x", dwPartyID, dwSenderID)); } break; } case PktDD::SCmdDeletePartyMem: { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktPMD), DBAgentDispatch); PktPMD* lpPMD = static_cast(lpPktBase); unsigned long dwPartyID = lpPMD->m_dwPartyID; unsigned long dwSenderID = lpPMD->m_dwSenderID; unsigned long dwReferenceID = lpPMD->m_dwGID; // ÆÄƼ ¾ò±â lpParty = reinterpret_cast(CPartyMgr::GetInstance().GetParty(dwPartyID)); if (NULL != lpParty) { unsigned long dwLeader = lpParty->GetLeader(); // ´Ù¸¥ Á¸ ij¸¯ÅÍ¿¡ »èÁ¦ Á¤º¸¸¦ ij¸¯Å͵鿡°Ô º¸³½´Ù. // lpParty->SendMemberInfoOutNZone(dwSenderID, PktDD::SCmdDeletePartyMem); if (1 == lpParty->Leave(dwSenderID, dwReferenceID)) { // ºñ¾î ÀÖ´Â ÆÄƼ ¼Ò¸ê PARTYLOG(DETLOG2(g_Log, "ÆÄƼ ·Î±×(Å»Åð::°´Ã¼¼Ò¸ê) - PID:0x%08x Å»ÅðÇѳð:0x%08x", dwPartyID, dwSenderID)); CPartyMgr::GetInstance().DeleteParty(dwPartyID); break; } // ¸®´õ°¡ Áö¿öÁø °æ¿ì¿´´Ù¸é... if (dwLeader == dwSenderID) { lpParty->TransferLeader(dwReferenceID); } PARTYLOG(DETLOG3(g_Log, "ÆÄƼ ·Î±×(Å»Åð) - PID:0x%08x Å»ÅðÇѳð:0x%08x ¸®´õ:0x%08x", dwPartyID, dwSenderID, lpParty->GetLeader())); } break; } case PktDD::SCmdTransferLeader: { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktPMD), DBAgentDispatch); PktPMD* lpPMD = static_cast(lpPktBase); unsigned long dwPartyID = lpPMD->m_dwPartyID; unsigned long dwSenderID = lpPMD->m_dwSenderID; // ÆÄƼ ¾ò±â lpParty = reinterpret_cast(CPartyMgr::GetInstance().GetParty(dwPartyID)); if (NULL == lpParty) { ERRLOG1(g_Log, "PID:0x%08x ÆÄƼ ¾ò±â ½ÇÆÐ.", dwPartyID); break; } lpParty->TransferLeader(dwSenderID); PARTYLOG(DETLOG2(g_Log, "ÆÄƼ ·Î±×(¸®´õ¾çµµ) - PID:0x%08x »õ¸®´õ:0x%08x", dwPartyID, dwSenderID)); break; } case PktDD::SCmdAutoRoutingOn: { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktPMD), DBAgentDispatch); PktPMD* lpPMD = static_cast(lpPktBase); unsigned long dwPartyID = lpPMD->m_dwPartyID; unsigned long dwSenderID = lpPMD->m_dwSenderID; // ÆÄƼ ¾ò±â lpParty = reinterpret_cast(CPartyMgr::GetInstance().GetParty(dwPartyID)); if (NULL == lpParty) { ERRLOG1(g_Log, "PID:0x%08x ÆÄƼ ¾ò±â ½ÇÆÐ.", dwPartyID); break; } if (false == lpParty->AdjustAutoRouting(dwSenderID, true)) { ERRLOG1(g_Log, "CID:0x%08x ¿ÀÅä·çÆÃ ÄÑ±â ½ÇÆÐ(CID°¡ 0À̸é ALL)", dwSenderID); } lpParty->UpdatePartyMemberAutoRouting(dwSenderID, true); char* szPacket = reinterpret_cast(lpPMD); if (PacketWrap::WrapCrypt(szPacket, sizeof(PktPMD), CmdCharPartyMemData, 0, 0)) { lpParty->SendAllLoggedMember( szPacket, sizeof(PktPMD), 0, CmdCharPartyMemData); // ´Ù¸¥ Á¸¿¡¼­ ij¸¯ÅÍ¿¡ Á¤º¸°¡ º¯°æµÇ¾úÀ»¶§ // lpParty->SendMemberInfoNZone(szPacket, sizeof(PktPMD), dwSenderID, CmdCharPartyMemData); } break; } case PktDD::SCmdAutoRoutingOff: { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktPMD), DBAgentDispatch); PktPMD* lpPMD = static_cast(lpPktBase); unsigned long dwPartyID = lpPMD->m_dwPartyID; unsigned long dwSenderID = lpPMD->m_dwSenderID; // ÆÄƼ ¾ò±â lpParty = reinterpret_cast(CPartyMgr::GetInstance().GetParty(dwPartyID)); if (NULL == lpParty) { ERRLOG1(g_Log, "PID:0x%08x ÆÄƼ ¾ò±â ½ÇÆÐ.", dwPartyID); break; } if (false == lpParty->AdjustAutoRouting(dwSenderID, false)) { ERRLOG1(g_Log, "CID:0x%08x ¿ÀÅä·çÆÃ ²ô±â ½ÇÆÐ(CID°¡ 0À̸é ALL)", dwSenderID); } lpParty->UpdatePartyMemberAutoRouting(dwSenderID, false); char* szPacket = reinterpret_cast(lpPMD); if (PacketWrap::WrapCrypt(szPacket, sizeof(PktPMD), CmdCharPartyMemData, 0, 0)) { lpParty->SendAllLoggedMember( szPacket, sizeof(PktPMD), 0, CmdCharPartyMemData); // ´Ù¸¥ Á¸¿¡¼­ ij¸¯ÅÍ¿¡ Á¤º¸°¡ º¯°æµÇ¾úÀ»¶§ // lpParty->SendMemberInfoNZone(szPacket, sizeof(PktPMD), dwSenderID, CmdCharPartyMemData); } break; } case PktDD::SCmdDeadPartyMem: { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktDeadInfo), DBAgentDispatch); PktDeadInfo* lpPktDeadInfo = static_cast(lpPktBase); // ÆÄƼ ¾ò±â lpParty = reinterpret_cast( CPartyMgr::GetInstance().GetParty(lpPktDeadInfo->m_dwDeadPID)); if (NULL == lpParty) { ERRLOG1(g_Log, "PID:0x%08x ÆÄƼ ¾ò±â ½ÇÆÐ.", lpPktDeadInfo->m_dwDeadPID); } else { char* szPacket = reinterpret_cast(lpPktDeadInfo); if (PacketWrap::WrapCrypt(szPacket, sizeof(PktDeadInfo), CmdCharDeadInfo, 0, 0)) { lpParty->SendAllLoggedMember(szPacket, sizeof(PktDeadInfo), 0, CmdCharDeadInfo); } } break; } case PktDD::SCmdMoveZonePartyMem: // ÆÄƼ¿ø Á¸À̵¿ º¯°æ. case PktDD::SCmdLevelUpPartyMem: // ÆÄƼ¿ø ·¹º§¾÷ º¯°æ. case PktDD::SCmdChangeClassPartyMem: // ÆÄƼ¿ø Ŭ·¡½º º¯°æ. case PktDD::SCmdChangeGuildPartyMem: // ÆÄƼ¿ø ±æµåÁ¤º¸ º¯°æ. { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktPMD), DBAgentDispatch); PktPMD* lpPMD = static_cast(lpPktBase); unsigned long dwPartyID = lpPMD->m_dwPartyID; unsigned long dwSenderID = lpPMD->m_dwSenderID; // ÆÄƼ ¾ò±â lpParty = reinterpret_cast(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(lpPMD); if (PacketWrap::WrapCrypt(szPacket, sizeof(PktPMD), CmdCharPartyMemData, 0, 0)) { lpParty->SendAllLoggedMember( szPacket, sizeof(PktPMD), 0, CmdCharPartyMemData); // ´Ù¸¥ Á¸¿¡¼­ ij¸¯ÅÍ¿¡ Á¤º¸°¡ º¯°æµÇ¾úÀ»¶§ // lpParty->SendMemberInfoNZone(szPacket, sizeof(PktPMD), dwSenderID, CmdCharPartyMemData); } } else { ERRLOG1(g_Log, "PID:0x%08x ÆÄƼ ¾ò±â ½ÇÆÐ.", dwPartyID); } break; } } return true; } bool DBAgentPacketParse::ParseAgentZone(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase) { size_t nPacketLength = lpPktBase->GetLen(); if (nPacketLength < sizeof(PktDD)) { ERRLOG2(g_Log, "ÆÐŶ ±æÀ̰¡ ÀÌ»óÇÕ´Ï´Ù. packetLength:%d, sizeof(PktDD):%d", nPacketLength, sizeof(PktDD)); return false; } PktDD* lpPktDD = static_cast(lpPktBase); unsigned long dwRequestKey = lpPktDD->m_dwRequestKey; unsigned short wError = lpPktBase->GetError(); CServerRequest::Result result(dwRequestKey); CGameClientDispatch* lpDispatch = static_cast(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°¡ ´Ù¸¨´Ï´Ù : ¹ÞÀº Ű:%d, DispatcherÀÇ Å°:%d", dwUID, dwCID, lpCharacter, lpDispatch, dwRequestKey, dwDispatchRequestKey); } else { DETLOG6(g_Log, "UID:%d/CID:0x%08x(0x%p)/DispatchPointer:0x%p/DBRequest Success - ¹ÞÀº Ű:%d, DispatcherÀÇ Å°:%d", dwUID, dwCID, lpCharacter, lpDispatch, dwRequestKey, dwDispatchRequestKey); } if (NULL == lpDispatch) { ERRLOG0(g_Log, "GameClientDispatch¸¦ ¾ò¾î¿Ã ¼ö ¾ø½À´Ï´Ù."); } else { CSendStream& SendStream = lpDispatch->GetSendStream(); bool bSendResult = true; switch (lpPktDD->m_wCmd) { case PktDD::SCmdCharMoveZone: { // ¿¡·¯°¡ ³ªµµ ÇØµ¿ Á¸ ÇÁ·Î½ÃÁ®¸¦ ÃʱâÈ­ ÇØ¾ßÇÑ´Ù. // ¾È±×·³ ÀÌÈÄ¿¡ Á¸À̵¿ ¸Þ½ÃÁö´Â ÀüºÎ ¹«½ÃÇÏ°Ô µÈ´Ù. ±×·¯¸é ÇØ´çÁ¸¿¡¼­ // ·Î±×¾Æ¿ôÀ» ÇϱâÀü¿¡´Â À̵¿À» ÇÒ¼ö°¡ ¾ø´Ù. // if (PktBase::NO_SERVER_ERR != wError && NULL != lpCharacter) if (NULL != lpCharacter) { lpCharacter->ResetOperationFlag(CCharacter::MOVEZONE_PROCESSED); } PktSZMvDAck* lpSZMvDAck = static_cast(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 ¼­¹öÀ̵¿¿¡ ½ÇÆÐÇϸé ÀüÀïÀ» °­Á¦·Î ²¨ÁØ´Ù. // edith 2009.07.19 À̰÷¿¡¼­´Â lpCharacter°¡ NULL Àϼö°¡ ÀÖ´Ù. 6¿ù¿¡ Ãß°¡ÇÑ ÀüÀå¿ÀÇÁ±â´É¿¡¼­ ´Ù¿îÀÌ ÀϾ È®À²ÀÌ ³ô´Ù. if (0 != wError && NULL != lpCharacter) { if (SERVER_ID::CAPITAL == cZone) { lpCharacter->SetGuildWarFlag(Creature::WAR_OFF); // Client ·Î ÆÐŶÀü´Þ GameClientSendPacket::SendWarOnOff(lpDispatch->GetSendStream(), lpCharacter->GetCID(), GameTime::GUILD, Creature::WAR_OFF, 0); // DBAgent·Î ÆÐŶÀü´Þ 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 ·Î ÆÐŶÀü´Þ GameClientSendPacket::SendWarOnOff(lpDispatch->GetSendStream(), lpCharacter->GetCID(), GameTime::REALM, Creature::WAR_OFF, 0); // DBAgent·Î ÆÐŶÀü´Þ GameClientSendPacket::SendWarOnOff(DBAgentDispatch.GetSendStream(), lpCharacter->GetCID(), GameTime::REALM, Creature::WAR_OFF, 0); } } break; } case PktDD::SCmdServerZone: { PktSAAck* lpSAAck = static_cast(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(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·ÎºÎÅÍ ÀÌ»óÇÑ ÆÐŶÀÌ µé¾î¿Ô½À´Ï´Ù. Ä¿¸Çµå:%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(lpPktBase); // ¾ÆÀÌÅÛ ½Ã¸®¾ó ÃʱâÈ­ 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(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(lpPktBase); CCreatureManager::GetInstance().CalculateEliteBonus(lpPktSCInfo->m_usChannelClientNum); return true; } bool DBAgentPacketParse::ParseSysRankingUpdate(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase) { PktRankingInfo* lpRankingInfo = static_cast(lpPktBase); unsigned short wNum = lpRankingInfo->m_wNum; SERLOG1(g_Log, "ParseSysRankingUpdate : %d", wNum); RankingNode* lpRankingNode = reinterpret_cast(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(lpPktBase); unsigned long dwUID = lpPktUK->m_dwUserID; unsigned long dwCID = lpPktUK->m_dwCharID; // ij¸¯ÅÍ ¾ò±â CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(dwCID); if (0 == lpCharacter) { ERRLOG2(g_Log, "UID:%u/CID:0x%08x/ij¸¯ÅÍ ¾ò±â ½ÇÆÐ.", dwUID, dwCID); SendUserKill(DBAgentDispatch, dwUID, 2); } else { // À¯Àú ¼¼¼Ç ¾ò±â CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher(); if (0 == lpDispatch) { // ÀÌ¹Ì Á¢¼ÓÀÌ ²÷¾îÁ³±â ¶§¹®¿¡, Àá½Ã ÈÄ¿¡ ·Î±×¾Æ¿ôÀÌ °¥ °ÍÀÌ´Ù. // À¯Àú Á×ÀÌ±â ½ÇÆÐ¸¦ º¸³¾ Çʿ䰡 ¾ø´Ù. // SendUserKill(DBAgentDispatch, dwUID, 2); if (lpCharacter->IsLogined() && !lpCharacter->IsLogout()) { SERLOG2(g_Log, "UID:%u/CID:0x%08x/CGameClientDispatch°¡ NULLÀÌÁö¸¸, ·Î±×¾Æ¿ôÀÌ ¼¼ÆÃµÇÁö ¾Ê¾Ò½À´Ï´Ù.", dwUID, dwCID); } } else if (dwUID != lpDispatch->GetUID()) { ERRLOG4(g_Log, "UID:%d/CID:0x%08x/UID´Ù¸§. ¹ÞÀº UID:%d ij¸¯ÅÍ UID:%d", lpDispatch->GetUID(), dwCID, dwUID, lpCharacter->GetUID()); SendUserKill(DBAgentDispatch, dwUID, 2); } else { DETLOG2(g_Log, "UID:%d/CID:0x%08x/À¯Àú Á×À̱⠿ÔÀ½.", dwUID, dwCID); if (0 != lpDispatch) { // ¼ÒÄÏ Å¬·ÎÁî 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(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; } // Ä£±¸ ¸®½ºÆ® ¾÷µ¥ÀÌÆ® bool DBAgentPacketParse::ParseFriendList(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase) { PktFriendDB* lpPktFriendDB = static_cast(lpPktBase); CHECK_PACKET_SIZE( { size_t nPacketLength = lpPktBase->GetLen(); if (nPacketLength < sizeof(PktFriendDB)) { ERRLOG2(g_Log, "ÆÐŶ ±æÀ̰¡ ¸ÂÁö ¾Ê½À´Ï´Ù. ÃÖ¼Ò Å©±â:%d, ÇöÀç Å©±â:%d", sizeof(PktFriendDB), nPacketLength); return false; } size_t nTotalLength = lpPktFriendDB->m_dwData + sizeof(PktFriendDB); if (nTotalLength != nPacketLength) { ERRLOG2(g_Log, "ÆÐŶ ±æÀ̰¡ ¸ÂÁö ¾Ê½À´Ï´Ù. ÆÐŶ Å©±â:%d, Àüü Å©±â:%d", nPacketLength, nTotalLength); return false; } } ) CServerRequest::Result result(lpPktFriendDB->m_dwRequestKey, false); CGameClientDispatch* lpGameClientDispatch = static_cast(result.GetDispatch()); // Ŭ¶óÀÌ¾ðÆ®¸¦ ã¾Æ ¾÷µ¥ÀÌÆ®ÇÑ´Ù. 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(lpPktFriendDB + 1), lpPktFriendDB->m_dwData); break; case PktFriendDB::BAN_LIST: lpCharacter->GetBanList().SerializeIn( reinterpret_cast(lpPktFriendDB + 1), lpPktFriendDB->m_dwData); break; default: SERLOG2(g_Log, "CID:0x%08x DBAgent·ÎºÎÅÍ À߸øµÈ Ä¿¸ÇµåÀÇ Ä£±¸ ¸®½ºÆ® ¾÷µ¥ÀÌÆ®°¡ ¿Ô½À´Ï´Ù. %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; } // Äù½ºÆ® ¾÷µ¥ÀÌÆ® bool DBAgentPacketParse::ParseQuestDB(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase) { PktQuestDB* lpPktQuestDB = static_cast(lpPktBase); CServerRequest::Result result(lpPktQuestDB->m_dwRequestKey, false); CGameClientDispatch* lpGameClientDispatch = static_cast(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(); // ¼öÇàÁßÀÎ Äù½ºÆ® ¸ñ·Ï while (nSize < lpPktQuestDB->m_wExecuteQuestSize) { PktQuestDB::ExecutingQuest* lpExecuteQuest = reinterpret_cast(reinterpret_cast(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; // ¿Ï·á Äù½ºÆ® ¸ñ·Ï while (nSize < lpPktQuestDB->m_wExecuteQuestSize + lpPktQuestDB->m_wHistoryQuestSize) { unsigned short* lpHistoryQuest = reinterpret_cast(reinterpret_cast(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); // Äù½ºÆ®¿¡ ÀÇÇØ ¹Þ´Â ¿µÇâÀ» °è»ê 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(lpPktBase); unsigned long dwUID = lpPktBTN->m_dwUserID; unsigned long dwCID = lpPktBTN->m_dwCharID; // ij¸¯ÅÍ ¾ò±â CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(dwCID); if (0 == lpCharacter) { ERRLOG1(g_Log, "CID:0x%08x ij¸¯ÅÍ ¾ò±â ½ÇÆÐ.", dwCID); } else { // À¯Àú ¼¼¼Ç ¾ò±â CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher(); if (NULL == lpDispatch) { ERRLOG1(g_Log, "CID:0x%08x CGameClientDispatch¾ò±â ½ÇÆÐ.", dwCID); } else { if (dwUID != lpDispatch->GetUID()) { ERRLOG4(g_Log, "UID:%d/CID:0x%08x UID´Ù¸§. ¹ÞÀº UID:%d ij¸¯ÅÍ UID:%d", lpDispatch->GetUID(), dwCID, dwUID, lpCharacter->GetUID()); } else { // °øÁö º¸³»µµ·Ï ¼¼ÆÃ. 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(lpPktBase); unsigned long dwUID = lpPktBTN->m_dwUserID; unsigned long dwCID = lpPktBTN->m_dwCharID; ERRLOG1(g_Log, "CID:0x%08x üŷ1.", dwCID); // üŷ 1 // ij¸¯ÅÍ ¾ò±â CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(dwCID); if (0 == lpCharacter) { ERRLOG1(g_Log, "CID:0x%08x ij¸¯ÅÍ ¾ò±â ½ÇÆÐ.", dwCID); } else { // À¯Àú ¼¼¼Ç ¾ò±â CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher(); if (NULL == lpDispatch) { ERRLOG1(g_Log, "CID:0x%08x CGameClientDispatch¾ò±â ½ÇÆÐ.", dwCID); } else { ERRLOG1(g_Log, "CID:0x%08x üŷ2.", dwCID); // üŷ 2 if (dwUID != lpDispatch->GetUID()) { ERRLOG4(g_Log, "UID:%d/CID:0x%08x UID´Ù¸§. ¹ÞÀº UID:%d ij¸¯ÅÍ UID:%d", lpDispatch->GetUID(), dwCID, dwUID, lpCharacter->GetUID()); } else { ERRLOG1(g_Log, "CID:0x%08x üŷ3.", dwCID); // üŷ 3 // °øÁö º¸³»µµ·Ï ¼¼ÆÃ 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¿¡¼­ ¾ÆÀÌÅÛ »ç¿ë¿¡ ´ëÇÑ °á°ú¸¦ ¹Þ´Â°÷ // ¿©±â¼­ ¾ÆÀÌÅÛÀÇ °³¼ö¸¦ 1°³ ÁÙÀ̰í ÇØ´ç ij¸¯ÅÍÇÑÅ× ¾ÆÀÌÅÛÀÌ »ç¿ëµÆ´Ù±¸ ¾Ë¸°´Ù. CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktUI), DBAgentDispatch) PktUI* lpPktUI = static_cast(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(); // ¾ÆÀÌÅÛ »ç¿ë ·Î±×¸¦ ³²±ä´Ù. GAMELOG::LogUseItem(*lpCharacter, itemPos, lpUseItem, usError); // ¾ÆÀÌÅÛ °¹¼ö°¡ 0°³ÀÌ¸é ¾ÆÀÌÅÛÀ» »èÁ¦ÇÑ´Ù. // ³»±¸µµ 1°¨¼Ò unsigned char cRemainItemNum = 0; if(usError == 0) { cRemainItemNum = lpUseItem->GetNumOrDurability(); if (0 < cRemainItemNum) { --cRemainItemNum; lpUseItem->SetNumOrDurability(cRemainItemNum); } // °ñµå¹Ú½º ?ÀÏÀ» Ãß°¡ÇØÁØ´Ù. 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 ¾ÆÀÌÅÛÀ» »èÁ¦ÇÕ´Ï´Ù.", 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 ½Å±Ô À̺¥Æ® Á¦ÀۺκР// DBAgent¿¡¼­ ¾ÆÀÌÅÛ »ç¿ë¿¡ ´ëÇÑ °á°ú¸¦ ¹Þ´Â°÷ // ¿©±â¼­ ¾ÆÀÌÅÛÀÇ °³¼ö¸¦ 1°³ ÁÙÀ̰í ÇØ´ç ij¸¯ÅÍÇÑÅ× ¾ÆÀÌÅÛÀÌ »ç¿ëµÆ´Ù±¸ ¾Ë¸°´Ù. CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktExtraEvent), DBAgentDispatch) PktExtraEvent* lpPktEE = static_cast(lpPktBase); CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(lpPktEE->m_dwCharID); CGameClientDispatch* pDispatch = lpCharacter->GetDispatcher(); unsigned short usError = lpPktBase->GetError(); if(usError == 0) { // ¿¡·¯°¡ ¾ø°í ÇÁ¸®¹Ì¾ö ŸÀÓÀÌ Àû¿ëµÆÀ¸¸é if(lpPktEE->m_dwEventID == 0x001e0001 ) { // °ñµå¹Ú½º 7ÀÏÀ» Ãß°¡ÇØÁØ´Ù. long dwTime = (lpCharacter->GetPremiumTime()+1440*7); lpCharacter->SetPremiumService(dwTime, 1); } else if(lpPktEE->m_dwEventID == 0x003c0001 ) { // °ñµå¹Ú½º 7ÀÏÀ» Ãß°¡ÇØÁØ´Ù. long dwTime = (lpCharacter->GetPremiumTime()+1440*15); lpCharacter->SetPremiumService(dwTime, 1); } else if(lpPktEE->m_dwEventID == 0x005a0001 ) { // °ñµå¹Ú½º 7ÀÏÀ» Ãß°¡ÇØÁØ´Ù. 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(lpPktBase); unsigned short usItemID = lpPktEDI->m_usItemID; CGameEventMgr::GetInstance().PushDropEventItem(usItemID); return true; } // ¿î¿µÀÚ ¸í·É ó¸® bool DBAgentPacketParse::ParseCharAdminCmd(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase) // ¾îµå¹Î ¸í·É ó¸® { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktAdmin), DBAgentDispatch); PktAdmin* lpPktAdmin = static_cast(lpPktBase); // ÇØ´ç ij¸¯ÅͰ¡ ·Î±× ¾Æ¿ôÇÑ °æ¿ì if (lpPktAdmin->GetError() == PktAdmin::E_LOGOUT_CHAR) { // Admin ij¸¯Å͸¦ ¸ñÇ¥ ij¸¯ÅͰ¡ ÀÖ´Â Á¸°ú À§Ä¡·Î À̵¿ ½ÃŲ´Ù. CCharacter* lpAdmin = CCreatureManager::GetInstance().GetCharacter(lpPktAdmin->m_dwAdminCID); if (NULL == lpAdmin) { switch (lpPktAdmin->m_usCmd) { case PktAdmin::TRACE_CHAR: ERRLOG1(g_Log, "¾îµå¹Î ¸í·É ¿À·ù : %s ij¸¯ÅÍ ÃßÀû ¸í·É ½ÇÆÐ. ¾îµå¹Î ij¸¯ÅͰ¡ NULL ÀÔ´Ï´Ù.", lpPktAdmin->m_stName); break; case PktAdmin::INFO_CHAR: ERRLOG1(g_Log, "¾îµå¹Î ¸í·É ¿À·ù : %s ij¸¯ÅÍ Á¤º¸ º¸±â ¸í·É ½ÇÆÐ. ¾îµå¹Î ij¸¯ÅͰ¡ NULL ÀÔ´Ï´Ù.", 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) { // ´Ù¸¥ °ÔÀÓ ¼­¹ö¿¡¼­ ÃßÀûÇÒ Ä³¸¯ÅÍÀÇ À§Ä¡¸¦ ã¾Æ¼­, ¿î¿µÀÚ°¡ ÀÖ´Â ¼­¹ö·Î ´Ù½Ã ¿ÔÀ» °æ¿ì¿¡´Â ¸®ÅÏÇÏÁö ¾ÊÀ½ return true; } return GameClientParsePacket::ProcessAdminCmd(NULL, lpCharacter, lpPktAdmin); } // Àӽà Àκ¥À¸·Î ¾ÆÀÌÅÛ Áö±Þ bool DBAgentPacketParse::ParseGiveItemToTempInven(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase) { PktGiveItemToTempInven* lpGiveItemToTempInven = static_cast(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) { // Àӽà Àκ¥¿¡ °ø°£ÀÌ ÀÖÀ¸¸é ¾ÆÀÌÅÛÀ» Áö±ÞÇÑ´Ù. if (false == lpCharacter->GetTempInven().IsFull()) { lpCharacter->GiveItemByDBAgentRequest(*lpPos); } else { // Áö±Þ ¸øÇÑ ¾ÆÀÌÅÛÀº Ææµù½ÃÄѵдÙ. lpPos->m_dwItemUID = Item::GiveItem::PENDING_ITEM_UID; } } } // ¹ÞÀº ÆÐŶ ±×´ë·Î¿¡´Ù. Áö±ÞÇÑ ¾ÆÀÌÅÛ UIDÃß°¡Çؼ­ DBÁß°è¼­¹ö¿¡ º¸³½´Ù. char* lpSendBuffer = reinterpret_cast(lpGiveItemToTempInven); if(PacketWrap::WrapHeader(lpSendBuffer, sizeof(PktGiveItemToTempInven), CmdGiveItemToTempInven, 0, 0)) { return DBAgentDispatch.GetSendStream().PutBuffer( lpSendBuffer, sizeof(PktGiveItemToTempInven), CmdGiveItemToTempInven); } return false; } // À̸§ º¯°æ ¿äû¿¡´ëÇÑ Ack bool DBAgentPacketParse::ParseCharNameChangeAck(CDBAgentDispatch& DBAgentDispatch, PktBase* lpPktBase) { unsigned short usError = lpPktBase->GetError(); PktCharNameChange* lpPktCharNameChange = reinterpret_cast(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; // °è¸íÇã°¡¼­ À§Ä¡ CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(dwCID); CGameClientDispatch* lpGameDispatch = 0; if (0 != lpCharacter && 0 != (lpGameDispatch = lpCharacter->GetDispatcher())) { if (0 == usError) { // ¿©±â¼­ ÇØ´ç¾ÆÀÌÅÛ Á¦°Å 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)) { // À̳ÑÀÌ ÆÄƼ¿¡ °¡ÀÔÇØ ÀÖÀ¸¸é, À̸§ °»½Å if (0 != lpCharacter->GetPID() && 0 != lpCharacter->GetParty()) { lpCharacter->GetParty()->ChangeName(dwCID, szChangedName); } // À̳ÑÀÌ ±æµå¿¡ °¡ÀÔÇØ ÀÖÀ¸¸é, À̸§ °»½Å 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¸¯ÅÍ À̸§ ¹Ù²Ù±â ¼º°ø", 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(lpPktBase); CThreat::SaveEnemyInfo* lpPktSaveEnemyInfo = reinterpret_cast((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_dwTickm_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(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; }