#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 "SendCharCommunity.h" #include "ParseCharCommunity.h" #include "GameClientDispatch.h" bool GameClientParsePacket::ParseCharExchangeCmd(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { using namespace GameClientSendPacket; CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktExC), GameClientDispatch); PktExC* lpPktExC = reinterpret_cast(lpPktBase); CCharacter* lpCharacter = GameClientDispatch.GetCharacter(); CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd()); CSendStream& SendStream = GameClientDispatch.GetSendStream(); unsigned long dwSenderID = lpPktExC->m_dwSenderID; unsigned long dwRecverID = lpPktExC->m_dwRecverID; unsigned char cCmd = lpPktExC->m_cCmd; // ij¸¯ÅÍ ¾ò±â CCreatureManager& CreatureManager = CCreatureManager::GetInstance(); CCharacter* lpSenderCharacter = CreatureManager.GetCharacter(dwSenderID); CCharacter* lpRecverCharacter = CreatureManager.GetCharacter(dwRecverID); if (NULL == lpSenderCharacter || NULL == lpRecverCharacter) { SendCharExchangeCmd(SendStream, dwSenderID, dwRecverID, cCmd, PktExC::SERVER_ERROR); ERRLOG1(g_Log, "CID:%10u ij¸¯ÅÍ ¾ò±â ½ÇÆÐ.", dwRecverID); return true; } // Dispatcher¾ò±â CGameClientDispatch* lpSenderDispatch = lpSenderCharacter->GetDispatcher(); CGameClientDispatch* lpRecverDispatch = lpRecverCharacter->GetDispatcher(); if (NULL == lpSenderDispatch || NULL == lpRecverDispatch) { SendCharExchangeCmd(SendStream, dwSenderID, dwRecverID, cCmd, PktExC::SERVER_ERROR); ERRLOG1(g_Log, "CID:%10u À¯Àú ¼¼¼Ç ¾ò±â ½ÇÆÐ.", dwRecverID); return true; } CSendStream& SenderSendStream = lpSenderDispatch->GetSendStream(); CSendStream& RecverSendStream = lpRecverDispatch->GetSendStream(); Item::CExchangeContainer& SenderExchageContainer = lpSenderCharacter->GetExchange(); Item::CExchangeContainer& RecverExchageContainer = lpRecverCharacter->GetExchange(); switch (cCmd) { case PktExC::EXC_PROPOSE: // Á¦¾È { if (NULL != SenderExchageContainer.GetExchangeCharacter() || NULL != RecverExchageContainer.GetExchangeCharacter()) { SendCharExchangeCmd(SendStream, dwSenderID, dwRecverID, cCmd, PktExC::FAIL_EXCHANGING_CHAR); break; } // Changed by Sparrowhawk ( 2003/04/14 14½Ã47ºÐ) if (lpRecverCharacter->GetRejectOption().Reject.m_Exchange || lpRecverCharacter->GetBanList().IsBan(lpCharacter->GetCID(), lpCharacter->GetCharacterName())) { SendCharExchangeCmd(SendStream, dwSenderID, dwRecverID, cCmd, PktExC::FAIL_REJECT); break; } SendCharExchangeCmd(RecverSendStream, dwSenderID, dwRecverID, cCmd, PktExC::NO_SERVER_ERR); } break; case PktExC::EXC_ACCEPT: // ¼ö¶ô { if(!lpSenderCharacter->GetExchangeID() && !lpRecverCharacter->GetExchangeID()) { SenderExchageContainer.SetExchangeCharacter(lpRecverCharacter); RecverExchageContainer.SetExchangeCharacter(lpSenderCharacter); lpSenderCharacter->SetExchangeID(dwRecverID); lpRecverCharacter->SetExchangeID(dwSenderID); SendCharExchangeCmd(SenderSendStream, dwSenderID, dwRecverID, cCmd, PktExC::NO_SERVER_ERR); SendCharExchangeCmd(RecverSendStream, dwSenderID, dwRecverID, cCmd, PktExC::NO_SERVER_ERR); } } break; case PktExC::EXC_REFUSE: // °ÅÀý { SendCharExchangeCmd(RecverSendStream, dwSenderID, dwRecverID, cCmd, PktExC::NO_SERVER_ERR); } break; case PktExC::EXC_LOCK: // ¶ôÇϱâ { SenderExchageContainer.SetLock(true); SendCharExchangeCmd(SenderSendStream, dwSenderID, dwRecverID, cCmd, PktExC::NO_SERVER_ERR); SendCharExchangeCmd(RecverSendStream, dwSenderID, dwRecverID, cCmd, PktExC::NO_SERVER_ERR); } break; case PktExC::EXC_UNLOCK: // ¶ô ÇØÁ¦ { if (SenderExchageContainer.GetAccept()) { SendCharExchangeCmd(SendStream, dwSenderID, dwRecverID, cCmd, PktExC::SERVER_ERROR); ERRLOG1(g_Log, "CID:%10u È®ÀÎ ¹öưÀ» ´©¸¥ »óÅ¿¡¼­ ¶ôÀ» ÇØÁ¦ÇÏ·Á ÇÔ.", dwSenderID); break; } if (RecverExchageContainer.GetAccept()) { RecverExchageContainer.SetAccept(false); SendCharExchangeCmd(SenderSendStream, dwRecverID, dwSenderID, PktExC::EXC_CANCEL, PktExC::NO_SERVER_ERR); SendCharExchangeCmd(RecverSendStream, dwRecverID, dwSenderID, PktExC::EXC_CANCEL, PktExC::NO_SERVER_ERR); RecverExchageContainer.SetLock(false); SendCharExchangeCmd(SenderSendStream, dwRecverID, dwSenderID, PktExC::EXC_UNLOCK, PktExC::NO_SERVER_ERR); SendCharExchangeCmd(RecverSendStream, dwRecverID, dwSenderID, PktExC::EXC_UNLOCK, PktExC::NO_SERVER_ERR); } SenderExchageContainer.SetLock(false); SendCharExchangeCmd(SenderSendStream, dwSenderID, dwRecverID, cCmd, PktExC::NO_SERVER_ERR); SendCharExchangeCmd(RecverSendStream, dwSenderID, dwRecverID, cCmd, PktExC::NO_SERVER_ERR); } break; case PktExC::EXC_OK: // È®ÀÎ { if (false == SenderExchageContainer.GetLock() || false == RecverExchageContainer.GetLock()) { SendCharExchangeCmd(SendStream, dwSenderID, dwRecverID, cCmd, PktExC::SERVER_ERROR); ERRLOG1(g_Log, "CID:%10u ¶ôÇÏÁö ¾ÊÀº »óÅ¿¡¼­ È®ÀÎÇÏ·¯ ÇÔ.", dwSenderID); break; } SenderExchageContainer.SetAccept(true); SendCharExchangeCmd(SenderSendStream, dwSenderID, dwRecverID, cCmd, PktExC::NO_SERVER_ERR); SendCharExchangeCmd(RecverSendStream, dwSenderID, dwRecverID, cCmd, PktExC::NO_SERVER_ERR); } break; case PktExC::EXC_CANCEL: // È®ÀÎ Ãë¼Ò { SenderExchageContainer.ExchangeCancel(); } break; case PktExC::EXC_EXCHANGE: // °Å·¡ ¼º¸³ { if (!RecverExchageContainer.GetAccept()) { SendCharExchangeCmd(SendStream, dwSenderID, dwRecverID, cCmd, PktExC::FAIL_NOT_ALL_OK); ERRLOG2(g_Log, "¾çÂÊ ¸ðµÎ È®ÀÎÇÏÁö ¾ÊÀº »óÅ¿¡¼­ °Å·¡ ¼º¸³ ¿äû. dwSenderID: 0x%08x, dwRecverID: 0x%08x", dwSenderID, dwRecverID); break; } // ¼ö¶ôÇÒ¶§¿¡ ij¸¯ÅͶû °°ÀºÁö üũ if (lpSenderCharacter->GetExchangeID() != dwRecverID || lpRecverCharacter->GetExchangeID() != dwSenderID) { // Rodin : Ŭ¶óÀÌ¾ðÆ®´ÜÀÇ ¿¡·¯ ¸Þ¼¼Áö 󸮰¡ ¾ø½À´Ï´Ù. // ±×¸®°í ±»ÀÌ Ä³¸¯ÅÍ¿¡ ExchangeID¸¦ µÖ¼­ ºñ±³ÇÒ Çʿ䰡 ÀÖÀ»±î¿ä? // ExchangeContainerÀÇ ExchangeCharacter¸¦ ÀÌ¿ëÇØ¼­ Ã¼Å©ÇØ¼­ ±¦ÂúÀ» µí Çѵ¥... SendCharExchangeCmd(SendStream, dwSenderID, dwRecverID, cCmd, PktExC::FAIL_EXCHANGING_ID); ERRLOG2(g_Log, "°Å·¡ ¼º¸³ ¿äûÀ» ÇÑ Ä³¸¯ÅͰ¡ ¼ö¶ôÇÒ¶§¿¡ ij¸¯ÅͶû ´Ù¸£´Ù. dwSenderID: 0x%08x, dwRecverID: 0x%08x", dwSenderID, dwRecverID); break; } lpSenderCharacter->SetExchangeID(0); lpRecverCharacter->SetExchangeID(0); SenderExchageContainer.SetAccept(true); if (!SenderExchageContainer.ExchangeOK(true)) { ERRLOG2(g_Log, "°Å·¡ »óŰ¡ ¾ø´Â ij¸¯ÅÍÀÔ´Ï´Ù. dwSenderID : 0x%08x, dwRecverID : 0x%08x", dwSenderID, dwRecverID); } SendCharExchangeCmd(SenderSendStream, dwSenderID, dwRecverID, cCmd, PktExC::NO_SERVER_ERR); SendCharExchangeCmd(RecverSendStream, dwSenderID, dwRecverID, cCmd, PktExC::NO_SERVER_ERR); } break; case PktExC::EXC_QUIT: // °Å·¡ Ãë¼Ò { if (!SenderExchageContainer.ExchangeOK(false)) { ERRLOG2(g_Log, "°Å·¡ »ó´ë°¡ ¾ø´Â ij¸¯ÅÍÀÔ´Ï´Ù. dwSenderID : 0x%08x, dwRecverID : 0x%08x", dwSenderID, dwRecverID); } SendCharExchangeCmd(SenderSendStream, dwSenderID, dwRecverID, cCmd, PktExC::NO_SERVER_ERR); SendCharExchangeCmd(RecverSendStream, dwSenderID, dwRecverID, cCmd, PktExC::NO_SERVER_ERR); lpSenderCharacter->SetExchangeID(0); lpRecverCharacter->SetExchangeID(0); } break; } return true; } bool GameClientParsePacket::ParseCharPartyCmd(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { int nPacketLength = lpPktBase->GetLen(); if (nPacketLength < sizeof(PktPC)) { ERRLOG0(g_Log, "ÆÐŶ ±æÀ̰¡ ¸ÂÁö ¾Ê½À´Ï´Ù."); return false; } PktPC* lpPktPC = static_cast(lpPktBase); unsigned long dwPartyID = lpPktPC->m_dwPartyID; unsigned long dwSenderID = lpPktPC->m_dwSenderID; unsigned long dwReferenceID = lpPktPC->m_dwReferenceID; unsigned short usCmd = lpPktPC->m_wCmd; unsigned short usError = 0; // Ưº°È÷ szSenderNameÀÌ ÇÊ¿ä¾ø´Â °æ¿ì¿¡ µé¾î°¡´Â ¾²·¹±â°ª char* szSenderName = "·Îµò"; CSendStream& SendStream = GameClientDispatch.GetSendStream(); AddressInfo SenderAddress; using namespace GameClientSendPacket; switch (usCmd) { case PktPC::PC_INVITE: // ÃÊ´ë { CCharacter* lpSendCharacter = GameClientDispatch.GetCharacter(); CGameClientDispatch* lpRecvGameClientDispatch = NULL; if (NULL == lpSendCharacter) { usError = PktPC::SERVER_ERROR; ERRLOG1(g_Log, "UID:0x%08x ij¸¯ÅÍ ¾ò±â ½ÇÆÐ.", GameClientDispatch.GetUID()); } else if (dwSenderID != lpSendCharacter->GetCID()) { usError = PktPC::SERVER_ERROR; ERRLOG2(g_Log, "CID:%10u ¿äûÀÚ Ä³¸¯ÅÍ ¾ÆÀÌµð Æ²¸² CID:%10u", lpSendCharacter->GetCID(), dwSenderID); } else { CCharacter* lpRecvCharacter = CCreatureManager::GetInstance().GetCharacter(dwReferenceID); if (NULL == lpRecvCharacter) { usError = PktPC::SERVER_ERROR; ERRLOG1(g_Log, "CID:%10u ij¸¯ÅÍ ¾ò±â ½ÇÆÐ.", dwReferenceID); } else if (lpRecvCharacter->GetRejectOption().Reject.m_Party || lpRecvCharacter->GetBanList().IsBan(lpSendCharacter->GetCID(), lpSendCharacter->GetCharacterName())) { // °ÅºÎ ¿É¼Ç üũ usError = PktPC::FAIL_REJECT; } else if (NULL != lpRecvCharacter->GetParty()) { usError = PktPC::CHAR_JOINED; ERRLOG1(g_Log, "CID:%10u ÀÌ¹Ì ÆÄƼ¿¡ °¡ÀԵǾî ÀÖ½À´Ï´Ù.", dwReferenceID); } else { lpRecvGameClientDispatch = lpRecvCharacter->GetDispatcher(); if (NULL == lpRecvGameClientDispatch) { usError = PktPC::FAIL_INVITE; ERRLOG1(g_Log, "CID:%10u ÀÌ¹Ì ·Î±×¾Æ¿ôÇÑ »ó´ë¿¡°Ô ÆÄƼ °¡ÀÔ ½ÅûÇÏ¿´½À´Ï´Ù.", dwReferenceID); } } } SendCharPartyCmd((0 == usError) ? lpRecvGameClientDispatch->GetSendStream() : SendStream, dwPartyID, SenderAddress, (0 == usError) ? lpSendCharacter->GetCharacterName() : szSenderName, dwSenderID, dwReferenceID, usCmd, usError); } break; case PktPC::PC_ACCEPT: // ÆÄƼ °¡ÀÔ { CCharacter* lpSendCharacter = GameClientDispatch.GetCharacter(); if (NULL == lpSendCharacter) { usError = PktPC::SERVER_ERROR; ERRLOG1(g_Log, "UID:0x%08x ij¸¯ÅÍ ¾ò±â ½ÇÆÐ.", GameClientDispatch.GetUID()); } else if (dwSenderID != lpSendCharacter->GetCID()) { usError = PktPC::SERVER_ERROR; ERRLOG2(g_Log, "CID:%10u ¿äûÀÚ Ä³¸¯ÅÍ ¾ÆÀÌµð Æ²¸² CID:%10u", lpSendCharacter->GetCID(), dwSenderID); } else if (NULL != lpSendCharacter->GetParty()) { usError = PktPC::SERVER_ERROR; ERRLOG1(g_Log, "CID:%10u ÀÌ¹Ì °¡ÀÔµÈ Ä³¸¯ÅͰ¡ °¡ÀÔÀ» Áߺ¹ ¼ö¶ô", dwSenderID); } else { CCharacter* lpRecvCharacter = CCreatureManager::GetInstance().GetCharacter(dwReferenceID); if (NULL == lpRecvCharacter) { usError = PktPC::SERVER_ERROR; ERRLOG1(g_Log, "CID:%10u ij¸¯ÅÍ ¾ò±â ½ÇÆÐ.", dwReferenceID); } else { CCharacterParty* lpParty = reinterpret_cast(lpRecvCharacter->GetParty()); if (NULL == lpParty) { // ÆÄƼ »ý¼º GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable()); if (0 == lpDBAgentDispatch) { usError = PktPC::SERVER_ERROR; ERRLOG0(g_Log, "¿¡ÀÌÀüÆ® ¾ò±â ½ÇÆÐ."); } else { PARTYLOG(DETLOG2(g_Log, "ÆÄƼ ·Î±×(»ý¼º ¿äû) - PID:0x00000000 ¸®´õ:0x%08x °¡ÀÔÀÚ:0x%08x", dwReferenceID, dwSenderID)); // ij¸¯ÅÍ Á¤º¸(Ŭ·¡½º, ·¹º§) // SendCharPartyCreateToDBAgent(lpDBAgentDispatch->GetSendStream(), dwReferenceID, dwSenderID, CServerSetup::GetInstance().GetServerZone(), lpRecvCharacter->GetClass(), lpRecvCharacter->GetLevel(), lpRecvCharacter->GetGID(), lpSendCharacter->GetClass(), lpSendCharacter->GetLevel(), lpSendCharacter->GetGID()); } } else { if (PARTY::MAX_MEM == lpParty->GetMemberNum()) { usError = PktPC::OVER_MEMBER; ERRLOG0(g_Log, "ÆÄƼ Àοø Ãʰú."); } else { PARTYLOG(DETLOG2(g_Log, "ÆÄƼ ·Î±×(°¡ÀÔ ¿äû) - PID:0x%08x °¡ÀÔÀÚ:0x%08x", lpParty->GetUID(), dwSenderID)); lpParty->SendPartyMemberDataToDBAgent(dwSenderID, lpSendCharacter->GetGID(), lpSendCharacter->GetClass(), CServerSetup::GetInstance().GetServerID(), lpSendCharacter->GetLevel(), lpSendCharacter->GetCharacterName(), PktDD::SCmdInsertPartyMem); } } } } if (0 != usError) { SendCharPartyCmd(SendStream, dwPartyID, SenderAddress, szSenderName, dwSenderID, dwReferenceID, usCmd, usError); } } break; case PktPC::PC_REFUSE: // °ÅÀý { CCharacter* lpSendCharacter = GameClientDispatch.GetCharacter(); CCharacter* lpRecvCharacter = NULL; CGameClientDispatch* lpRecvGameClientDispatch = NULL; if (NULL == lpSendCharacter) { usError = PktPC::SERVER_ERROR; ERRLOG1(g_Log, "UID:0x%08x ij¸¯ÅÍ ¾ò±â ½ÇÆÐ.", GameClientDispatch.GetUID()); } else if (dwSenderID != lpSendCharacter->GetCID()) { usError = PktPC::SERVER_ERROR; ERRLOG2(g_Log, "CID:%10u ¿äûÀÚ Ä³¸¯ÅÍ ¾ÆÀÌµð Æ²¸² CID:%10u", lpSendCharacter->GetCID(), dwSenderID); } else { lpRecvCharacter = CCreatureManager::GetInstance().GetCharacter(dwReferenceID); if (NULL == lpRecvCharacter) { usError = PktPC::SERVER_ERROR; ERRLOG1(g_Log, "CID:%10u ij¸¯ÅÍ ¾ò±â ½ÇÆÐ.", dwReferenceID); } else { // À¯Àú ¼¼¼Ç ¾ò±â lpRecvGameClientDispatch = lpRecvCharacter->GetDispatcher(); if (0 == lpRecvGameClientDispatch) { usError = PktPC::SERVER_ERROR; ERRLOG1(g_Log, "CID:%10u À¯Àú ¼¼¼Ç ¾ò±â ½ÇÆÐ.", dwReferenceID); } } } SendCharPartyCmd((0 == usError) ? lpRecvGameClientDispatch->GetSendStream() : SendStream, dwPartyID, SenderAddress, (0 == usError) ? lpSendCharacter->GetCharacterName() : NULL, dwSenderID, dwReferenceID, usCmd, usError); } break; case PktPC::PC_BANISH: // ÅðÀå { CCharacter* lpRecvCharacter = GameClientDispatch.GetCharacter(); if (NULL == lpRecvCharacter) { usError = PktPC::SERVER_ERROR; ERRLOG1(g_Log, "UID:0x%08x ij¸¯ÅÍ ¾ò±â ½ÇÆÐ.", GameClientDispatch.GetUID()); } else if (dwReferenceID != lpRecvCharacter->GetCID()) { usError = PktPC::SERVER_ERROR; ERRLOG2(g_Log, "CID:%10u ¿äûÀÚ Ä³¸¯ÅÍ ¾ÆÀÌµð Æ²¸² CID:%10u", lpRecvCharacter->GetCID(), dwReferenceID); } else { CCharacterParty* lpRecvParty = reinterpret_cast(lpRecvCharacter->GetParty()); if (NULL == lpRecvParty) { usError = PktPC::SERVER_ERROR; ERRLOG1(g_Log, "CID:%10u ÆÄƼ ¾ò±â ½ÇÆÐ.", dwReferenceID); } else { if (false == lpRecvParty->IsMember(dwSenderID)) { usError = PktPC::SERVER_ERROR; ERRLOG2(g_Log, "CID:%10u ÆÄƼ¿øÀÌ ¾Æ´Ñ »ç¶÷À» Å»Åð ½ÃŰ·Á Çϰí ÀÖÀ½. Å»ÅðÀÚ:0x%08x", dwReferenceID, dwSenderID); } else { if (false == lpRecvParty->IsLeader(dwReferenceID)) { usError = PktPC::SERVER_ERROR; ERRLOG2(g_Log, "CID:%10u ¸®´õ°¡ ¾Æ´Ñ ij¸¯ÅͰ¡ Å»Åð ¿äû. Å»ÅðÀÚ:0x%08x", dwReferenceID, dwSenderID); } else { PARTYLOG(DETLOG3(g_Log, "ÆÄƼ ·Î±×(ű ¿äû) - PID:0x%08x Å»ÅðÀÚ:0x%08x ¸®´õ:0x%08x", lpRecvParty->GetUID(), dwSenderID, dwReferenceID)); lpRecvParty->SendPartyMemberDataToDBAgent(dwSenderID, dwReferenceID, 0, 0, 0, "ű", PktDD::SCmdDeletePartyMem); } } } } if (0 != usError) { SendCharPartyCmd(SendStream, dwPartyID, SenderAddress, szSenderName, dwSenderID, dwReferenceID, usCmd, usError); } } break; case PktPC::PC_SECESSION: // Å»Åð { CCharacter* lpSendCharacter = GameClientDispatch.GetCharacter(); if (NULL == lpSendCharacter) { usError = PktPC::SERVER_ERROR; ERRLOG1(g_Log, "UID:0x%08x ij¸¯ÅÍ ¾ò±â ½ÇÆÐ.", GameClientDispatch.GetUID()); } else if (dwSenderID != lpSendCharacter->GetCID()) { usError = PktPC::SERVER_ERROR; ERRLOG2(g_Log, "CID:%10u ¿äûÀÚ Ä³¸¯ÅÍ ¾ÆÀÌµð Æ²¸² CID:%10u", lpSendCharacter->GetCID(), dwSenderID); } else { CCharacterParty* lpParty = reinterpret_cast(lpSendCharacter->GetParty()); if (NULL == lpParty) { usError = PktPC::SERVER_ERROR; ERRLOG1(g_Log, "CID:%10u ÆÄƼ ¾ò±â ½ÇÆÐ.", dwSenderID); } else { PARTYLOG(DETLOG2(g_Log, "ÆÄƼ ·Î±×(Å»Åð ¿äû) - PID:0x%08x Å»ÅðÀÚ:0x%08x", lpParty->GetUID(), dwSenderID)); lpParty->SendPartyMemberDataToDBAgent(dwSenderID, dwSenderID, 0, 0, 0, lpSendCharacter->GetCharacterName(), PktDD::SCmdDeletePartyMem); } } if (0 != usError) { SendCharPartyCmd(SendStream, dwPartyID, SenderAddress, szSenderName, dwSenderID, dwReferenceID, usCmd, usError); } } break; case PktPC::PC_TRANSFER: // ¸®´õ ¾çµµ { CCharacter* lpRecvCharacter = GameClientDispatch.GetCharacter(); if (NULL == lpRecvCharacter) { usError = PktPC::SERVER_ERROR; ERRLOG1(g_Log, "UID:0x%08x ij¸¯ÅÍ ¾ò±â ½ÇÆÐ.", GameClientDispatch.GetUID()); } else if (dwReferenceID != lpRecvCharacter->GetCID()) { usError = PktPC::SERVER_ERROR; ERRLOG2(g_Log, "CID:%10u ¿äûÀÚ Ä³¸¯ÅÍ ¾ÆÀÌµð Æ²¸² CID:%10u", lpRecvCharacter->GetCID(), dwReferenceID); } else { CCharacterParty* lpRecvParty = reinterpret_cast(lpRecvCharacter->GetParty()); if (NULL == lpRecvParty) { usError = PktPC::SERVER_ERROR; ERRLOG1(g_Log, "CID:%10u ÆÄƼ ¾ò±â ½ÇÆÐ.", dwReferenceID); } else { if (false == lpRecvParty->IsMember(dwSenderID) || false == lpRecvParty->IsLeader(dwReferenceID)) { usError = PktPC::SERVER_ERROR; ERRLOG2(g_Log, "Reference°¡ ¸®´õ°¡ ¾Æ´Ï°Å³ª Sender°¡ ÆÄƼ¿øÀÌ ¾Æ´Õ´Ï´Ù. SenderID:0x%08x, ReferenceID:0x%08x", dwSenderID, dwReferenceID); } else { PARTYLOG(DETLOG3(g_Log, "ÆÄƼ ·Î±×(¸®´õ¾çµµ ¿äû) - PID:0x%08x »õ¸®´õ:0x%08x ±âÁ¸¸®´õ:0x%08x", lpRecvParty->GetUID(), dwSenderID, dwReferenceID)); lpRecvParty->SendPartyMemberDataToDBAgent(dwSenderID, dwReferenceID, 0, 0, 0, "¸®´õ¾çµµ", PktDD::SCmdTransferLeader); } } } if (0 != usError) { SendCharPartyCmd(SendStream, dwPartyID, SenderAddress, szSenderName, dwSenderID, dwReferenceID, usCmd, usError); } } break; case PktPC::PC_DESTROY: // ÆÄ±« { CCharacter* lpSendCharacter = GameClientDispatch.GetCharacter(); if (0 == lpSendCharacter) { usError = PktPC::SERVER_ERROR; ERRLOG1(g_Log, "UID:0x%08x ij¸¯ÅÍ ¾ò±â ½ÇÆÐ.", GameClientDispatch.GetUID()); } else if (dwSenderID != lpSendCharacter->GetCID()) { usError = PktPC::SERVER_ERROR; ERRLOG2(g_Log, "CID:%10u ¿äûÀÚ Ä³¸¯ÅÍ ¾ÆÀÌµð Æ²¸² CID:%10u", lpSendCharacter->GetCID(), dwSenderID); } else { CParty* lpParty = lpSendCharacter->GetParty(); if (NULL == lpParty) { usError = PktPC::SERVER_ERROR; ERRLOG1(g_Log, "CID:%10u ÆÄƼ ¾ò±â ½ÇÆÐ.", dwSenderID); } else if (lpParty->IsLeader(dwSenderID)) { GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable()); if (0 == lpDBAgentDispatch) { usError = PktPC::SERVER_ERROR; ERRLOG0(g_Log, "¿¡ÀÌÀüÆ® ¾ò±â ½ÇÆÐ."); } else { PARTYLOG(DETLOG1(g_Log, "ÆÄƼ ·Î±×(ÇØÃ¼ ¿äû) - PID:0x%08x", lpParty->GetUID())); SendCharPartyDestroyToDBAgent(lpDBAgentDispatch->GetSendStream(), lpParty->GetUID()); } } } if (0 != usError) { SendCharPartyCmd(SendStream, dwPartyID, SenderAddress, szSenderName, dwSenderID, dwReferenceID, usCmd, usError); } } break; case PktPC::PC_FINDPARTY: // ÆÄƼ ã±â { if (0 != dwPartyID) { usError = PktPC::ALREADY_PARTY; ERRLOG1(g_Log, "CID:%10u ÆÄƼ¿¡ °¡ÀÔµÈ ³à¼®ÀÌ ÆÄƼ ã±â¿¡ µî·ÏÇÏ·Á ÇÕ´Ï´Ù.", dwSenderID); } else if (0 == dwReferenceID) { if (false == CPartyMgr::GetInstance().DeleteFindPartyList(dwSenderID)) { usError = PktPC::SERVER_ERROR; ERRLOG1(g_Log, "CID:%10u ÆÄƼ ã±â ¸®½ºÆ®¿¡¼­ »èÁ¦ ½ÇÆÐ.", dwSenderID); } } else { if (false == CPartyMgr::GetInstance().AddFindPartyList(dwSenderID)) { usError = PktPC::SERVER_ERROR; ERRLOG1(g_Log, "CID:%10u ÆÄƼ ã±â ¸®½ºÆ®¿¡ Ãß°¡ ½ÇÆÐ.", dwSenderID); } } SendCharPartyCmd(SendStream, dwPartyID, SenderAddress, szSenderName, dwSenderID, dwReferenceID, usCmd, usError); } break; case PktPC::PC_FINDMEMBER: // ÆÄƼ¿ø ã±â { CCharacter* lpSendCharacter = GameClientDispatch.GetCharacter(); if (NULL == lpSendCharacter) { usError = PktPC::SERVER_ERROR; ERRLOG1(g_Log, "UID:0x%08x ij¸¯ÅÍ ¾ò±â ½ÇÆÐ.", GameClientDispatch.GetUID()); } else { CParty* lpParty = lpSendCharacter->GetParty(); if (NULL == lpParty) { usError = PktPC::FAIL_NOT_PARTY; ERRLOG1(g_Log, "CID:%10u ÆÄƼ ¾ò±â ½ÇÆÐ.", lpSendCharacter->GetCID()); } else if (false == lpParty->IsLeader(dwSenderID)) { usError = PktPC::FAIL_NOT_LEADER; ERRLOG1(g_Log, "CID:%10u ¸®´õµµ ¾Æ´Ñ ³ðÀÌ ÆÄƼ ¸â¹ö ã±â¿¡ µî·ÏÇÏ·Á ÇÕ´Ï´Ù.", dwSenderID); } else if (0 == dwReferenceID) { if (false == CPartyMgr::GetInstance().DeleteFindMemberList(dwPartyID)) { usError = PktPC::SERVER_ERROR; ERRLOG1(g_Log, "CID:%10u ÆÄƼ¿ø ã±â ¸®½ºÆ®¿¡¼­ »èÁ¦ ½ÇÆÐ.", dwSenderID); } } else { if (false == CPartyMgr::GetInstance().AddFindMemberList(dwPartyID)) { usError = PktPC::SERVER_ERROR; ERRLOG1(g_Log, "CID:%10u ÆÄƼ¿ø ã±â ¸®½ºÆ®¿¡ Ãß°¡ ½ÇÆÐ.", dwSenderID); } } } SendCharPartyCmd(SendStream, dwPartyID, SenderAddress, szSenderName, dwSenderID, dwReferenceID, usCmd, usError); } break; case PktPC::PC_AUTOROUTING_ON: // ¿ÀÅä·çÆÃ Äѱâ case PktPC::PC_AUTOROUTING_OFF: // ¿ÀÅä·çÆÃ ²ô±â { CCharacter* lpSendCharacter = GameClientDispatch.GetCharacter(); if (NULL == lpSendCharacter) { usError = PktPC::SERVER_ERROR; ERRLOG1(g_Log, "UID:0x%08x ij¸¯ÅÍ ¾ò±â ½ÇÆÐ.", GameClientDispatch.GetUID()); } else { CCharacterParty* lpParty = reinterpret_cast(lpSendCharacter->GetParty()); if (NULL == lpParty) { usError = PktPC::SERVER_ERROR; ERRLOG1(g_Log, "CID:%10u ÆÄƼ ¾ò±â ½ÇÆÐ.", lpSendCharacter->GetCID()); } else if (false == lpParty->IsLeader(lpSendCharacter->GetCID())) { usError = PktPC::SERVER_ERROR; ERRLOG1(g_Log, "CID:%10u ¸®´õµµ ¾Æ´Ñ ³ðÀÌ ¿ÀÅä·çÆÃÀ» Á¶Á¤ÇÏ·Á ÇÕ´Ï´Ù.", dwSenderID); } else { PARTYLOG(DETLOG3(g_Log, "ÆÄƼ ·Î±×(¿ÀÅä·çÆÃ Äѱâ/²ô±â) CID°¡ 0À̸é ALL- PID:0x%08x CID:%10u On:%d", lpParty->GetUID(), dwSenderID, ((PktPC::PC_AUTOROUTING_ON == usCmd) ? true : false))); if (usCmd == PktPC::PC_AUTOROUTING_ON) { lpParty->SendPartyMemberDataToDBAgent(dwSenderID, dwReferenceID, 0, 0, 0, "¿ÀÅä·çÆÃ", PktDD::SCmdAutoRoutingOn); } else { lpParty->SendPartyMemberDataToDBAgent(dwSenderID, dwReferenceID, 0, 0, 0, "¿ÀÅä·çÆÃ", PktDD::SCmdAutoRoutingOff); } } } if (0 != usError) { SendCharPartyCmd(SendStream, dwPartyID, SenderAddress, szSenderName, dwSenderID, dwReferenceID, usCmd, usError); } } break; } return true; } bool GameClientParsePacket::ParseCharPartyFind(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktPF), GameClientDispatch); PktPF* lpPktPF = reinterpret_cast(lpPktBase); CCharacter* lpCharacter = GameClientDispatch.GetCharacter(); CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd()); // ÆÄƼ ã±â CPartyMgr::GetInstance().SendPartyFind(lpCharacter); return true; } bool GameClientParsePacket::ParseCharStallOpen(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktStO), GameClientDispatch); PktStO* lpPktStO = reinterpret_cast(lpPktBase); CCharacter* lpCharacter = GameClientDispatch.GetCharacter(); CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd()); unsigned long dwCharID = lpPktStO->m_dwCharID; char strStallName[PktStO::MAX_STALL_NAME_LEN]; strncpy(strStallName, lpPktStO->m_StallName, PktStO::MAX_STALL_NAME_LEN); if (0 == strcmp(strStallName, "")) { if (false == lpCharacter->GetStall().Close()) { ERRLOG1(g_Log, "CID:%10u ÀÌ¹Ì ³ëÁ¡»óÀ» ´ÝÀº »óÅÂÀÔ´Ï´Ù.", dwCharID); } } else { if (false == lpCharacter->GetStall().Open(strStallName)) { ERRLOG1(g_Log, "CID:%10u ÀÌ¹Ì ³ëÁ¡»óÀ» ¿­Àº »óÅÂÀÔ´Ï´Ù.", dwCharID); } } return lpCharacter->GetStall().SendCharStallOpen(strStallName); } bool GameClientParsePacket::ParseCharStallRegisterItem(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktStRI), GameClientDispatch); PktStRI* lpPktStRI = reinterpret_cast(lpPktBase); CCharacter* lpCharacter = GameClientDispatch.GetCharacter(); CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd()); TakeType takeType = lpPktStRI->m_TakeType; unsigned long dwCharID = lpPktStRI->m_dwCharID; unsigned long dwShopID = lpPktStRI->m_dwShopID; unsigned long dwPrice = lpPktStRI->m_dwPrice; Item::CItem* lpItem = NULL; unsigned short usError = PktBase::NO_SERVER_ERR; unsigned char cCmd = lpPktStRI->m_cCmd; switch (cCmd) { case PktStRI::SC_REGISTER: { lpItem = lpCharacter->GetItem(takeType.m_srcPos); if (NULL == lpItem) { usError = PktStRI::FAIL_NOT_ITEM; } else if (false == lpItem->GetItemInfo().m_DetailData.m_bExchangeAndDrop ) { usError = PktStRI::FAIL_NOT_SELL; } else if (takeType.m_dstPos.m_cPos != TakeType::TS_STALL) { usError = PktBase::SERVER_ERROR; ERRLOG1(g_Log, "CID:%10u ¾ÆÀÌÅÛÀ» ³ëÁ¡»ó¿¡ À߸ø ¿Ã·Á ³õ¾Ò½À´Ï´Ù." "RegisterPacket¿¡ DstPos°¡ StallÀÌ ¾Æ´Õ´Ï´Ù.", lpCharacter->GetCID()); } else { lpItem->SetStallPrice(dwPrice); if (false == lpCharacter->MoveItem(takeType)) { usError = PktBase::SERVER_ERROR; } } break; } case PktStRI::SC_CANCEL: { lpItem = lpCharacter->GetItem(takeType.m_dstPos); if (false == lpCharacter->RemoveItem(takeType.m_dstPos)) { usError = PktBase::SERVER_ERROR; } else { GAMELOG::LogStallRegisterRemoveItem(*lpCharacter, lpItem, takeType, cCmd, usError); return true; } break; } case PktStRI::SC_CAMP_REGISTER: { Item::CShopContainer* lpContainer = CCreatureManager::GetInstance().GetShopContainer(dwShopID); if (NULL == lpContainer || Creature::CT_SIEGE_OBJECT != Creature::GetCreatureType(dwShopID)) { usError = PktBase::SERVER_ERROR; ERRLOG2(g_Log, "CID:%10u ¾ÆÀÌÅÛ µî·Ï ½ÇÆÐ : ±æµå ¿ä»õ »óÁ¡ÀÌ ¾Æ´Õ´Ï´Ù. ShopID:%10u", lpCharacter->GetCID(), dwShopID); } else { Item::CCampShopContainer* lpCampShopContainer = reinterpret_cast(lpContainer); lpItem = lpCampShopContainer->RegisterCancelItem(lpCharacter, takeType, dwPrice, cCmd); if (NULL == lpItem) { usError = PktBase::SERVER_ERROR; } } break; } case PktStRI::SC_CAMP_CANCEL: { Item::CShopContainer* lpContainer = CCreatureManager::GetInstance().GetShopContainer(dwShopID); if (NULL == lpContainer || Creature::CT_SIEGE_OBJECT != Creature::GetCreatureType(dwShopID)) { usError = PktBase::SERVER_ERROR; ERRLOG2(g_Log, "CID:%10u ¾ÆÀÌÅÛ µî·Ï Ãë¼Ò ½ÇÆÐ : ±æµå ¿ä»õ »óÁ¡ÀÌ ¾Æ´Õ´Ï´Ù. ShopID:%10u", lpCharacter->GetCID(), dwShopID); } else { Item::CCampShopContainer* lpCampShopContainer = reinterpret_cast(lpContainer); lpItem = lpCampShopContainer->RegisterCancelItem(lpCharacter, takeType, dwPrice, cCmd); if (NULL == lpItem) { usError = PktBase::SERVER_ERROR; } } break; } } // ³ëÁ¡»ó·Î±× : ¾ÆÀÌÅÛ ¿Ã¸®±â ¹× ³»¸®±â (TakeItem°ú °°Àº Çü½ÄÀ¸·Î...) GAMELOG::LogStallRegisterRemoveItem(*lpCharacter, lpItem, takeType, cCmd, usError); return GameClientSendPacket::SendCharStallRegisterItem(GameClientDispatch.GetSendStream(), dwCharID, dwShopID, takeType, dwPrice, cCmd, usError); } bool GameClientParsePacket::ParseCharStallEnter(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktStE), GameClientDispatch); PktStE* lpPktStE = reinterpret_cast(lpPktBase); CCharacter* lpCharacter = GameClientDispatch.GetCharacter(); CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd()); unsigned long dwCustomerID = lpPktStE->m_dwCustomerID; unsigned long dwOwnerID = lpPktStE->m_dwOwnerID; unsigned short usError = PktStE::SUCCESS; CCharacter* lpCustomer = CCreatureManager::GetInstance().GetCharacter(dwCustomerID); if (NULL == lpCustomer) { ERRLOG0(g_Log, "ij¸¯ÅÍ ¾ò±â ½ÇÆÐ."); usError = PktStE::SERVER_ERROR; } else { // ÀÌ¹Ì »óÁ¡¿¡ µé¾î°¡ ÀÖ´ÂÁö¸¦ È®ÀÎÇÑ´Ù. unsigned long dwOtherOwner = lpCustomer->GetStall().GetOtherOwner(); if (0 == dwOwnerID) { // ³ëÁ¡»óÀ» ³ª°¡´Â °æ¿ì Item::CShopContainer* lpContainer = CCreatureManager::GetInstance().GetShopContainer(dwOtherOwner); if (NULL == lpContainer) { ERRLOG2(g_Log, "CID:%10u ³ëÁ¡»ó ¿À·ù : ³ª¿À·Á´Â ³ëÁ¡»ó(%10u)ÀÇ ¾ÆÀ̵𰡠ÀÌ»óÇÕ´Ï´Ù.", lpCustomer->GetCID(), dwOtherOwner); usError = PktStE::FAIL_LEAVE; } else { if (0 != dwOtherOwner) { lpContainer->SendCharStallEnter(lpCustomer->GetCID(), 0); lpContainer->Leave(lpCustomer); return true; } else { ERRLOG1(g_Log, "CID:%10u ³ëÁ¡»ó ¿À·ù : ÀÌ¹Ì ³ëÁ¡»óÀ» ³ª¿Â »óÅÂÀÔ´Ï´Ù.", lpCustomer->GetCID()); usError = PktStE::FAIL_LEAVE; } } } else { // ³ëÁ¡»ó¿¡ µé¾î°¡´Â °æ¿ì Item::CShopContainer* lpContainer = CCreatureManager::GetInstance().GetShopContainer(dwOwnerID); if (NULL == lpContainer) { ERRLOG2(g_Log, "CID:%10u ³ëÁ¡»ó ¿À·ù : µé¾î°¡·Á´Â ³ëÁ¡»ó(%10u)ÀÇ ¾ÆÀ̵𰡠ÀÌ»óÇÕ´Ï´Ù.", lpCustomer->GetCID(), dwOwnerID); usError = PktStE::FAIL_ENTER; } else { if (0 == dwOtherOwner) { if (false == lpContainer->Enter(lpCustomer)) { usError = PktStE::FAIL_FULL_STALL; } else { return lpContainer->SendCharStallEnter(lpCustomer->GetCID(), dwOwnerID); } } else { ERRLOG3(g_Log, "CID:%10u ³ëÁ¡»ó ¿À·ù : ÀÌ¹Ì ³ëÁ¡»ó¿¡ µé¾î°£ »óÅÂÀÔ´Ï´Ù. µé¾î°¡°íÀÚ ÇÏ´Â °÷ : %10u, µé¾î°¡ÀÖ´Â °÷ : %10u", lpCustomer->GetCID(), dwOwnerID, dwOtherOwner); usError = PktStE::FAIL_ENTER; } } } } return GameClientSendPacket::SendCharStallEnter(GameClientDispatch.GetSendStream(), dwCustomerID, dwOwnerID, usError); } // Ä£±¸(°ÅºÎ)¸®½ºÆ® Ãß°¡ bool GameClientParsePacket::ParseCharFriendAdd(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktFriendAddReq), GameClientDispatch); PktFriendAddReq* lpPktFriendAddRequest = reinterpret_cast(lpPktBase); CCharacter* lpCharacter = GameClientDispatch.GetCharacter(); CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd()); unsigned long dwOwnerCID = lpCharacter->GetCID(); unsigned short usError = 0; unsigned char cAckCmd = PktFriendAck::UNKNOWN_ERROR_ACK; switch (lpPktFriendAddRequest->m_cCmd) { case PktFriendAddReq::ADD_FRIEND_REQ: cAckCmd = PktFriendAck::ADD_FRIEND_ACK; break; case PktFriendAddReq::BAN_FRIEND_REQ: cAckCmd = PktFriendAck::ADD_BAN_ACK; break; default: usError = PktFriendAck::CLIENT_ERROR; break; } unsigned long dwFriendUID = 0; unsigned long dwFriendCID = 0; const char* szFriendName = NULL; unsigned long dwGID = 0; unsigned short wClass = 0; char cLevel = 0; if (0 == usError) { // Ä£±¸(ȤÀº °ÅºÎ ¸®½ºÆ® Ãß°¡) CCharacter* lpFriendCharacter = CCreatureManager::GetInstance().GetCharacter( lpPktFriendAddRequest->m_szName); if (NULL == lpFriendCharacter) { usError = PktFriendAck::NOT_LOGINED; } else { switch (lpPktFriendAddRequest->m_cCmd) { case PktFriendAddReq::ADD_FRIEND_REQ: dwGID = lpFriendCharacter->GetGID(); wClass = lpFriendCharacter->GetClass(); cLevel = lpFriendCharacter->GetLevel(); if (lpFriendCharacter->GetRejectOption().Reject.m_Friend || lpFriendCharacter->GetBanList().IsBan(dwOwnerCID, lpCharacter->GetCharacterName())) { // »ó´ë°¡ Ä£±¸ °ÅºÎ¸¦ Ç߰ųª, ³»°¡ »ó´ëÀÇ Ban List¿¡ ¼ÓÇØ ÀÖÀ½. usError = PktFriendAck::REJECTED; } else if (EnemyCheck::EC_ENEMY == lpCharacter->IsEnemy(lpFriendCharacter)) { // Àû±ºÀº ¸®½ºÆ®¿¡ Ãß°¡ÇÒ ¼ö ¾ø´Ù. usError = PktFriendAck::FAIL_ENEMY; } else if (false == lpCharacter->GetFriendList().Add( lpFriendCharacter->GetCID(), lpFriendCharacter->GetCharacterName(), lpFriendCharacter->GetGID(), lpFriendCharacter->GetClass(), lpFriendCharacter->GetLevel(), CServerSetup::GetInstance().GetServerID())) { // ¸®½ºÆ® Ãß°¡ ½ÇÆÐ usError = PktFriendAck::LIST_FULL; ERRLOG2(g_Log, "CID:%10u ¸®½ºÆ®°¡ ²Ë Â÷¼­, ´õ ÀÌ»ó Ä£±¸¸¦ µî·ÏÇÒ ¼ö ¾ø½À´Ï´Ù. ÇöÀç ¸®½ºÆ® ¼ö:%d", dwOwnerCID, lpCharacter->GetFriendList().GetFriendNum()); } else { // lpFriendCharacter ¿¡°Ô lpCharacter°¡ ÀÚ½ÅÀ» Ä£±¸·Î µî·ÏÇß´Ù´Â ¸Þ½ÃÁö¸¦ º¸³» ÁØ´Ù. CGameClientDispatch* lpFriendDispatch = lpFriendCharacter->GetDispatcher(); if (NULL != lpFriendDispatch) { GameClientSendPacket::SendCharFriendAdded(lpFriendDispatch->GetSendStream(), lpCharacter->GetCID(), lpCharacter->GetCharacterName()); } // ¸¸ÀÏ Ä£±¸ Ãß°¡ÇÑ ³à¼®ÀÌ ³» °ÅºÎ ¸®½ºÆ®¿¡ ÀÖÀ» °æ¿ì, ±×³à¼®À» Á¦°ÅÇÑ´Ù. if (lpCharacter->GetBanList().Remove(lpFriendCharacter->GetCID())) { cAckCmd = PktFriendAck::MOVE_BAN_TO_FRIEND; } // DBAgent·Î Ä£±¸ Ãß°¡ Àü¼Û szFriendName = lpFriendCharacter->GetCharacterName(); dwFriendUID = lpFriendCharacter->GetUID(); dwFriendCID = lpFriendCharacter->GetCID(); GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable()); GET_SINGLE_DISPATCH(lpChatDispatch, CChatDispatch, CChatDispatch::GetDispatchTable()); if (NULL != lpDBAgentDispatch && NULL != lpChatDispatch) { CSendStream& DBAgentSendStream = lpDBAgentDispatch->GetSendStream(); CSendStream& ChatSendStream = lpChatDispatch->GetSendStream(); GameClientSendPacket::SendFriendListChangeToDB(DBAgentSendStream, lpCharacter->GetUID(), dwOwnerCID, dwFriendUID, dwFriendCID, 0, lpFriendCharacter->GetGID(), lpFriendCharacter->GetClass(), lpFriendCharacter->GetLevel(), CServerSetup::GetInstance().GetServerID(), PktFriendDB::ADD_FRIEND); GameClientSendPacket::SendFriendListChangeToDB(ChatSendStream, lpCharacter->GetUID(), dwOwnerCID, dwFriendUID, dwFriendCID, 0, lpFriendCharacter->GetGID(), lpFriendCharacter->GetClass(), lpFriendCharacter->GetLevel(), CServerSetup::GetInstance().GetServerID(), PktFriendDB::ADD_FRIEND); if (PktFriendAck::MOVE_BAN_TO_FRIEND == cAckCmd) { // Ãß°¡ÇÑ ³à¼®ÀÌ ³» °ÅºÎ ¸®½ºÆ®¿¡ ÀÖÀ» °æ¿ì, ±× ³à¼®À» °ÅºÎ ¸®½ºÆ®¿¡¼­ Á¦°Å. GameClientSendPacket::SendFriendListChangeToDB(DBAgentSendStream, lpCharacter->GetUID(), dwOwnerCID, dwFriendUID, dwFriendCID, 0, 0, 0, 0, 0, PktFriendDB::REMOVE_BAN); GameClientSendPacket::SendFriendListChangeToDB(ChatSendStream, lpCharacter->GetUID(), dwOwnerCID, dwFriendUID, dwFriendCID, 0, 0, 0, 0, 0, PktFriendDB::REMOVE_BAN); } } } break; case PktFriendAddReq::BAN_FRIEND_REQ: // edith 2009.07.30 °ÅºÎ¸®½ºÆ®¿¡ Àû±ºµµ °ÅºÎÇÒ ¼ö ÀÖµµ·Ï ¼öÁ¤. ´Ù¸¸ Á¾Á·ÀÌ ´Ù¸¦°æ¿ì¿¡µµ °¡´ÉÇÏ°Ô ¼öÁ¤ /* if (EnemyCheck::EC_ENEMY == lpCharacter->IsEnemy(lpFriendCharacter)) { // Àû±ºÀº ¸®½ºÆ®¿¡ Ãß°¡ÇÒ ¼ö ¾ø´Ù. usError = PktFriendAck::FAIL_ENEMY; } else */ if (false == lpCharacter->GetBanList().Add(lpFriendCharacter->GetCID(), lpFriendCharacter->GetCharacterName(), lpFriendCharacter->GetGID(), lpFriendCharacter->GetClass(), lpFriendCharacter->GetLevel(), CServerSetup::GetInstance().GetServerID())) { usError = PktFriendAck::LIST_FULL; ERRLOG2(g_Log, "CID:%10u ¸®½ºÆ®°¡ ²Ë Â÷¼­, ´õ ÀÌ»ó °ÅºÎ ´ë»óÀ» µî·ÏÇÒ ¼ö ¾ø½À´Ï´Ù. ÇöÀç ¸®½ºÆ® ¼ö:%d", dwOwnerCID, lpCharacter->GetBanList().GetBanNum()); } else { dwGID = lpFriendCharacter->GetGID(); wClass = lpFriendCharacter->GetClass(); cLevel = lpFriendCharacter->GetLevel(); // lpFriendCharacter °¡ ÀÚ½ÅÀ» Ä£±¸·Î µî·ÏÇϰí ÀÖÀ¸¸é, ³»°¡ ·Î±×¾Æ¿ôÇϰí ÀÖ´Â °Íó·³ º¸ÀÌ°Ô ÇÑ´Ù. CFriendList::Rebind* lpRebind = lpFriendCharacter->GetFriendList().GetFriend(dwOwnerCID); if (NULL != lpRebind && lpRebind->IsFriend(lpCharacter->GetCharacterName())) { CGameClientDispatch* lpFriendDispatch = lpFriendCharacter->GetDispatcher(); if (NULL != lpFriendDispatch) { GameClientSendPacket::SendCharFriendAck(lpFriendDispatch->GetSendStream(), PktFriendAck::FRIEND_LOGOUT, dwOwnerCID, lpCharacter->GetCharacterName(), 0, 0, 0, 0, 0); } } // ¸¸ÀÏ °ÅºÎ Ãß°¡ÇÑ ³à¼®ÀÌ ³» Ä£±¸ ¸®½ºÆ®¿¡ ÀÖÀ» °æ¿ì, ±×³à¼®À» Á¦°ÅÇÑ´Ù. if (lpCharacter->GetFriendList().Remove(lpFriendCharacter->GetCID())) { cAckCmd = PktFriendAck::MOVE_FRIEND_TO_BAN; } szFriendName = lpFriendCharacter->GetCharacterName(); dwFriendUID = lpFriendCharacter->GetUID(); dwFriendCID = lpFriendCharacter->GetCID(); // DBAgent, äÆÃ ¼­¹ö·Î Ban Ãß°¡ Àü¼Û GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable()); GET_SINGLE_DISPATCH(lpChatDispatch, CChatDispatch, CChatDispatch::GetDispatchTable()); if (NULL != lpDBAgentDispatch && NULL != lpChatDispatch) { CSendStream& DBAgentStream = lpDBAgentDispatch->GetSendStream(); CSendStream& ChatStream = lpChatDispatch->GetSendStream(); GameClientSendPacket::SendFriendListChangeToDB(DBAgentStream, lpCharacter->GetUID(), dwOwnerCID, dwFriendUID, dwFriendCID, 0, lpFriendCharacter->GetGID(), lpFriendCharacter->GetClass(), lpFriendCharacter->GetLevel(), CServerSetup::GetInstance().GetServerID(), PktFriendDB::ADD_BAN); GameClientSendPacket::SendFriendListChangeToDB(ChatStream, lpCharacter->GetUID(), dwOwnerCID, dwFriendUID, dwFriendCID, 0, lpFriendCharacter->GetGID(), lpFriendCharacter->GetClass(), lpFriendCharacter->GetLevel(), CServerSetup::GetInstance().GetServerID(), PktFriendDB::ADD_BAN); if (PktFriendAck::MOVE_FRIEND_TO_BAN == cAckCmd) { GameClientSendPacket::SendFriendListChangeToDB(DBAgentStream, lpCharacter->GetUID(), dwOwnerCID, dwFriendUID, dwFriendCID, 0, 0, 0, 0, 0, PktFriendDB::REMOVE_FRIEND); GameClientSendPacket::SendFriendListChangeToDB(ChatStream, lpCharacter->GetUID(), dwOwnerCID, dwFriendUID, dwFriendCID, 0, 0, 0, 0, 0, PktFriendDB::REMOVE_FRIEND); } } } break; default: usError = PktFriendAck::CLIENT_ERROR; ERRLOG2(g_Log, "CID:%10u Ŭ¶óÀÌ¾ðÆ®¿¡¼­ À߸øµÈ Ä£±¸ Ä¿¸Çµå¸¦ º¸³» ¿Ô½À´Ï´Ù. Ä¿¸Çµå:%d", dwOwnerCID, lpPktFriendAddRequest->m_cCmd); }; } } return GameClientSendPacket::SendCharFriendAck(GameClientDispatch.GetSendStream(), cAckCmd, dwFriendCID, szFriendName, dwGID, wClass, cLevel, CServerSetup::GetInstance().GetServerID(), usError); } // Ä£±¸(°ÅºÎ)¸®½ºÆ® »èÁ¦ bool GameClientParsePacket::ParseCharFriendRemove(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktFriendRemoveReq), GameClientDispatch); PktFriendRemoveReq* lpPktFriendRemoveRequest = reinterpret_cast(lpPktBase); CCharacter* lpCharacter = GameClientDispatch.GetCharacter(); CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd()); unsigned long dwOwnerCID = lpCharacter->GetCID(); unsigned short usError = 0; unsigned char cAckCmd = PktFriendAck::UNKNOWN_ERROR_ACK; char szTargetName[PktFriendAck::MAX_NAME]; char szRemovedName[PktFriendAck::MAX_NAME]; memset(szTargetName, 0, sizeof(PktFriendAck::MAX_NAME)); memset(szRemovedName, 0, sizeof(PktFriendAck::MAX_NAME)); // PktFriendRemoveReq::NOFRIEND_REQ À϶§ »ç¿ë memcpy(szTargetName, lpPktFriendRemoveRequest->m_szName, PktFriendAck::MAX_NAME); switch (lpPktFriendRemoveRequest->m_cCmd) { // edith 2009.08.28 NoFriend Ãß°¡ case PktFriendRemoveReq::NOFRIEND_REQ: { // szTargetName ÀÇ À¯Àú¿¡¼­ ³ªÀÚ½ÅÀ» »«´Ù. cAckCmd = PktFriendAck::NOFRIEND_ACK; CCharacter* lpTargetCharacter = CCreatureManager::GetInstance().GetCharacter(szTargetName); if(lpTargetCharacter) { CFriendList& friendList = lpTargetCharacter->GetFriendList(); CFriendList::Rebind* lpRebind = friendList.GetFriend(dwOwnerCID); if (NULL != lpRebind) { memcpy(szRemovedName, lpRebind->GetCharacterName(), PktFriendAck::MAX_NAME); } if (lpTargetCharacter->GetFriendList().Remove(dwOwnerCID)) { // DBAgent, ChattingÀ¸·Î Ä£±¸ »èÁ¦ Å뺸 º¸³¿. GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable()); GET_SINGLE_DISPATCH(lpChatDispatch, CChatDispatch, CChatDispatch::GetDispatchTable()); if (NULL != lpDBAgentDispatch && NULL != lpChatDispatch) { GameClientSendPacket::SendFriendListChangeToDB(lpDBAgentDispatch->GetSendStream(), lpTargetCharacter->GetUID(), lpTargetCharacter->GetCID(), 0, dwOwnerCID, 0, 0, 0, 0, 0, PktFriendDB::REMOVE_FRIEND); GameClientSendPacket::SendFriendListChangeToDB(lpChatDispatch->GetSendStream(), lpTargetCharacter->GetUID(), lpTargetCharacter->GetCID(), 0, dwOwnerCID, 0, 0, 0, 0, 0, PktFriendDB::REMOVE_FRIEND); } // »©¾ßÇÒ »ç¶÷ÀÇ ¸®½ºÆ®¿¡¼­ °­Á¦·Î »©ÁØ´Ù. GameClientSendPacket::SendCharFriendAck(lpTargetCharacter->GetDispatcher()->GetSendStream(), cAckCmd, dwOwnerCID, szRemovedName, 0, 0, 0, 0, usError); // µÇµ¹·ÁÁÙ À̸§ ¼öÁ¤. memcpy(szRemovedName, szTargetName, PktFriendAck::MAX_NAME); } else { usError = PktFriendAck::NOT_IN_LIST; ERRLOG1(g_Log, "CID:%10u Ä£±¸ ¸®½ºÆ®¿¡ ¾ø´Â ij¸¯Å͸¦ Á¦°ÅÇÏ·Á ÇÏ¿´½À´Ï´Ù.", dwOwnerCID); } } else { usError = PktFriendAck::NOT_LOGINED; ERRLOG1(g_Log, "CID:%10u ·Î±×¾Æ¿ô µÇ¾î Àְųª ´Ù¸¥Á¸¿¡ ÀÖ´Â »ó´ë¿¡°Ô´Â »ç¿ëÇϽǼö ¾ø½À´Ï´Ù.", dwOwnerCID); } break; } case PktFriendRemoveReq::REMOVE_FRIEND_REQ: { cAckCmd = PktFriendAck::REMOVE_FRIEND_ACK; CFriendList& friendList = lpCharacter->GetFriendList(); CFriendList::Rebind* lpRebind = friendList.GetFriend(lpPktFriendRemoveRequest->m_dwCID); if (NULL != lpRebind) { memcpy(szRemovedName, lpRebind->GetCharacterName(), PktFriendAck::MAX_NAME); } if (lpCharacter->GetFriendList().Remove(lpPktFriendRemoveRequest->m_dwCID)) { // DBAgent, ChattingÀ¸·Î Ä£±¸ »èÁ¦ Å뺸 º¸³¿. GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable()); GET_SINGLE_DISPATCH(lpChatDispatch, CChatDispatch, CChatDispatch::GetDispatchTable()); if (NULL != lpDBAgentDispatch && NULL != lpChatDispatch) { GameClientSendPacket::SendFriendListChangeToDB(lpDBAgentDispatch->GetSendStream(), lpCharacter->GetUID(), dwOwnerCID, 0, lpPktFriendRemoveRequest->m_dwCID, 0, 0, 0, 0, 0, PktFriendDB::REMOVE_FRIEND); GameClientSendPacket::SendFriendListChangeToDB(lpChatDispatch->GetSendStream(), lpCharacter->GetUID(), dwOwnerCID, 0, lpPktFriendRemoveRequest->m_dwCID, 0, 0, 0, 0, 0, PktFriendDB::REMOVE_FRIEND); } } else { usError = PktFriendAck::NOT_IN_LIST; ERRLOG1(g_Log, "CID:%10u Ä£±¸ ¸®½ºÆ®¿¡ ¾ø´Â ij¸¯Å͸¦ Á¦°ÅÇÏ·Á ÇÏ¿´½À´Ï´Ù.", dwOwnerCID); } } break; case PktFriendRemoveReq::REMOVE_BAN_REQ: { cAckCmd = PktFriendAck::REMOVE_BAN_ACK; CBanList& banList = lpCharacter->GetBanList(); const char* szBanName = banList.GetBanName(lpPktFriendRemoveRequest->m_dwCID); if (NULL != szBanName) { memcpy(szRemovedName, szBanName, PktFriendAck::MAX_NAME); } if (lpCharacter->GetBanList().Remove(lpPktFriendRemoveRequest->m_dwCID)) { // DBAgent·Î °ÅºÎ »èÁ¦ Å뺸 º¸³¿. GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable()); GET_SINGLE_DISPATCH(lpChatDispatch, CChatDispatch, CChatDispatch::GetDispatchTable()); if (NULL != lpDBAgentDispatch && NULL != lpChatDispatch) { GameClientSendPacket::SendFriendListChangeToDB(lpDBAgentDispatch->GetSendStream(), lpCharacter->GetUID(), dwOwnerCID, 0, lpPktFriendRemoveRequest->m_dwCID, 0, 0, 0, 0, 0, PktFriendDB::REMOVE_BAN); GameClientSendPacket::SendFriendListChangeToDB(lpChatDispatch->GetSendStream(), lpCharacter->GetUID(), dwOwnerCID, 0, lpPktFriendRemoveRequest->m_dwCID, 0, 0, 0, 0, 0, PktFriendDB::REMOVE_BAN); } } else { usError = PktFriendAck::NOT_IN_LIST; ERRLOG1(g_Log, "CID:%10u Ä£±¸ ¸®½ºÆ®¿¡ ¾ø´Â ij¸¯Å͸¦ Á¦°ÅÇÏ·Á ÇÏ¿´½À´Ï´Ù.", dwOwnerCID); } } break; default: usError = PktFriendAck::CLIENT_ERROR; ERRLOG2(g_Log, "0x%08x À߸øµÈ Ŭ¶óÀÌ¾ðÆ® Ä£±¸ ¸®½ºÆ® ¸í·ÉÀÔ´Ï´Ù. %d", dwOwnerCID, lpPktFriendRemoveRequest->m_cCmd); break; } return GameClientSendPacket::SendCharFriendAck(GameClientDispatch.GetSendStream(), cAckCmd, dwOwnerCID, szRemovedName, 0, 0, 0, 0, usError); } // ±âŸ ó¸®(±×·ì ¼³Á¤ µî) bool GameClientParsePacket::ParseCharFriendEtc(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktFriendEtc), GameClientDispatch); PktFriendEtc* lpPktFriendEtc = reinterpret_cast(lpPktBase); CCharacter* lpCharacter = GameClientDispatch.GetCharacter(); CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd()); switch (lpPktFriendEtc->m_cCmd) { case PktFriendEtc::SETGROUP: { // ±×·ì ¼³Á¤Àº Ack¾øÀ½. CFriendList::Rebind* lpRebind = lpCharacter->GetFriendList().GetFriend(lpPktFriendEtc->m_dwCID); if (NULL != lpRebind) { if (lpRebind->SetGroup(lpPktFriendEtc->m_dwData)) { // DBAgent·Î SetGroupÀü¼Û GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable()); GET_SINGLE_DISPATCH(lpChatDispatch, CChatDispatch, CChatDispatch::GetDispatchTable()); if (NULL != lpDBAgentDispatch && NULL != lpChatDispatch) { GameClientSendPacket::SendFriendListChangeToDB(lpDBAgentDispatch->GetSendStream(), lpCharacter->GetUID(), lpCharacter->GetCID(), 0, lpPktFriendEtc->m_dwCID, lpPktFriendEtc->m_dwData, 0, 0, 0, 0, PktFriendDB::SETGROUP); GameClientSendPacket::SendFriendListChangeToDB(lpChatDispatch->GetSendStream(), lpCharacter->GetUID(), lpCharacter->GetCID(), 0, lpPktFriendEtc->m_dwCID, lpPktFriendEtc->m_dwData, 0, 0, 0, 0, PktFriendDB::SETGROUP); } } } break; } } return true; } using namespace Guild; // ±æµå »ý¼º bool GameClientParsePacket::ParseCharCreateGuild(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktCreateGuild), GameClientDispatch); PktCreateGuild* lpPktCreateGuild = reinterpret_cast(lpPktBase); CCharacter* lpCharacter = GameClientDispatch.GetCharacter(); CCharacter* lpMaster = 0; CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd()); unsigned short wError = PktBase::NO_SERVER_ERR; lpPktCreateGuild->m_szGuildName[Guild::MAX_GUILD_NAME_LEN - 1] = 0; if (!Guild::CheckGuildName(lpPktCreateGuild->m_szGuildName)) { wError = PktCreateGuild::FAIL_INVALID_NAME; } else if (NULL == (lpMaster = CCreatureManager::GetInstance().GetCharacter(lpPktCreateGuild->m_dwCID))) { wError = PktBase::SERVER_ERROR; } else { CGuild* lpGuild = Guild::CGuildMgr::GetInstance().GetGuild(lpPktCreateGuild->m_szGuildName); if (NULL != lpGuild) { wError = PktCreateGuild::FAIL_ALREADY_NAME; } else { // edith 2008.02.27 ±æµå»ý¼º ·¹º§ Á¦¿Ü // unsigned char cCreateLevel = CREATE_LEVEL; unsigned long dwCreateGold = Guild::ms_arySetLevelGold[0]; /* if (GameRYL::CHINA == CServerSetup::GetInstance().GetNationType()) { cCreateLevel = CREATE_LEVEL_FOR_CHINA; dwCreateGold = Guild::ms_arySetLevelGoldForChina[0]; } */ /* if (cCreateLevel > lpCharacter->GetStatus().m_nLevel) { wError = PktBase::SERVER_ERROR; } else */ if (dwCreateGold > lpCharacter->GetGold()) { wError = PktBase::SERVER_ERROR; } else { GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable()); if (0 == lpDBAgentDispatch) { wError = PktBase::SERVER_ERROR; } else { GAMELOG::LogGuildCreate(GAMELOG::sGuildLog::REQUEST, 0, lpPktCreateGuild->m_dwCID, 0, 0); return GameClientSendPacket::SendCharCreateGuild(lpDBAgentDispatch->GetSendStream(), lpPktCreateGuild->m_dwCID, 0, lpCharacter->GetNation(), lpPktCreateGuild->m_szGuildName, wError); } } } } GAMELOG::LogGuildCreate(GAMELOG::sGuildLog::REQUEST, 0, lpPktCreateGuild->m_dwCID, 0, wError); CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher(); if (NULL != lpDispatch) { return GameClientSendPacket::SendCharCreateGuild(lpDispatch->GetSendStream(), lpPktCreateGuild->m_dwCID, 0, lpPktCreateGuild->m_cInclination, lpPktCreateGuild->m_szGuildName, wError); } return true; } // ±æµå ¸â¹ö °ü·Ã ¸í·É bool GameClientParsePacket::ParseCharGuildCmd(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktGuildCmd), GameClientDispatch); PktGuildCmd* lpPktGuildCmd = reinterpret_cast(lpPktBase); CCharacter* lpCharacter = GameClientDispatch.GetCharacter(); CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd()); unsigned long dwGID = lpPktGuildCmd->m_dwGID; unsigned long dwSenderID = lpPktGuildCmd->m_dwSenderID; unsigned long dwReferenceID = lpPktGuildCmd->m_dwReferenceID; unsigned short wCmd = lpPktGuildCmd->m_wCmd; unsigned short wError = PktGuildCmd::NO_SERVER_ERR; CGuild* lpGuild = CGuildMgr::GetInstance().GetGuild(dwGID); if (NULL == lpGuild) { ERRLOG4(g_Log, "GID:0x%08x Á¸ÀçÇÏÁö ¾Ê´Â ±æµå¿¡°Ô ¸â¹ö ¸í·ÉÀ» ¿äûÇÏ¿´½À´Ï´Ù. SenderID:0x%08x, ReferenceID:0x%08x, Cmd:%d", dwGID, dwSenderID, dwReferenceID, wCmd); wError = PktBase::SERVER_ERROR; } else { switch (wCmd) { // Send : ÃÊ´ë ¹ÞÀº ij¸¯ÅÍ // Reference : ±æµå ¸â¹ö case PktGuildCmd::GC_INVITE: { lpGuild->InviteMember(dwReferenceID, dwSenderID, wError); break; } // Send : (Ãʴ븦) ¼ö¶ôÇϴ ij¸¯ÅÍ // Reference : ±æµå ¸â¹ö case PktGuildCmd::GC_JOIN: { lpGuild->JoinMember(dwSenderID, Guild::COMMON, wError); GAMELOG::LogGuildJoin(GAMELOG::sGuildLog::REQUEST, lpGuild->GetGID(), dwSenderID, Guild::COMMON, wError); break; } // Send : (Ãʴ븦) °ÅÀýÇϴ ij¸¯ÅÍ // Reference : ±æµå ¸â¹ö case PktGuildCmd::GC_REFUSE: { CCharacter* lpMember = CCreatureManager::GetInstance().GetCharacter(dwReferenceID); if (NULL == lpMember) { return true; } CGameClientDispatch* lpDispatch = lpMember->GetDispatcher(); if (NULL != lpDispatch) { return GameClientSendPacket::SendCharGuildCmd(lpDispatch->GetSendStream(), dwGID, dwSenderID, dwReferenceID, lpCharacter->GetCharacterName(), lpGuild->GetName(), wCmd, wError); } break; } // Send : °¡ÀÔ ¿äûÇϴ ij¸¯ÅÍ // Reference : None case PktGuildCmd::GC_ASK_ENTER: { lpGuild->JoinMember(dwSenderID, Guild::JOIN_WAIT, wError); GAMELOG::LogGuildJoin(GAMELOG::sGuildLog::REQUEST, lpGuild->GetGID(), dwSenderID, Guild::JOIN_WAIT, wError); break; } // Send : Å»Åð ¿äûÇÏ´Â ¸â¹ö // Reference : None case PktGuildCmd::GC_ASK_LEAVE: { lpGuild->SetTitle(dwSenderID, dwSenderID, LEAVE_WAIT, wError); GAMELOG::LogGuildMemberLevelAdjust(GAMELOG::sGuildLog::REQUEST, lpGuild->GetGID(), dwSenderID, dwSenderID, LEAVE_WAIT, wError); GAMELOG::LogGuildLeave(GAMELOG::sGuildLog::REQUEST, lpGuild->GetGID(), dwSenderID, dwSenderID, wError); break; } // Send : Å»Åð ´çÇÏ´Â ¸â¹ö // Reference : Å»Åð ½ÃŰ´Â ¸â¹ö case PktGuildCmd::GC_KICK: { // ±æµåÀü ½Ã°£ÀÌ ¾Æ´Ò¶§¸¸ Å»Åð °¡´É if (!CGameTimeMgr::GetInstance().IsGuildWarTime()) { lpGuild->KickMember(dwReferenceID, dwSenderID, wError); GAMELOG::LogGuildLeave(GAMELOG::sGuildLog::REQUEST, lpGuild->GetGID(), dwReferenceID, dwSenderID, wError); } else { wError = PktGuildCmd::FAIL_GUILDWAR_TIME_KICK; } break; } // Send : Á÷À§ º¯°æµÇ´Â ¸â¹ö // Reference : º¯°æ ÈÄÀÇ Á÷À§ case PktGuildCmd::GC_SETUP_TITLE: { // ±æµåÀü ½Ã°£ÀÌ ¾Æ´Ò¶§¸¸ Å»Åð °¡´É if (CGameTimeMgr::GetInstance().IsGuildWarTime() && Guild::LEAVE_WAIT == dwReferenceID) { wError = PktGuildCmd::FAIL_GUILDWAR_TIME_KICK; } else { lpGuild->SetTitle(lpCharacter->GetCID(), dwSenderID, static_cast(dwReferenceID), wError); GAMELOG::LogGuildMemberLevelAdjust(GAMELOG::sGuildLog::REQUEST, lpGuild->GetGID(), 0, dwSenderID, dwReferenceID, wError); } break; } // ¿ëº´ ½Åû case PktGuildCmd::GC_TACTICS: { lpGuild->TacticsMember(dwSenderID, Guild::JOIN_WAIT, PktGuildCmd::GC_TACTICS, wError); GAMELOG::LogGuildJoin(GAMELOG::sGuildLog::REQUEST, lpGuild->GetGID(), dwSenderID, Guild::TACTICS_WAIT, wError); break; } // ¿ëº´ ½Åû ±ÇÀ¯. case PktGuildCmd::GC_TACTICS_JOIN: { // edith 2009.08.05 ¿ëº´½Åû ±ÇÀ¯´Â ¸·¾Æ¹ö¸°´Ù. // lpGuild->TacticsMember(dwSenderID, Guild::JOIN_WAIT, PktGuildCmd::GC_TACTICS_JOIN, wError); // GAMELOG::LogGuildJoin(GAMELOG::sGuildLog::REQUEST, lpGuild->GetGID(), dwSenderID, Guild::TACTICS_WAIT, wError); break; } // ¿ëº´ Çã°¡. case PktGuildCmd::GC_TACTICS_TITLE: { lpGuild->SetTacticsTitle(lpCharacter->GetCID(), dwSenderID, wCmd, static_cast(dwReferenceID), 0, wError); GAMELOG::LogGuildMemberLevelAdjust(GAMELOG::sGuildLog::REQUEST, lpGuild->GetGID(), 0, dwSenderID, dwReferenceID, wError); break; } // ¿ëº´ Áö¿ø. case PktGuildCmd::GC_TACTICS_REQUEST: { lpGuild->SetTacticsTitle(lpCharacter->GetCID(), dwSenderID, wCmd, static_cast(dwReferenceID), 1, wError); GAMELOG::LogGuildMemberLevelAdjust(GAMELOG::sGuildLog::REQUEST, lpGuild->GetGID(), 0, dwSenderID, dwReferenceID, wError); break; } case PktGuildCmd::GC_TACTICS_KICK: case PktGuildCmd::GC_TACTICS_LEAVE: { // ±æµåÀü ½Ã°£ÀÌ ¾Æ´Ò¶§¸¸ Å»Åð °¡´É if (!CGameTimeMgr::GetInstance().IsGuildWarTime()) { lpGuild->KickTacticsMember(dwSenderID, dwReferenceID, wCmd, wError); GAMELOG::LogGuildLeave(GAMELOG::sGuildLog::REQUEST, lpGuild->GetGID(), dwReferenceID, dwSenderID, wError); } else { // ±æµåÀü ½Ã°£¿¡ ¿ëº´ Å»Åð´Â °¡´ÉÇÏ´Ù.. if ( lpGuild->IsTacticsWaitMember(dwSenderID) ) { lpGuild->KickTacticsMember(dwSenderID, dwReferenceID, wCmd, wError); GAMELOG::LogGuildLeave(GAMELOG::sGuildLog::REQUEST, lpGuild->GetGID(), dwReferenceID, dwSenderID, wError); } else { wError = PktGuildCmd::FAIL_GUILDWAR_TIME_KICK; } } break; } default: { ERRLOG4(g_Log, "GID:0x%08x À߸øµÈ ±æµå ¸â¹ö ¸í·ÉÀÔ´Ï´Ù. SenderID:0x%08x, ReferenceID:0x%08x, Cmd:%d", dwGID, dwSenderID, dwReferenceID, wCmd); wError = PktBase::SERVER_ERROR; break; } } } if (PktBase::NO_SERVER_ERR != wError) { CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher(); if (NULL != lpDispatch) { return GameClientSendPacket::SendCharGuildCmd(lpDispatch->GetSendStream(), dwGID, dwSenderID, dwReferenceID, "¿¡·¯", "¿¡·¯", wCmd, wError); } } return true; } // ±æµå ¸¶Å© º¯°æ bool GameClientParsePacket::ParseCharGuildMark(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktGuildMark), GameClientDispatch); PktGuildMark* lpPktGuildMark = reinterpret_cast(lpPktBase); CCharacter* lpCharacter = GameClientDispatch.GetCharacter(); CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd()); unsigned long dwCID = lpPktGuildMark->m_dwCID; unsigned long dwGID = lpPktGuildMark->m_dwGID; unsigned short wError = PktBase::NO_SERVER_ERR; CGuild* lpGuild = CGuildMgr::GetInstance().GetGuild(dwGID); if (NULL == lpGuild) { ERRLOG1(g_Log, "CID:%10u Á¸ÀçÇÏÁö¾Ê´Â ±æµåÀÇ ¸¶Å©¸¦ º¯°æÇÏ·Á ÇÕ´Ï´Ù.", dwGID); wError = PktGuildMark::FAIL_INVALID_GUILD; } else { wError = lpGuild->SetMark(dwCID, lpPktGuildMark->m_szMark); GAMELOG::LogGuildMarkChange(GAMELOG::sGuildLog::REQUEST, lpGuild->GetGID(), dwCID, lpGuild->GetGold(), lpGuild->GetGold(), lpPktGuildMark->m_szMark, MAX_MARK_SIZE, wError); } if (PktBase::NO_SERVER_ERR != wError) { CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher(); if (NULL != lpDispatch) { return GameClientSendPacket::SendCharGuildMark(lpDispatch->GetSendStream(), dwCID, dwGID, lpPktGuildMark->m_szMark, 0, wError); } } return true; } // ±æµå ·¹º§ º¯°æ bool GameClientParsePacket::ParseCharGuildLevel(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktGuildLevel), GameClientDispatch); PktGuildLevel* lpPktGuildLevel = reinterpret_cast(lpPktBase); CCharacter* lpCharacter = GameClientDispatch.GetCharacter(); CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd()); unsigned long dwCID = lpPktGuildLevel->m_dwUID; unsigned char cLevel = lpPktGuildLevel->m_cLevel; unsigned short wError = PktBase::NO_SERVER_ERR; CCharacter* lpMaster = CCreatureManager::GetInstance().GetCharacter(dwCID); if (NULL == lpMaster) { wError = PktBase::SERVER_ERROR; } else { CGuild* lpGuild = CGuildMgr::GetInstance().GetGuild(lpMaster->GetGID()); if (NULL == lpGuild) { ERRLOG1(g_Log, "CID:%10u ±æµå¿¡ ¼ÓÇÏÁö ¾ÊÀº ij¸¯ÅͰ¡ ±æµå ·¹º§À» º¯°æÇÏ·Á ÇÕ´Ï´Ù.", dwCID); wError = PktBase::SERVER_ERROR; } else { if (false == lpGuild->SetLevel(dwCID, cLevel)) { wError = PktBase::SERVER_ERROR; } GAMELOG::LogGuildLevel(GAMELOG::sGuildLog::REQUEST, lpGuild->GetGID(), dwCID, cLevel, lpGuild->GetGold(), lpGuild->GetGold(), 0); } } if (PktBase::NO_SERVER_ERR != wError) { CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher(); if (NULL != lpDispatch) { return GameClientSendPacket::SendCharGuildLevel(lpDispatch->GetSendStream(), dwCID, cLevel, 0, wError); } } return true; } // ±æµå °ü°è º¯°æ bool GameClientParsePacket::ParseCharGuildRelation(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { CHECK_FIXED_PACKETSIZE(lpPktBase, sizeof(PktGuildRelation), GameClientDispatch); PktGuildRelation* lpPktGuildRelation = reinterpret_cast(lpPktBase); CCharacter* lpCharacter = GameClientDispatch.GetCharacter(); CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd()); unsigned long dwCID = lpPktGuildRelation->m_dwCID; unsigned long dwGID = lpPktGuildRelation->m_dwGID; unsigned long dwTargetGID = lpPktGuildRelation->m_dwTargetGID; unsigned long dwValue = lpPktGuildRelation->m_dwValue; unsigned char cSubCmd = lpPktGuildRelation->m_cSubCmd; char szTargetGuildName[Guild::MAX_GUILD_NAME_LEN] = ""; char szTempGuildName[Guild::MAX_GUILD_NAME_LEN] = ""; unsigned short wError = PktBase::NO_SERVER_ERR; CCharacter* lpMember = CCreatureManager::GetInstance().GetCharacter(dwCID); if (NULL == lpMember) { wError = PktGuildRelation::FAIL_NOT_MEMBER; } else { if (PktGuildRelation::GR_HOSTILITY == cSubCmd && GameTime::GT_NORMAL != CGameTimeMgr::GetInstance().GetCurrentGuildTime()) { ERRLOG1(g_Log, "CID:%10u Àû´ë ¼±¾ðÀ» ÇÒ ¼ö ¾ø´Â ½Ã°£¿¡ °ü°è º¯°æÀ» ¿äûÇÕ´Ï´Ù.", dwCID); wError = PktGuildRelation::FAIL_NOT_HOSTILITY_TIME; } if (PktGuildRelation::GR_ALERT == cSubCmd && GameTime::GT_GUILD_WAR != CGameTimeMgr::GetInstance().GetCurrentGuildTime() && GameTime::GT_PREPARE_END_30 != CGameTimeMgr::GetInstance().GetCurrentGuildTime()) { ERRLOG1(g_Log, "CID:%10u °æ°è Àû´ë ¼±¾ðÀ» ÇÒ ¼ö ¾ø´Â ½Ã°£¿¡ °ü°è º¯°æÀ» ¿äûÇÕ´Ï´Ù.", dwCID); wError = PktGuildRelation::FAIL_NOT_ALERT_TIME; } if (PktGuildRelation::GR_COUNTER == cSubCmd && GameTime::GT_GUILD_WAR != CGameTimeMgr::GetInstance().GetCurrentGuildTime() && GameTime::GT_PREPARE_END_30 != CGameTimeMgr::GetInstance().GetCurrentGuildTime()) { ERRLOG1(g_Log, "CID:%10u Ä«¿îÅÍ Àû´ë ¼±¾ðÀ» ÇÒ¼ö ¾ø´Â ½Ã°£¿¡ °ü°è º¯°æÀ» ¿äûÇÕ´Ï´Ù.", dwCID); wError = PktGuildRelation::FAIL_NOT_COUNTER_TIME; } CGuild* lpGuild = CGuildMgr::GetInstance().GetGuild(lpMember->GetGID()); if (NULL == lpGuild) { ERRLOG1(g_Log, "CID:%10u ±æµå¿¡ ¼ÓÇÏÁö ¾ÊÀº ij¸¯ÅͰ¡ ±æµå °ü°èÀ» º¯°æÇÏ·Á ÇÕ´Ï´Ù.", dwCID); wError = PktGuildRelation::FAIL_NOT_EXIST_GUILD; } else { if (lpGuild->GetMaster().m_dwCID != dwCID) { ERRLOG1(g_Log, "CID:%10u ±æµå ¸¶½ºÅͰ¡ ¾Æ´Ñ ij¸¯ÅͰ¡ ±æµå °ü°è¸¦ º¯°æÇÏ·Á ÇÕ´Ï´Ù.", dwCID); wError = PktGuildRelation::FAIL_NOT_MASTER; } } CGuild* lpTargetGuild = CGuildMgr::GetInstance().GetGuild(dwTargetGID); if (NULL == lpTargetGuild) { ERRLOG2(g_Log, "CID:%10u ±æµå °ü°è¸¦ º¯°æÇÒ·Á´Â »ó´ë ±æµå°¡ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù. GID:0x%08x", dwCID, dwTargetGID); wError = PktGuildRelation::FAIL_NOT_EXIST_GUILD; } else { strncpy(szTargetGuildName, lpTargetGuild->GetName(), Guild::MAX_GUILD_NAME_LEN); } if (wError == PktBase::NO_SERVER_ERR) { switch (cSubCmd) { case PktGuildRelation::GR_HOSTILITY: { // ÀÚ½ÅÀÇ ±æµå¿¡°Ô Àû´ë ¼±¾ð üũ if (lpGuild->GetGID() == dwTargetGID) { ERRLOG1(g_Log, "GID:0x%08x ÀÚ½ÅÀÇ ±æµå¿¡°Ô Àû´ë ¼±¾ðÀ» ÇÏ·ÁÇÕ´Ï´Ù.", lpGuild->GetGID()); wError = PktGuildRelation::FAIL_SELF_GUILD; } // ÀÌ¹Ì Àû´ë °ü°èÀÎÁö üũ if (Guild::HOSTILITY == lpGuild->GetRelation(dwTargetGID)) { ERRLOG2(g_Log, "GID:0x%08x TargetGID:0x%08x ´ë»ó ±æµå¿Í ÀÌ¹Ì Àû´ë °ü°èÀÔ´Ï´Ù.", lpGuild->GetGID(), dwTargetGID); wError = PktGuildRelation::FAIL_ALREADY_HOSTILITY; } // ³»°¡ Àû´ë »óŸ¦ ¹ÞÀº »óÅÂÀÎÁö : Å©·Î½º Àû´ë¸¦ ¹æÁöÇϱâ À§Çؼ­ // »ó´ë¹æÀÌ ÀÌ¹Ì ³ª¸¦ Àû´ë ½ÅûÀ» ÇßÀ¸¸é.. if (Guild::HOSTILITY == lpGuild->GetRelation(dwTargetGID, BY_TARGET) || Guild::TARGET_NEUTRALITY == lpGuild->GetRelation(dwTargetGID, BY_TARGET) ) { ERRLOG2(g_Log, "GID:0x%08x TargetGID:0x%08x ´ë»ó ±æµå¿Í ÀÌ¹Ì Àû´ë °ü°èÀÔ´Ï´Ù.", lpGuild->GetGID(), dwTargetGID); wError = PktGuildRelation::FAIL_ALREADY_HOSTILITY; } // Àû´ë ¼±¾ð±Ç Ãʰú üũ if (lpGuild->GetNumOfRelation(Guild::HOSTILITY) >= Guild::MAX_HOSTILITY_NUM) { dwValue = lpGuild->GetRelationGID(Guild::HOSTILITY); CGuild* lpTempGuild = CGuildMgr::GetInstance().GetGuild(dwValue); if (NULL != lpTempGuild) { strncpy(szTempGuildName, lpTempGuild->GetName(), Guild::MAX_GUILD_NAME_LEN); } wError = PktGuildRelation::FAIL_REQUEST_WINDOW; } // »ó´ë¹æÀÌ ¹ÞÀ»¼ö ÀÖ´Â Àû´ë °ü°è ÃÖ´ëÄ¡ Ãʰú üũ if (lpTargetGuild->GetNumOfRelation(Guild::ALL_HOSTILITY, Guild::BY_TARGET) >= Guild::MAX_HOSTILITY_APPLY_NUM) { ERRLOG2(g_Log, "GID:0x%08x TargetGID:0x%08x ´ë»ó ±æµå°¡ ¹ÞÀ» ¼ö ÀÖ´Â Àû´ë °ü°è ÇѰèÄ¡ÀÔ´Ï´Ù.", lpGuild->GetGID(), dwTargetGID); wError = PktGuildRelation::FAIL_TARGET_HOSTILITY_FULL; } // Àû´ë ¼±¾ð if (wError == PktBase::NO_SERVER_ERR) { // DB Áß°è ¼­¹ö·Î Àü¼Û GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable()); if (0 != lpDBAgentDispatch) { return GameClientSendPacket::SendCharGuildRelation(lpDBAgentDispatch->GetSendStream(), dwCID, lpGuild->GetGID(), dwTargetGID, 0, PktGuildRelation::GR_HOSTILITY, 0); } } break; } case PktGuildRelation::GR_PEACE: { // ÀÚ½ÅÀÇ ±æµå¿¡°Ô ÆòÈ­ ¼±¾ð üũ if (lpGuild->GetGID() == dwTargetGID) { ERRLOG1(g_Log, "GID:0x%08x ÀÚ½ÅÀÇ ±æµå¿¡°Ô ÆòÈ­ ¼±¾ðÀ» ÇÏ·ÁÇÕ´Ï´Ù.", lpGuild->GetGID()); wError = PktGuildRelation::FAIL_SELF_GUILD; } // Á߸³ °ü°èÀÇ ±æµå¿¡°Ô ÆòÈ­ ¼±¾ð üũ if (Guild::NEUTRALITY == lpGuild->GetRelation(dwTargetGID)) { ERRLOG2(g_Log, "GID:0x%08x TargetGID:0x%08x Á߸³ °ü°è ±æµå¿¡°Ô ÆòÈ­ ¼±¾ðÀ» ÇÏ·Á ÇÕ´Ï´Ù.", lpGuild->GetGID(), dwTargetGID); wError = PktGuildRelation::FAIL_ALREADY_NEUTRALITY; } // ÆòÈ­ ¼±¾ð if (wError == PktBase::NO_SERVER_ERR) { // DB Áß°è ¼­¹ö·Î Àü¼Û GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable()); if (0 != lpDBAgentDispatch) { return GameClientSendPacket::SendCharGuildRelation(lpDBAgentDispatch->GetSendStream(), dwCID, lpGuild->GetGID(), dwTargetGID, 0, PktGuildRelation::GR_PEACE, 0); } } break; } case PktGuildRelation::GR_HOSTILITYDEL: { // ÀÚ½ÅÀÇ ±æµå¿¡°Ô ÆòÈ­ ¼±¾ð üũ if (lpGuild->GetGID() == dwTargetGID) { ERRLOG1(g_Log, "GID:0x%08x ÀÚ½ÅÀÇ ±æµå¿¡°Ô ÆòÈ­ ¼±¾ðÀ» ÇÏ·ÁÇÕ´Ï´Ù.", lpGuild->GetGID()); wError = PktGuildRelation::FAIL_SELF_GUILD; } // ÇØ´ç Ÿ°Ù±æµå°¡ µé¾î°¡ÀÖÁö ¾Ê´Ù¸é if (Guild::TARGET_NEUTRALITY != lpGuild->GetRelation(dwTargetGID, Guild::BY_TARGET)) { ERRLOG2(g_Log, "GID:0x%08x TargetGID:0x%08x Çã¶ô´ë±â °ü°è ±æµå°¡ ¾Æ´Ñµ¥ ÆòÈ­ ¼±¾ðÀ» ÇÏ·Á ÇÕ´Ï´Ù.", lpGuild->GetGID(), dwTargetGID); wError = PktGuildRelation::FAIL_ALREADY_NEUTRALITY; } // ÆòÈ­ ¼±¾ð if (wError == PktBase::NO_SERVER_ERR) { // DB Áß°è ¼­¹ö·Î Àü¼Û GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable()); if (0 != lpDBAgentDispatch) { return GameClientSendPacket::SendCharGuildRelation(lpDBAgentDispatch->GetSendStream(), dwCID, lpGuild->GetGID(), dwTargetGID, 0, PktGuildRelation::GR_HOSTILITYDEL, 0); } } break; } case PktGuildRelation::GR_ALERT: { // ÀÚ½ÅÀÇ ±æµå¿¡°Ô °æ°è Àû´ë ¼±¾ð üũ if (lpGuild->GetGID() == dwTargetGID) { ERRLOG1(g_Log, "GID:0x%08x ÀÚ½ÅÀÇ ±æµå¿¡°Ô °æ°è Àû´ë ¼±¾ðÀ» ÇÏ·ÁÇÕ´Ï´Ù.", lpGuild->GetGID()); wError = PktGuildRelation::FAIL_SELF_GUILD; } // ÀÌ¹Ì Àû´ë °ü°èÀÎÁö üũ if (Guild::HOSTILITY == lpGuild->GetRelation(dwTargetGID)) { ERRLOG2(g_Log, "GID:0x%08x TargetGID:0x%08x ´ë»ó ±æµå¿Í ÀÌ¹Ì Àû´ë °ü°èÀÔ´Ï´Ù.", lpGuild->GetGID(), dwTargetGID); wError = PktGuildRelation::FAIL_ALREADY_HOSTILITY; } // ÀÌ¹Ì Ä«¿îÅÍ Àû´ë °ü°èÀÎÁö üũ if (Guild::COUNTER_HOSTILITY == lpGuild->GetRelation(dwTargetGID)) { ERRLOG2(g_Log, "GID:0x%08x TargetGID:0x%08x ´ë»ó ±æµå¿Í ÀÌ¹Ì Ä«¿îÅÍ Àû´ë °ü°èÀÔ´Ï´Ù.", lpGuild->GetGID(), dwTargetGID); wError = PktGuildRelation::FAIL_ALREADY_COUNTER_HOSTILITY; } // ÀÌ¹Ì °æ°è Àû´ë °ü°èÀÎÁö üũ if (Guild::ALERT_HOSTILITY == lpGuild->GetRelation(dwTargetGID)) { ERRLOG2(g_Log, "GID:0x%08x TargetGID:0x%08x ´ë»ó ±æµå¿Í ÀÌ¹Ì °æ°è Àû´ë °ü°èÀÔ´Ï´Ù.", lpGuild->GetGID(), dwTargetGID); wError = PktGuildRelation::FAIL_ALREADY_ALERT_HOSTILITY; } // °æ°è Àû´ë ¼±¾ð±Ç Ãʰú üũ if (lpGuild->GetNumOfRelation(Guild::ALERT_HOSTILITY) >= Guild::MAX_ALERT_NUM) { ERRLOG2(g_Log, "GID:0x%08x TargetGID:0x%08x °æ°è Àû´ë ¼±¾ð±Ç Ãʰú·Î °æ°è Àû´ë ¼±¾ð ½ÇÆÐ", lpGuild->GetGID(), dwTargetGID); wError = PktGuildRelation::FAIL_MAX_ALERT_NUM; } // »ó´ë¹æÀÌ ¹ÞÀ»¼ö ÀÖ´Â Àû´ë °ü°è ÃÖ´ëÄ¡ Ãʰú üũ if (lpTargetGuild->GetNumOfRelation(Guild::ALL_HOSTILITY, Guild::BY_TARGET) >= Guild::MAX_HOSTILITY_APPLY_NUM) { ERRLOG2(g_Log, "GID:0x%08x TargetGID:0x%08x ´ë»ó ±æµå°¡ ¹ÞÀ» ¼ö ÀÖ´Â Àû´ë °ü°è ÇѰèÄ¡ÀÔ´Ï´Ù.", lpGuild->GetGID(), dwTargetGID); wError = PktGuildRelation::FAIL_TARGET_HOSTILITY_FULL; } // ±¸ÃàÁßÀÎ ¿ä»õ À¯¹« üũ bool bHasDevelopingCamp = false, bHasCompleteCamp = false; CSiegeObjectMgr::GetInstance().HasCampByGID(dwTargetGID, bHasDevelopingCamp, bHasCompleteCamp); if (!bHasDevelopingCamp) { ERRLOG2(g_Log, "GID:0x%08x TargetGID:0x%08x ´ë»ó ±æµå°¡ ±¸ÃàÁßÀÎ ±æµå ¿ä»õ¸¦ °¡Áö°í ÀÖÁö ¾Ê½À´Ï´Ù.", lpGuild->GetGID(), dwTargetGID); wError = PktGuildRelation::FAIL_NOT_HAVE_DEVELOPING_CAMP; } // °æ°è Àû´ë ¼±¾ð if (wError == PktBase::NO_SERVER_ERR) { // DB Áß°è ¼­¹ö·Î Àü¼Û GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable()); if (0 != lpDBAgentDispatch) { return GameClientSendPacket::SendCharGuildRelation(lpDBAgentDispatch->GetSendStream(), dwCID, lpGuild->GetGID(), dwTargetGID, 0, PktGuildRelation::GR_ALERT, 0); } } break; } case PktGuildRelation::GR_COUNTER: { // ÀÌ¹Ì Àû´ë °ü°èÀÎÁö üũ if (Guild::HOSTILITY == lpGuild->GetRelation(dwTargetGID)) { ERRLOG2(g_Log, "GID:0x%08x TargetGID:0x%08x ´ë»ó ±æµå¿Í ÀÌ¹Ì Àû´ë °ü°èÀÔ´Ï´Ù.", lpGuild->GetGID(), dwTargetGID); wError = PktGuildRelation::FAIL_ALREADY_HOSTILITY; } // ÀÌ¹Ì Ä«¿îÅÍ Àû´ë °ü°èÀÎÁö üũ if (Guild::COUNTER_HOSTILITY == lpGuild->GetRelation(dwTargetGID)) { ERRLOG2(g_Log, "GID:0x%08x TargetGID:0x%08x ´ë»ó ±æµå¿Í ÀÌ¹Ì Ä«¿îÅÍ Àû´ë °ü°èÀÔ´Ï´Ù.", lpGuild->GetGID(), dwTargetGID); wError = PktGuildRelation::FAIL_ALREADY_COUNTER_HOSTILITY; } // ´ë»ó ±æµå°¡ ³ª¿¡°Ô °æ°è Àû´ë ¼±¾ðÀ» ÇÏ¿´´ÂÁö üũ if (Guild::ALERT_HOSTILITY != lpTargetGuild->GetRelation(lpGuild->GetGID())) { ERRLOG2(g_Log, "GID:0x%08x TargetGID:0x%08x ´ë»ó ±æµå°¡ °æ°è Àû´ë¸¦ ½ÅûÇÏÁö ¾Ê¾Ò´Âµ¥ Ä«¿îÅÍ Àû´ë ½ÅûÀ» ÇÏ·ÁÇÕ´Ï´Ù.", lpGuild->GetGID(), dwTargetGID); wError = PktGuildRelation::FAIL_NOT_HAVE_ALERT; } // »ó´ë¹æÀÌ ¹ÞÀ»¼ö ÀÖ´Â Àû´ë °ü°è ÃÖ´ëÄ¡ Ãʰú üũ if (lpTargetGuild->GetNumOfRelation(Guild::ALL_HOSTILITY, Guild::BY_TARGET) >= Guild::MAX_HOSTILITY_APPLY_NUM) { ERRLOG2(g_Log, "GID:0x%08x TargetGID:0x%08x ´ë»ó ±æµå°¡ ¹ÞÀ» ¼ö ÀÖ´Â Àû´ë °ü°è ÇѰèÄ¡ÀÔ´Ï´Ù.", lpGuild->GetGID(), dwTargetGID); wError = PktGuildRelation::FAIL_TARGET_HOSTILITY_FULL; } // Ä«¿îÅÍ Àû´ë ¼±¾ð if (wError == PktBase::NO_SERVER_ERR) { // DB Áß°è ¼­¹ö·Î Àü¼Û GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable()); if (0 != lpDBAgentDispatch) { return GameClientSendPacket::SendCharGuildRelation(lpDBAgentDispatch->GetSendStream(), dwCID, lpGuild->GetGID(), dwTargetGID, 0, PktGuildRelation::GR_COUNTER, 0); } } break; } case PktGuildRelation::GR_REQUEST: { // Áö±Ý Àû´ë ¼±¾ðÁßÀÎ ±æµå¿Í ÆòÈ­ ¼±¾ðÈÄ ´ë»ó ±æµå¿Í Àû´ë ¼±¾ð if (wError == PktBase::NO_SERVER_ERR) { // DB Áß°è ¼­¹ö·Î Àü¼Û GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable()); if (0 != lpDBAgentDispatch) { return GameClientSendPacket::SendCharGuildRelation(lpDBAgentDispatch->GetSendStream(), dwCID, dwGID, dwTargetGID, dwValue, PktGuildRelation::GR_REQUEST, 0); } } break; } } } } if (PktBase::NO_SERVER_ERR != wError) { CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher(); if (NULL != lpDispatch) { if (PktGuildRelation::FAIL_REQUEST_WINDOW == wError) { return GameClientSendPacket::SendCharGuildRelation(lpDispatch->GetSendStream(), dwCID, dwGID, dwTargetGID, dwValue, cSubCmd, wError, szTargetGuildName, szTempGuildName); } else { return GameClientSendPacket::SendCharGuildRelation(lpDispatch->GetSendStream(), dwCID, dwGID, dwTargetGID, dwValue, cSubCmd, wError); } } } return true; } // ±æµå ¼ºÇâ º¯°æ bool GameClientParsePacket::ParseCharGuildInclination(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { // ´õÀÌ»ó ±æµå ±¹ÀûÀº º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù. (2004-11-22 by ·Îµò) /* PktGuildInclination* lpPktGuildInclination = reinterpret_cast(lpPktBase); CCharacter* lpCharacter = GameClientDispatch.GetCharacter(); CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd()); unsigned long dwCID = lpPktGuildInclination->m_dwUID; unsigned char cInclination = lpPktGuildInclination->m_cInclination; unsigned short wError = PktBase::NO_SERVER_ERR; CCharacter* lpMember = CCreatureManager::GetInstance().GetCharacter(dwCID); if (NULL == lpMember) { wError = PktBase::SERVER_ERROR; } else { CGuild* lpGuild = CGuildMgr::GetInstance().GetGuild(lpMember->GetGID()); if (NULL == lpGuild) { ERRLOG1(g_Log, "CID:%10u ±æµå¿¡ ¼ÓÇÏÁö ¾ÊÀº ij¸¯ÅͰ¡ ±æµå ¼ºÇâÀ» º¯°æÇÏ·Á ÇÕ´Ï´Ù.", dwCID); wError = PktBase::SERVER_ERROR; } else { lpGuild->SetInclination(dwCID, cInclination, wError); } } if (PktBase::NO_SERVER_ERR != wError) { CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher(); if (NULL != lpDispatch) { return GameClientSendPacket::SendCharGuildInclination(lpDispatch->GetSendStream(), dwCID, cInclination, wError); } } */ return true; } // ±æµå ¸®½ºÆ® bool GameClientParsePacket::ParseCharGuildList(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { PktGuildList* lpPktGuildList = reinterpret_cast(lpPktBase); CCharacter* lpCharacter = GameClientDispatch.GetCharacter(); CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd()); unsigned long dwCID = lpPktGuildList->m_dwCID; unsigned char cSortCmd = lpPktGuildList->m_cSortCmd; unsigned char cPage = lpPktGuildList->m_cPage; unsigned char cNodeNum = lpPktGuildList->m_cSmallNodeNum; GuildCheckSumNode* lpNode = reinterpret_cast(lpPktGuildList + 1); return CGuildMgr::GetInstance().SendGuildList(dwCID, cSortCmd, cPage, cNodeNum, lpNode); } // ±æµå ±ÇÇÑ ¼³Á¤ bool GameClientParsePacket::ParseCharGuildRight(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { PktGuildRight* lpPktGuildRight = reinterpret_cast(lpPktBase); CCharacter* lpCharacter = GameClientDispatch.GetCharacter(); CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd()); unsigned long dwCID = lpPktGuildRight->m_dwUID; GuildRight guildRight = lpPktGuildRight->m_GuildRight; unsigned short wError = PktBase::NO_SERVER_ERR; CCharacter* lpMaster = CCreatureManager::GetInstance().GetCharacter(dwCID); if (NULL == lpMaster) { wError = PktBase::SERVER_ERROR; } else { CGuild* lpGuild = CGuildMgr::GetInstance().GetGuild(lpMaster->GetGID()); if (NULL == lpGuild) { ERRLOG1(g_Log, "CID:%10u ±æµå¿¡ ¼ÓÇÏÁö ¾ÊÀº ij¸¯ÅͰ¡ ±æµå ·¹º§À» º¯°æÇÏ·Á ÇÕ´Ï´Ù.", dwCID); wError = PktBase::SERVER_ERROR; } else { if (false == lpGuild->SetRight(dwCID, guildRight)) { wError = PktBase::SERVER_ERROR; } GAMELOG::LogGuildRightsChange(GAMELOG::sGuildLog::REQUEST, lpGuild->GetGID(), dwCID, reinterpret_cast(guildRight.m_aryRight), MAX_RIGHT_SIZE, wError); } } if (PktBase::NO_SERVER_ERR != wError) { CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher(); if (NULL != lpDispatch) { return GameClientSendPacket::SendCharGuildRight(lpDispatch->GetSendStream(), dwCID, guildRight, wError); } } return true; } // ±æµå ¸â¹ö ¸®½ºÆ® bool GameClientParsePacket::ParseCharGuildMemberList(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { PktGuildMemberList* lpPktGuildMemberList = reinterpret_cast(lpPktBase); CCharacter* lpCharacter = GameClientDispatch.GetCharacter(); CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd()); unsigned long dwCID = lpPktGuildMemberList->m_dwCID; unsigned char cMemberType = lpPktGuildMemberList->m_cMemberType; unsigned char cSortCmd = lpPktGuildMemberList->m_cSortCmd; unsigned char cPage = lpPktGuildMemberList->m_cPage; CCharacter* lpMember = CCreatureManager::GetInstance().GetCharacter(dwCID); if (NULL != lpMember) { CGuild* lpGuild = CGuildMgr::GetInstance().GetGuild(lpMember->GetGID()); if (NULL != lpGuild) { lpGuild->SendMemberList(lpMember, cMemberType, cSortCmd, cPage); } } return true; } // ±æµå ±Ý°í bool GameClientParsePacket::ParseCharGuildSafe(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { // edith 2008.07.07 ±æµå±Ý°í ¹ö±×·Î ÀÎÇØ ÀϽÃÀûÀ¸·Î ±æµå±Ý°í¸¦ Á¦ÇÑÇÔ. // return true; PktGuildSafe* lpPktGuildSafe = reinterpret_cast(lpPktBase); CCharacter* lpCharacter = GameClientDispatch.GetCharacter(); CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd()); unsigned long dwCID = lpPktGuildSafe->m_dwCID; unsigned long dwGold = lpPktGuildSafe->m_dwGold; unsigned char cCmd = lpPktGuildSafe->m_cCmd; unsigned short wError = PktBase::NO_SERVER_ERR; CCharacter* lpMember = CCreatureManager::GetInstance().GetCharacter(dwCID); if (NULL != lpMember) { unsigned long dwCharGold = lpMember->GetGold(); CGuild* lpGuild = CGuildMgr::GetInstance().GetGuild(lpMember->GetGID()); // edith 2008.03.15 ij¸¯ÀÌ DB¿¡ ÀÔÃâ±Ý °ü·Ã ÆÐŶÀ» º¸³Â´ÂÁö È®ÀÎ if (NULL == lpGuild) { wError = PktBase::SERVER_ERROR; } else if(lpMember->GetGuildSafe() != -1 || lpGuild->GetGuildSafe() != -1) { wError = PktGuildSafe::FAIL_REQUEST_DATA; } else { unsigned long dwPostChangeGold = 0; // dwCharGold : ÆÐŶÀ» º¸³½ ´ë»óÀÇ µ· // dwGold : Ŭ¶óÀÌ¾ðÆ®°¡ º¸³»¿Â ±Ý¾× lpMember->SetGuildSafe(cCmd); lpGuild->SetGuildSafe(cCmd); switch (cCmd) { // Ãâ±Ý case PktGuildSafe::SC_WITHDRAWAL: { if (lpGuild->GetTitle(lpMember->GetCID()) > lpGuild->GetRight().m_aryRight[GuildRight::USE_SAFE]) { ERRLOG2(g_Log, "CID:%10u ±æµå ±Ý°í »ç¿ë ±ÇÇÑÀÌ ¾ø´Â ±æµå¿øÀÌ ±Ý°í¿¡¼­ Ãâ±ÝÇÏ·Á ÇÕ´Ï´Ù. GID:0x%08x", lpMember->GetCID(), lpGuild->GetGID()); wError = PktBase::SERVER_ERROR; } else { // ±æµå¿¡¼­ µ·À» Ãâ±ÝÇß´Ù. if (dwCharGold > ULONG_MAX - dwGold) { //ij¸¯ÅͰ¡ ÃÖ´ë °®À»¼ö Àִµ· 4,294,967,295ÀÌ ³Ñ´ÂÁö È®ÀÎ. wError = PktBase::SERVER_ERROR; } else { // ·Î±×¿ë. (â°í¿¡¼­ µ· »©°í ³²Àº ±Ý¾× °è»ê) // ±æµå¿¡ ÀÖ´Â ±Ý¾×º¸´Ù ²¨³½±Ý¾×ÀÌ Å©¸é if (dwGold <= lpGuild->GetGold()) { dwPostChangeGold = lpGuild->GetGold() - dwGold; } else { dwPostChangeGold = 0; wError = PktBase::SERVER_ERROR; } } } break; } case PktGuildSafe::SC_DEPOSIT: { // ÀÔ±ÝÀº ±Ý°í »ç¿ë ±ÇÇÑ ¾øÀÌ °¡´É if (dwGold > dwCharGold) { wError = PktBase::SERVER_ERROR; } else { dwPostChangeGold = lpGuild->GetGold() + dwGold; } break; } case PktGuildSafe::SC_REFER: // TODO : ±Ý°í »ç¿ë ³»¿ª Á¶È¸ break; case PktGuildSafe::SC_RELEASE: { if (lpGuild->GetTitle(lpMember->GetCID()) > lpGuild->GetRight().m_aryRight[GuildRight::USE_SAFE]) { ERRLOG2(g_Log, "CID:%10u ±æµå ±Ý°í »ç¿ë ±ÇÇÑÀÌ ¾ø´Â ±æµå¿øÀÌ ±Ý°í ¹æÃâÀ» ÇÏ·Á ÇÕ´Ï´Ù. GID:0x%08x", lpMember->GetCID(), lpGuild->GetGID()); wError = PktBase::SERVER_ERROR; } // Áß°è ¼­¹ö¿¡¼­ ó¸®ÇÑ´Ù. break; } default: wError = PktBase::SERVER_ERROR; break; } GAMELOG::LogGuildStoreGoldChange(GAMELOG::sGuildLog::REQUEST, lpGuild->GetGID(), dwCID, cCmd, lpGuild->GetGold(), dwPostChangeGold, wError); if (PktBase::NO_SERVER_ERR == wError) { // Á¤»ó ó¸® GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable()); if (0 != lpDBAgentDispatch) { return GameClientSendPacket::SendCharGuildSafe(lpDBAgentDispatch->GetSendStream(), dwCID, lpGuild->GetGID(), 0, dwGold, cCmd, lpMember->GetCharacterName(), wError); } } else { // dwCharGold : ÆÐŶÀ» º¸³½ ´ë»óÀÇ µ· // dwGold : Ŭ¶óÀÌ¾ðÆ®°¡ º¸³»¿Â ±Ý¾× lpMember->SetGuildSafe(-1); lpGuild->SetGuildSafe(-1); } } // ¿¡·¯°¡ ³­ °æ¿ì CGameClientDispatch* lpDispatch = lpMember->GetDispatcher(); if (NULL != lpDispatch) { return GameClientSendPacket::SendCharGuildSafe(lpDispatch->GetSendStream(), dwCID, 0, 0, dwGold, cCmd, lpMember->GetCharacterName(), wError); } } return true; } // Àû´ë ±æµå ÇüȲ ¸®½ºÆ® bool GameClientParsePacket::ParseCharGuildHostilityList(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { PktGuildHostilityList* lpPktGuildHostilityList = reinterpret_cast(lpPktBase); CCharacter* lpCharacter = GameClientDispatch.GetCharacter(); CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd()); unsigned long dwCID = lpPktGuildHostilityList->m_dwCID; // ij¸¯ÅÍ ¾ÆÀ̵ð unsigned char cCurrentPage = lpPktGuildHostilityList->m_cCurrentPage; // ÇöÀç ÆäÀÌÁö unsigned char cPageState = lpPktGuildHostilityList->m_cPageState; // ¿äûÇÑ ÆäÀÌÁöÀÇ »óÅ CCharacter* lpMember = CCreatureManager::GetInstance().GetCharacter(dwCID); if (NULL != lpMember) { CGuild* lpGuild = CGuildMgr::GetInstance().GetGuild(lpMember->GetGID()); if (NULL != lpGuild) { lpGuild->SendHostilityList(lpMember, cCurrentPage, cPageState); } } return true; } // ±æµåÀÇ °ü°è ¸®½ºÆ® ¿äû bool GameClientParsePacket::ParseCharGuildRelationInfo(CGameClientDispatch& GameClientDispatch, PktBase* lpPktBase) { PktGuildRelationInfo* lpPktGuildRelationInfo = reinterpret_cast(lpPktBase); CCharacter* lpCharacter = GameClientDispatch.GetCharacter(); CHECK_CHARACTER_PTR(lpCharacter, GameClientDispatch, lpPktBase->GetCmd()); unsigned long dwCID = lpPktGuildRelationInfo->m_dwCID; // ¿äûÇÑ Ä³¸¯ÅÍ ¾ÆÀ̵ð unsigned long dwGID = lpPktGuildRelationInfo->m_dwGID; // ¿äûÇÑ Ä³¸¯ÅÍÀÇ ±æµå ¾ÆÀ̵ð CCharacter* lpMember = CCreatureManager::GetInstance().GetCharacter(dwCID); if (NULL != lpMember) { CGuild* lpGuild = CGuildMgr::GetInstance().GetGuild(lpMember->GetGID()); if (NULL != lpGuild) { CGuildMgr::GetInstance().SendGuildRelationInfo(dwCID, dwGID); } } return true; }