#include "stdafx.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "PacketParse.h" #include "GameClientDispatch.h" // ÇÔ¼ö ¼±¾ð bool LogFailDispatch(CGameClientDispatch& GameClientDispatch, const char* szDetailText, const unsigned char cCmd); CGameClientDispatchTable& CGameClientDispatchTable::GetInstance() { static CGameClientDispatchTable gameClientDispatchTable; return gameClientDispatchTable; } CGameClientDispatchTable::CGameClientDispatchTable() : CPacketDispatchTable(UCHAR_MAX) { using namespace GameClientParsePacket; // ±âº»ÀûÀÎ ProcessµéÀÌ µé¾î°¥ °Í. ( character°ü·Ã... ) // ij¸¯ÅÍ ¾ÆÀÌÅÛ °ü·Ã - ParseCharItem.cpp AddDispatch(CmdCharTakeItem, ParseCharTakeItem); // ¾ÆÀÌÅÛ À̵¿ ¹× ½ºÅà AddDispatch(CmdCharSwapItem, ParseCharSwapItem); // ¾ÆÀÌÅÛ ½º¿Ò AddDispatch(CmdCharRepairItem, ParseCharRepairItem); // ¾ÆÀÌÅÛ ¼ö¸® AddDispatch(CmdCharRepairAllItem, ParseCharRepairAllItem); // ¾ÆÀÌÅÛ ¼ö¸® (ÀåºñÇϰí ÀÖ´Â ¾ÆÀÌÅÛ ¸ðµÎ) AddDispatch(CmdCharUseItem, ParseCharUseItem); // ¾ÆÀÌÅÛ »ç¿ë AddDispatch(CmdCharTradeItem, ParseCharTradeItem); // ¾ÆÀÌÅÛ °Å·¡ AddDispatch(CmdCharEquipShopInfo, ParseCharEquipShopInfo); // NPC Àåºñ »óÁ¡ Á¤º¸ AddDispatch(CmdCharPickUp, ParseCharPickUp); // ¾ÆÀÌÅÛ Áý±â AddDispatch(CmdCharPullDown, ParseCharPullDown); // ¾ÆÀÌÅÛ ¶³±¸±â AddDispatch(CmdCharSplitItem, ParseCharSplitItem); // ¾ÆÀÌÅÛ ³ª´©±â AddDispatch(CmdCharTakeGold, ParseCharTakeGold); // µ· ´Ù·ç±â AddDispatch(CmdDeposit, ParseCharDepositCmd); // â°í °ü·Ã ÆÐŶµé AddDispatch(CmdCharAutoRouting, ParseCharAutoRouting); // ¿ÀÅä ·çÆÃ AddDispatch(CmdCharUseCashItem, ParseCharUseCashItem); // ij½¬¾ÆÀÌÅÛ // ij¸¯ÅÍ ¾ÆÀÌÅÛ ¾÷±×·¹ÀÌµå °ü·Ã - ParseCharUpgradeItem.cpp AddDispatch(CmdCharInstallSocket, ParseCharInstallSocket); // ¾ÆÀÌÅÛ ÀνºÅç ¼ÒÄÏ AddDispatch(CmdCharItemChemical, ParseCharItemChemical); // ¾ÆÀÌÅÛ ÇÕ¼º AddDispatch(CmdCharUpgradeItem, ParseCharUpgradeItem); // ¾ÆÀÌÅÛ ¾÷±×·¹À̵å AddDispatch(CmdCharItemOptionGraft, ParseCharItemOptionGraft); // ¾ÆÀÌÅÛ ¿É¼Ç ÀÌ½Ä AddDispatch(CmdCharItemCompensation, ParseCharItemCompensation); // ¾ÆÀÌÅÛ º¸»ó ÆÇ¸Å // ij¸¯ÅÍ ½ºÅ³ °ü·Ã - ParseCharSkill.cpp AddDispatch(CmdCharUseSkill, ParseCharUseSkill); // ½ºÅ³ »ç¿ë // AddDispatch(CmdCharSkillLock, ParseCharSkillLock); // ½ºÅ³ ¶ô // AddDispatch(CmdCharSkillUnLock, ParseCharSkillUnLock); // ½ºÅ³ ¶ô ÇØÁ¦ AddDispatch(CmdCharSkillErase, ParseCharSkillErase); // ½ºÅ³ Áö¿ì±â // ij¸¯ÅÍ ÀüÅõ °ü·Ã ÆÐŶ - ParseCharAttack.cpp AddDispatch(CmdCharAttack, ParseCharAttack); // °ø°Ý ÆÐŶ AddDispatch(CmdCharSwitchEQ, ParseCharSwitchEQ); // Àåºñ ¹Ù²Ù±â AddDispatch(CmdCharRespawn, ParseCharRespawn); // ij¸¯ÅÍ ¸®½ºÆù AddDispatch(CmdCharRespawnWaitQueue, ParseCharRespawnWaitQueue); // ¸®½ºÆù Å¥ ´ë±âÀÎ Á¤º¸ (¹èƲ±×¶ó¿îµå¿ë) AddDispatch(CmdCharRespawnInfo, ParseCharRespawnInfo); // ¸®½ºÆù Á¤º¸ (¸®½ºÆù À§Ä¡µé) AddDispatch(CmdCharRespawnAreaInfo, ParseCharRespawnAreaInfo); // ¸®½ºÆù Áö¿ª ¼¼ºÎ Á¤º¸ // AddDispatch(CmdCharMoveUpdate, ParseCharMoveUpdate); // ij¸¯ÅÍ ¿òÁ÷ÀÓ ¾÷µ¥ÀÌÆ® AddDispatch(CmdCharDuelCmd, ParseCharDuelCmd); // µà¾ó ÆÐŶ ¸í·É AddDispatch(CmdCharPeaceMode, ParseCharPeaceMode); // ¹ÝÀü ¸ðµå AddDispatch(CmdCharSummonCmd, ParseCharSummonCmd); // ¼Òȯ¼ö ¸í·É // ¿ø·¡´Â UDP p2pÆÐŶÀÌÁö¸¸ ¼­¹ö·Î ¿Ã¸² AddDispatch(CmdCharMove, ParseCharMoveEx); // ij¸¯ÅÍ ·¹º§¾÷ °ü·Ã ÆÐŶ - ParseCharLevelUp.cpp AddDispatch(CmdCharClassUpgrade, ParseCharClassUpgrade); // Ŭ·¡½º ¾÷±×·¹À̵å AddDispatch(CmdCharIncreasePoint, ParseCharIncreasePoint); // IP Áõ°¡ ÆÐŶ AddDispatch(CmdCharStateRedistribution, ParseCharStateRedistribution); // IP Áõ°¡ ÆÐŶ AddDispatch(CmdCharStatusRetrain, ParseCharStatusRetrain); // ij¸¯ÅÍ ½ºÅ×ÀÌÅͽº ÀçÈÆ·Ã // ij¸¯ÅÍ Ä¿¹Â´ÏƼ °ü·Ã ÆÐŶ - ParseCharCommunity.cpp AddDispatch(CmdCharExchangeCmd, ParseCharExchangeCmd); // ±³È¯ ÆÐŶ ¸í·É AddDispatch(CmdCharPartyCmd, ParseCharPartyCmd); // ÆÄƼ ÆÐŶ ¸í·É AddDispatch(CmdCharPartyFind, ParseCharPartyFind); // ÆÄƼ ã±â AddDispatch(CmdCharStallOpen, ParseCharStallOpen); // ijƽÅÍ ³ëÁ¡»ó °³¼³ AddDispatch(CmdCharStallRegisterItem, ParseCharStallRegisterItem); // ijƽÅÍ ³ëÁ¡»ó ¾ÆÀÌÅÛ µî·Ï AddDispatch(CmdCharStallEnter, ParseCharStallEnter); // ijƽÅÍ ³ëÁ¡»ó ÀÔÀå AddDispatch(CmdFriendAddRequest, ParseCharFriendAdd); // Ä£±¸ Ãß°¡ AddDispatch(CmdFriendRemoveRequest, ParseCharFriendRemove); // Ä£±¸ »èÁ¦ AddDispatch(CmdFriendEtcRequest, ParseCharFriendEtc); // ±âŸ AddDispatch(CmdCreateGuild, ParseCharCreateGuild); // ±æµå »ý¼º AddDispatch(CmdGuildCmd, ParseCharGuildCmd); // ±æµå ¸â¹ö °ü·Ã ¸í·É AddDispatch(CmdGuildMark, ParseCharGuildMark); // ±æµå ¸¶Å© º¯°æ AddDispatch(CmdGuildLevel, ParseCharGuildLevel); // ±æµå ·¹º§ º¯°æ AddDispatch(CmdGuildRelation, ParseCharGuildRelation); // ±æµå °ü°è º¯°æ AddDispatch(CmdGuildInclination, ParseCharGuildInclination); // ±æµå ¼ºÇâ º¯°æ AddDispatch(CmdGuildList, ParseCharGuildList); // ±æµå ¸®½ºÆ® AddDispatch(CmdGuildRight, ParseCharGuildRight); // ±æµå ±ÇÇÑ ¼³Á¤ AddDispatch(CmdGuildMemberList, ParseCharGuildMemberList); // ±æµå ¸â¹ö ¸®½ºÆ® AddDispatch(CmdGuildSafe, ParseCharGuildSafe); // ±æµå ±Ý°í AddDispatch(CmdGuildHostilityList, ParseCharGuildHostilityList); // Àû´ë ±æµå ÇöȲ ¸®½ºÆ® AddDispatch(CmdGuildRelationInfo, ParseCharGuildRelationInfo); // ±æµåÀÇ °ü°è ¸®½ºÆ® ¿äû // ¾îµå¹Î °ü·Ã ÆÐŶ - ParseCharAdmin.cpp AddDispatch(CmdCharAdminCmd, ParseCharAdminCmd); // ¾îµå¹Î Ä¿¸Çµå AddDispatch(CmdCharNameChange, ParseCharNameChange); // ij¸¯ÅÍ À̸§ º¯°æ // ij¸¯ÅÍ Äù½ºÆ® °ü·Ã ÆÐŶ - ParseCharQuest.cpp AddDispatch(CmdCharStartQuest, ParseCharStartQuest); // Äù½ºÆ® ½ÃÀÛ AddDispatch(CmdCharOperateTrigger, ParseCharOperateTrigger); // Æ®¸®°Å ¹ßµ¿ AddDispatch(CmdCharCancelQuest, ParseCharCancelQuest); // Äù½ºÆ® Ãë¼Ò // ij¸¯ÅÍ ±âŸ ÆÐŶ - ParseCharEtc.cpp AddDispatch(CmdCharSuicide, ParseCharSuicide); // ij¸¯ÅÍ ÀÚ»ì AddDispatch(CmdCharBindPosition, ParseCharBindPosition); // ij¸¯ÅÍ ¹ÙÀÎµå Æ÷Áö¼Ç AddDispatch(CmdCharQuickSlotMove, ParseCharQuickSlotMove); // ij¸¯ÅÍ Äü ½½·Ô À̵¿ AddDispatch(CmdCharControlOption, ParseCharControlOption); // ij¸¯ÅÍ ¿É¼Ç Á¶Á¤ AddDispatch(CmdCharAuthorizePanel, ParseCharAuthorizePanel); AddDispatch(CmdCharFameInfo, ParseCharFameInfo); // ij¸¯ÅÍ ¸í¼º(°øÇåµµ) Á¤º¸ ¿äû AddDispatch(CmdRankingInfo, ParseCharRankingInfo); // ·©Å· Á¤º¸ // ¹èƲ ±×¶ó¿îµå ¼­¹ö±º ÆÐŶ - ParseCharBGServer.cpp AddDispatch(CmdBGServerMapList, ParseCharBGServerMapList); // ¹èƲ ±×¶ó¿îµå ¼­¹ö±º ¸Ê(¹æ) Á¤º¸ ¸®½ºÆ® AddDispatch(CmdBGServerResultList, ParseCharBGServerResultList); // ¹èƲ ±×¶ó¿îµå ¼­¹ö±º ¸Ê(¹æ) °á°ú ¸®½ºÆ® AddDispatch(CmdBGServerMoveZone, ParseCharBGServerMoveZone); // ¹èƲ ±×¶ó¿îµå ¼­¹ö±º Á¸ À̵¿ (¸Ê(¹æ) À̵¿) AddDispatch(CmdBGServerMileageChange, ParseCharBGServerMileageChange); // ¹èƲ ±×¶ó¿îµå ¼­¹ö±º ȯÀü¼Ò ¸í·É AddDispatch(CmdBGServerCharSlot, ParseCharBGServerCharSlot); // ¹èƲ ±×¶ó¿îµå ¼­¹ö Á¤¼· ij¸¯ÅÍ Á¤º¸ ¿äû // °ø¼º ÆÐŶ - ParseCharCastle.cpp AddDispatch(CmdCastleCmd, ParseCharCastleCmd); // ¼º °ü·Ã ¿ÀºêÁ§Æ® ¸í·É AddDispatch(CmdCampCmd, ParseCharCampCmd); // ±æµå ¿ä»õ ¸í·É AddDispatch(CmdSiegeArmsCmd, ParseCharSiegeArmsCmd); // °ø¼º º´±â ¸í·É AddDispatch(CmdCastleRight, ParseCharCastleRight); // ¼º ±ÇÇÑ ¼³Á¤ AddDispatch(CmdCampRight, ParseCharCampRight); // ±æµå ¿ä»õ ±ÇÇÑ ¼³Á¤ // äÆÃ ÆÐŶ - ParseCharChat.cpp AddDispatch(CmdCharWhisper, ParseCharWhisper); // ¼Ó»èÀÓ AddDispatch(CmdCharChat, ParseCharChat); // ijƽÅÍ Ã¤ÆÃ AddDispatch(CmdCharCastObjectInfo, ParseCastObjectInfo); // ¿ÀºêÁ§Æ® ´øÁö±â ÆÐŶ Á¤º¸ AddDispatch(CmdCharInstallRuneSocket, ParseCharInstallRuneSocket); // ·é¼³Ä¡, »èÁ¦ °ü·Ã Á¤º¸. AddDispatch(CmdTakeMaterial, ParseCharTakeMaterial); // ±æµå ¿ä»õ ÀÚÀç ³Ö±â/»©±â AddDispatch(CmdTakeCastleJewel, ParseCharTakeCastleJewel); // ¼º »ó¡¹° º¸¼® ¾ÆÀÌÅÛ ³Ö±â/»©±â AddDispatch(CmdWarOnOff, ParseWarOnOff); // ±æµåÀü, ±¹°¡Àü Ç÷¡±× ¹Ù²Ù±â AddDispatch(CmdKeyInfo, ParseKeyInfo); // Á¶À̽ºÆ½ Ű Á¤º¸ °ü·Ã. } CGameClientDispatch::CGameClientDispatch(CSession& Session, CGameClientDispatchTable& GameClientDispatchTable) : CRylServerDispatch(Session, MAX_PACKET_DISPATCH_PER_PULSE), m_lpCharacter(0), m_dwUID(0), m_GameClientDispatchTable(GameClientDispatchTable), m_dwMoveServerID(0) { // edith 2009.08.11 °ÔÀÓ°¡µå 2.5 ¾÷±×·¹À̵å // m_CSAuth.Init(); m_CSAuth2.Init(); DETLOG2(g_Log, "DP:0x%p/UID:%u/GameClientDispatch Created", this, m_dwUID); } CGameClientDispatch::~CGameClientDispatch() { CGameClientDispatch::Disconnected(); // °´Ã¼ ¼Ò¸ê ·Î±× DETLOG2(g_Log, "DP:0x%p/UID:%u/GameClientDispatch Destroy", this, m_dwUID); } void CGameClientDispatch::Connected() { } void CGameClientDispatch::Disconnected() { if (0 != m_lpCharacter) { m_lpCharacter->SetDispatcher(0); } } void CGameClientDispatch::Disconnect() { CloseSession(); } bool CGameClientDispatch::DispatchPacket(PktBase* lpPktBase) { unsigned char cCmd = lpPktBase->GetCmd(); bool bHackCheck = true; // ¸¶Áö¸·À¸·Î ¹ÞÀº ÆÐŶ ½Ã°£ ¾÷µ¥ÀÌÆ®. m_CheckPing.SetLastPingRecvTime(CPulse::GetInstance().GetLastTick()); switch (cCmd) { case CmdSysPing: bHackCheck = m_CheckSpeedHack.CheckTimeUpdate(static_cast(lpPktBase)->m_dwTickTime); return true; case CmdCharAttack: bHackCheck = m_CheckSpeedHack.CheckAttackReplay(static_cast(lpPktBase)); break; } if (!bHackCheck) { ERRLOG3(g_Log, "DP:0x%p/IP:%s/UID:%10d/½ºÇǵåÇ٠üũ¿¡ °É·È½À´Ï´Ù. Á¢¼ÓÀ» ²÷½À´Ï´Ù.", this, GetRemoteAddr().get_addr_string(), m_dwUID); } else if (CXORCrypt::PAGE_VERSION != CXORCrypt::GetInstance().GetPageVer(lpPktBase->GetCodePage())) { // (Ŭ¶óÀÌ¾ðÆ® -> °ÔÀÓ ¼­¹ö)°£ Åë½ÅÀº ÇÑ °¡Áö ÄÚµå ÆäÀÌÁö¸¸(ÇöÀç´Â 1¹ø)À» »ç¿ëÇÕ´Ï´Ù. ERRLOG3(g_Log, "DP:0x%p/IP:%s/UID:%d À߸øµÈ ÄÚµå ÆäÀÌÁöÀÇ ÆÐŶÀÔ´Ï´Ù. Á¢¼ÓÀ» ²÷½À´Ï´Ù.", this, GetRemoteAddr().get_addr_string(), m_dwUID); } else { CGameClientDispatch::FnProcess fnProcess = m_GameClientDispatchTable.GetDispatch(cCmd); const char* szErrorString = 0; if (0 == fnProcess) { szErrorString = "Unknown Gameserver Packet"; } else if (!fnProcess(*this, lpPktBase)) { szErrorString = "GameServer packet process failed."; } if (0 != szErrorString) { LogFailDispatch(*this, szErrorString, cCmd); } return true; } return false; } bool CGameClientDispatch::Dispatch() { unsigned long dwCurrentTime = timeGetTime(); // ÇΠüũ if (0 != m_lpCharacter && // ij¸¯ÅͰ¡ ÀÖ¾î¾ß Çϰí 0 == m_lpCharacter->GetAdminLevel() && // ¿î¿µÀÚ°¡ ¾Æ´Ï°í !m_CheckPing.CheckPing(dwCurrentTime)) // Pingüũ¿¡ ½ÇÆÐÇϸé { const int MAX_BUFFER = 256; char szBuffer[MAX_BUFFER]; unsigned long dwPingCount = 0; unsigned long dwLastPingRecvTime = 0; unsigned long dwFirstCheckTime = 0; unsigned long dwCID = m_lpCharacter->GetCID(); const char* szCharacterName = m_lpCharacter->GetCharacterName(); m_CheckPing.GetPingData(dwPingCount, dwLastPingRecvTime, dwFirstCheckTime); _snprintf(szBuffer, MAX_BUFFER - 1, "UID:%u/CID:%u/Name:%s/CurrentTime:%u/LastPingTime:%u/PingCount:%u/FirstCheckTime:%u/" "PingCheck failed. disconnect now.", m_dwUID, dwCID, szCharacterName, dwCurrentTime, dwLastPingRecvTime, dwPingCount, dwFirstCheckTime); LogErrorPacket(szBuffer, 0); return false; } return CRylServerDispatch::Dispatch(); } void CGameClientDispatch::ProcessTooManyPacket(CBufferQueue& bufferQueue) { if (0 != m_lpCharacter) { typedef std::map, boost::fast_pool_allocator< std::pair > > PacketStatistics; const int MAX_BUFFER = 512; char szBuffer[MAX_BUFFER]; PacketStatistics packetStatistics; const SOCKADDR_IN& sockAddr = GetRemoteAddr().get_addr_in(); int nLength = _snprintf(szBuffer, MAX_BUFFER, "/UID:%d/CID:0x%08x/Name:%s/IP:%15s/ProcessPkt:%4d/RemainPkt:%4d/", m_lpCharacter->GetUID(), m_lpCharacter->GetCID(), m_lpCharacter->GetCharacterName(), inet_ntoa(sockAddr.sin_addr), m_dwMaxProcessPacketPerPulse, bufferQueue.getBufferNum()); CBufferQueue tempQueue; tempQueue.splice(bufferQueue); const int DROP_PACKET_LIMIT = 20; const int DROP_PACKET_MAX_LIMIT = 40; bool bDropPacket = DROP_PACKET_MAX_LIMIT < tempQueue.getBufferNum(); // ÆÐŶ Åë°è¸¦ ±¸ÇÑ´Ù. CBuffer* lpBuffer = tempQueue.getHead(); for(; 0 != lpBuffer; lpBuffer = lpBuffer->next()) { unsigned char cCmd = reinterpret_cast(lpBuffer->rd_ptr())->GetCmd(); ++packetStatistics[cCmd]; } const unsigned long dwMaxPrint = 5; unsigned long dwPrinted = 0; PktBase::CMDType aryDropCmd[dwMaxPrint]; PktBase::CMDType* lpDropCmdEnd = aryDropCmd; std::pair resultPair; for(PacketStatistics::iterator itr = packetStatistics.begin(); itr != packetStatistics.end() && dwPrinted < dwMaxPrint; ++itr, ++dwPrinted) { resultPair = *itr; nLength += _snprintf(szBuffer + nLength, MAX_BUFFER - nLength, "0x%02x:%5d/", resultPair.first, resultPair.second); // ÆÐŶÀÌ Çѹø¿¡ ¾ó¸¶ ÀÌ»ó ¿Â °æ¿ì´Â DropÇÒ ¸®½ºÆ®¿¡ Æ÷ÇÔ½ÃŲ´Ù. // ¿©±â¼­´Â Top 5¿¡ ¼ÓÇÏ´Â ÆÐŶ Áß DROP_PACKET_LIMIT ÀÌ»ó µÇ´Â ÆÐŶ¸¸ ¹ö¸°´Ù. if(DROP_PACKET_LIMIT < resultPair.second) { *lpDropCmdEnd = resultPair.first; ++lpDropCmdEnd; } } std::sort(aryDropCmd, lpDropCmdEnd); ERRLOG0(g_Log, szBuffer); for(;;) { lpBuffer = tempQueue.dequeue(); if(0 == lpBuffer) { break; } else { unsigned char cCmd = reinterpret_cast(lpBuffer->rd_ptr())->GetCmd(); // ¹ö·Áµµ µÉ ÆÐŶÀÌ¸é ¹ö¸°´Ù. if(bDropPacket && std::binary_search(aryDropCmd, lpDropCmdEnd, cCmd)) { SAFE_RELEASE_BUFFER(lpBuffer); } else { bufferQueue.enqueue(lpBuffer); } } } } } bool LogFailDispatch(CGameClientDispatch& GameClientDispatch, const char* szDetailText, const unsigned char cCmd) { unsigned long dwUID = GameClientDispatch.GetUID(); ERRLOG5(g_Log, "DP:0x%p/UID:%d/PacketCMD:0x%02x/IP:%15s/%s", &GameClientDispatch, dwUID, cCmd, GameClientDispatch.GetRemoteAddr().get_addr_string(), szDetailText); return false; } unsigned long CGameClientDispatch::PopRequestKey() { unsigned long dwRequestKey = 0; if (!m_DBRequestQueue.empty()) { dwRequestKey = m_DBRequestQueue.front(); m_DBRequestQueue.pop_front(); } unsigned long dwUID = 0; unsigned long dwCID = 0; if (0 != m_lpCharacter) { dwUID = m_lpCharacter->GetUID(); dwCID = m_lpCharacter->GetCID(); } DETLOG7(g_Log, "UID:%u/CID:0x%p(0x%p)/IP:%15s/DP:0x%p/DUID:%u/RequestKey:%d/ " "Pop RequestKey", dwUID, dwCID, m_lpCharacter, GetRemoteAddr().get_addr_string(), this, m_dwUID, dwRequestKey); return dwRequestKey; } void CGameClientDispatch::PushRequestKey(unsigned long dwRequestKey) { unsigned long dwUID = 0; unsigned long dwCID = 0; if (0 != m_lpCharacter) { dwUID = m_lpCharacter->GetUID(); dwCID = m_lpCharacter->GetCID(); } DETLOG7(g_Log, "UID:%u/CID:0x%p(0x%p)/IP:%15s/DP:0x%p/DUID:%u/RequestKey:%d/ " "Push RequestKey", dwUID, dwCID, m_lpCharacter, GetRemoteAddr().get_addr_string(), this, m_dwUID, dwRequestKey); m_DBRequestQueue.push_back(dwRequestKey); } bool CGameClientDispatch::GetAuthQuery(GG_AUTH_DATA** lppAuthData_Out) { unsigned long dwGGErrCode = m_CSAuth2.GetAuthQuery(); if (dwGGErrCode != ERROR_SUCCESS) { PrintGameGuardError(dwGGErrCode); ERRLOG1(g_Log, "CID:0x%08x ÀÎÁõ ÄÚµå(2) GetAuthQuery ¿À·ù", m_lpCharacter->GetCID()); return false; } *lppAuthData_Out = &m_CSAuth2.m_AuthQuery; return true; } bool CGameClientDispatch::CheckAuthAnswer(void) { unsigned long dwGGErrCode = m_CSAuth2.CheckAuthAnswer(); if (dwGGErrCode != ERROR_SUCCESS) { PrintGameGuardError(dwGGErrCode); ERRLOG1(g_Log, "CID:0x%08x ÀÎÁõ ÄÚµå(2) CheckAuthAnswer ¿À·ù", m_lpCharacter->GetCID()); return false; } return true; } void CGameClientDispatch::PrintGameGuardError(void) { /* switch (m_CSAuth.PPGetLastError()) { case 1: ERRLOG1(g_Log, "CID:0x%08x ۰¡ ÀÏÄ¡ÇÏÁö ¾Ê½À´Ï´Ù. " "¾ÏȣȭµÇÁö ¾ÊÀº ÆÐŶÀ̰ųª, UserKey°¡ ´Ù¸¥ Ŭ¶óÀÌ¾ðÆ®·ÎºÎÅÍ ¿Â ÆÐŶÀÏ ¼ö ÀÖ½À´Ï´Ù.", m_lpCharacter->GetCID()); break; case 2: ERRLOG1(g_Log, "CID:0x%08x ½ÃÄö½º³Ñ¹ö°¡ ÃÖ±ÙÀÇ ÆÐŶ°ú °°½À´Ï´Ù. " "ÆÐŶ ¸®ÇöóÀÌ °ø°ÝÀÌ ¿øÀÎÀÏ ¼ö ÀÖ½À´Ï´Ù.", m_lpCharacter->GetCID()); break; case 3: ERRLOG1(g_Log, "CID:0x%08x ½ÃÄö½º³Ñ¹ö°¡ ºñÁ¤»óÀÔ´Ï´Ù. ¼­¹ö¿Í Ŭ¶óÀ̾ðÆ®ÀÇ ¾à¼ÓµÈ ½ÃÄö½º³Ñ¹ö°¡ ÀÏÄ¡ÇÏÁö ¾Ê½À´Ï´Ù. " "³×Æ®¿÷ ¹®Á¦·Î ÆÐŶ ¸î °³°¡ À¯½Ç µÇ¾úÀ» ¼ö ÀÖ½À´Ï´Ù. TCP ÇÁ·ÎÅäÄÝ¿¡¼­´Â °ÅÀÇ ¹ß»ýÇÏÁö ¾Ê´Â ¿¡·¯ÀÔ´Ï´Ù.", m_lpCharacter->GetCID()); break; case 4: ERRLOG1(g_Log, "CID:0x%08x ÆÐŶ CRC üũ¿¡ ½ÇÆÐÇß½À´Ï´Ù. " "ÆÐŶ ¿¡µðÅÍ µîÀ¸·Î °íÀÇ·Î ÆÐŶÀ» Á¶ÀÛÇßÀ» ¼ö ÀÖ½À´Ï´Ù.", m_lpCharacter->GetCID()); break; } */ // edith 2009.08.11 °ÔÀÓ°¡µå 2.5 ¾÷±×·¹À̵å ERRLOG1(g_Log, "CID:0x%08x Á¦°ÅµÈ °ÔÀÓ°¡µå ¹öÁ¯À» »ç¿ëÇÏ¿´½À´Ï´Ù.", m_lpCharacter->GetCID()); } void CGameClientDispatch::PrintGameGuardError(unsigned long dwGGErrCode) { const char* szErrorString = "¾Ë ¼ö ¾ø´Â ¿¡·¯ÀÔ´Ï´Ù"; switch (dwGGErrCode) { case ERROR_GGAUTH_FAIL_MEM_ALLOC: szErrorString = "¸Þ¸ð¸® ÇÒ´ç ½ÇÆÐ"; break; case ERROR_GGAUTH_FAIL_LOAD_DLL: szErrorString = "ggauth.dll ·Îµå ½ÇÆÐ"; break; case ERROR_GGAUTH_FAIL_GET_PROC: szErrorString = "ggauth.dllÀÇ Export ÇÔ¼ö °¡Á®¿À±â ½ÇÆÐ"; break; case ERROR_GGAUTH_FAIL_BEFORE_INIT: szErrorString = "ggauth.dllÀÌ ÃʱâÈ­µÇ±â Àü¿¡ Export ÇÔ¼ö È£ÃâÇÏ¿´À½"; break; case ERROR_GGAUTH_INVALID_PARAM: szErrorString = "ÇÔ¼ö È£Ã⠽à invalid parameter Àü´Þ"; break; case ERROR_GGAUTH_NO_REPLY: szErrorString = "ÀÎÁõ Query¿¡ ´ëÇÑ Å¬¶óÀ̾ðÆ®ÀÇ ÀÀ´ä ¾øÀ½"; break; case ERROR_GGAUTH_INVALID_PROTOCOL_VERSION: szErrorString = "Ŭ¶óÀ̾ðÆ®ÀÇ ÀÎÁõ ÇÁ·ÎÅäÄÝ ¹öÀü Ʋ¸²"; break; case ERROR_GGAUTH_INVALID_REPLY: szErrorString = "ÀÎÁõ Query¿¡ ´ëÇÑ Å¬¶óÀ̾ðÆ®ÀÇ ÀÀ´ä°ªÀÌ Æ²¸²"; break; } DWORD dwCID = (0 != m_lpCharacter) ? m_lpCharacter->GetCID() : 0; const int MAX_LOG = 256; char szLog[MAX_LOG]; if (0 < _snprintf(szLog, MAX_LOG - 1, "CID:0x%08x %s : %d / " "AQ.Index:0x%08x, AQ.V1:0x%08x, AQ.V2:0x%08x, AQ.V3:0x%08x, " "AA.Index:0x%08x, AA.V1:0x%08x, AA.V2:0x%08x, AA.V3:0x%08x", dwCID, szErrorString, dwGGErrCode, m_CSAuth2.m_AuthQuery.dwIndex, m_CSAuth2.m_AuthQuery.dwValue1, m_CSAuth2.m_AuthQuery.dwValue2, m_CSAuth2.m_AuthQuery.dwValue3, m_CSAuth2.m_AuthAnswer.dwIndex, m_CSAuth2.m_AuthAnswer.dwValue1, m_CSAuth2.m_AuthAnswer.dwValue2, m_CSAuth2.m_AuthAnswer.dwValue3)) { ERRLOG0(g_Log, szLog); } } void CGameClientDispatch::SetCharacter(CCharacter* lpCharacter) { m_lpCharacter = lpCharacter; m_CheckSpeedHack.SetCharacter(lpCharacter); }