#include "stdafx.h" #include "ParseCharUpdate.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 namespace DBAgent { namespace ParseCharUpdate { // ij¸¯ÅÍ ·Î±×ÀÎ bool CharLogin(CSendStream& SendStream, unsigned long dwServerID, PktDBUpdate* lpPktDBUpdate); // ij¸¯ÅÍ ·Î±×¾Æ¿ô bool CharLogout(CSendStream& SendStream, unsigned long dwServerID, Item::CItemSerialMgr& itemSerialMgr, PktDBUpdate* lpPktDBUpdate); // ij¸¯ÅÍ Á¸À̵¿ bool CharMoveZone(CSendStream& SendStream, unsigned long dwServerID, Item::CItemSerialMgr& itemSerialMgr, PktDBUpdate* lpPktDBUpdate); // ij¸¯ÅÍ ¾÷µ¥ÀÌÆ® bool CharUpdate(CSendStream& SendStream, unsigned long dwServerID, Item::CItemSerialMgr& itemSerialMgr, PktDBUpdate* lpPktDBUpdate); bool Parse(CSendStream& SendStream, unsigned long dwServerID, Item::CItemSerialMgr& itemSerialMgr, PktDBUpdate* lpPktDBUpdate) { bool bResult = false; switch(lpPktDBUpdate->m_TypeCode) { case DBUpdateData::LOGIN: // ij¸¯ÅÍ ·Î±×ÀÎ bResult = CharLogin(SendStream, dwServerID, lpPktDBUpdate); break; case DBUpdateData::LOGOUT: // ij¸¯ÅÍ ·Î±×¾Æ¿ô case DBUpdateData::ABNORMAL_LOGOUT: // ij¸¯ÅÍ ºñÁ¤»ó ·Î±×¾Æ¿ô(µ¥ÀÌÅÍ ¾÷µ¥ÀÌÆ® ¾øÀ½) bResult = CharLogout(SendStream, dwServerID, itemSerialMgr, lpPktDBUpdate); break; case DBUpdateData::ZONEMOVE: // ij¸¯ÅÍ Á¸À̵¿ bResult = CharMoveZone(SendStream, dwServerID, itemSerialMgr, lpPktDBUpdate); break; case DBUpdateData::UPDATE: // ij¸¯ÅÍ ¾÷µ¥ÀÌÆ® bResult = CharUpdate(SendStream, dwServerID, itemSerialMgr, lpPktDBUpdate); break; default: ERRLOG1(g_Log, "ParseCharUpdate ½ÇÆÐ : ¾Ë ¼ö ¾ø´Â ¸í·É 0x%04X ¸¦ ¹Þ¾Ò½À´Ï´Ù.", lpPktDBUpdate->m_TypeCode); bResult = true; break; } return bResult; } // ij¸¯ÅÍ ·Î±×ÀÎ bool CharLogin(CSendStream& SendStream, unsigned long dwServerID, PktDBUpdate* lpPktDBUpdate) { // À¯Àú°¡ ·Î±×ÀÎÀ» ½ÃµµÇß´Ù. // DBAgent´Â ÇØ´ç ÆÐŶÀ» ¹Þ¾Ò´Ù. UID¼­¹ö·Î ÀÎÁõÀ» À§ÇØ ÆÐŶÀ» Àü´ÞÇÑ´Ù. unsigned long dwRequestKey = lpPktDBUpdate->m_dwRequestKey; unsigned long dwSessionID = lpPktDBUpdate->m_dwSessionID; unsigned long dwUID = lpPktDBUpdate->m_dwUserID; unsigned long dwCID = lpPktDBUpdate->m_dwCharID; #ifdef ENABLE_PACKET_LOG DETLOG4(g_PacketLog, "ParseCharUpdate::CharLogin : UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / ", dwUID, dwCID, dwSessionID, dwServerID); #endif IN_ADDR peerAddress = lpPktDBUpdate->m_Address; unsigned short usCharLoginError = 0; using namespace DataStorage; CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession(dwUID); if(0 == lpSessionData) { // ¼¼¼ÇÀÌ ¾øÀ» °æ¿ì¿¡´Â ·Î±×ÀÎ ºÒ°¡. À¯Àú ·Î±×Àνà ¼¼¼Ç »ý¼º Çϴµ¥ ¿Ö ¾ø¾î! // À¯Àú ·Î±×¾Æ¿ô½Ã¿¡ ¼¼¼Ç ¾ø¾Ö´Â °Íµµ ¾Æ´Ï±¸! ERRLOG5(g_Log, "UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / SessionData:0x%p / " "ij¸¯ÅÍ ·Î±×ÀÎ ½ÇÆÐ : ¼¼¼ÇÀ̳ª ij¸¯ÅÍ µ¥ÀÌÅͰ¡ ¾ø½À´Ï´Ù.", dwUID, dwCID, dwSessionID, dwServerID, lpSessionData); usCharLoginError = 1; } else if(lpSessionData->GetSessionID() != dwSessionID) { // ¼¼¼Ç ID°¡ ´Ù¸¨´Ï´Ù. ERRLOG5(g_Log, "UID:%10u / CID:%10u / RealSessionID:%10u / ReceivedSessionID:%10u / ServerID:0x%08X / " "ij¸¯ÅÍ ·Î±×ÀÎ ½ÇÆÐ : ¼¼¼Ç ID°¡ ´Ù¸¨´Ï´Ù", dwUID, dwCID, lpSessionData->GetSessionID(), dwSessionID, dwServerID); usCharLoginError = 1; } else if(CSessionData::SE_USER_ENABLED == lpSessionData->GetSessionState() || CSessionData::SE_CHAR_ENABLED == lpSessionData->GetSessionState()) { // Ȱ¼ºÈ­µÈ ij¸¯ÅÍ·Î ·Î±×ÀÎÀ» ½ÃµµÇß½À´Ï´Ù. ERRLOG5(g_Log, "UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / ST:%s" "ij¸¯ÅÍ ·Î±×ÀÎ ½ÇÆÐ : Ȱ¼ºÈ­µÈ ¼¼¼ÇÀ¸·Î ·Î±×ÀÎÀ» ½ÃµµÇÏ¿´½À´Ï´Ù", dwUID, dwCID, dwSessionID, dwServerID, g_szSessionStateString[lpSessionData->GetSessionState()]); usCharLoginError = 1; } else if(!lpSessionData->HasCharacter(dwCID)) { // ³»°¡ °®°íÀִ ij¸¯ÅͰ¡ ¾Æ´Õ´Ï´Ù. const USER_INFO& userInfo = lpSessionData->GetUserInfo(); // WORK_LIST 2.1 °èÁ¤ ±¹Àû Ãß°¡ ERRLOG10(g_Log, "UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / " "Char1:%10u / Char2:%10u / Char3:%10u / Char4:%10u / Char5:%10u / Nation:%d /" "ij¸¯ÅÍ ·Î±×ÀÎ ½ÇÆÐ : ¼ÒÀ¯ÇÏÁö ¾ÊÀº ij¸¯ÅÍ·Î ·Î±×ÀÎÀ» ½ÃµµÇÏ¿´½À´Ï´Ù", dwUID, dwCID, dwSessionID, dwServerID, userInfo.CharID[0], userInfo.CharID[1], userInfo.CharID[2], userInfo.CharID[3], userInfo.CharID[4], userInfo.Nation); usCharLoginError = 5; } else { // edith 2008.01.15 UI¿¡ Login °ü·ÃÆÐŶÀº UpdateUIDTable ·Î ÀÌ·ç¾îÁ®ÀÖ´Ù .¿©±â¿¡ Pass Ãß°¡µÊ. // edith 2008.01.15 UID¼­¹ö·Î ij¸¯Å͸¦ ·Î±×ÀνÃÄѵµ µÇ´ÂÁö¸¦ ¹°¾îº»´Ù. lpSessionData->PushRequest( RequestData(dwRequestKey, dwCID, dwServerID, dwSessionID, peerAddress, lpSessionData->GetAccountName(), NULL)); if(!SendPacket::UpdateUIDTable(PktUUT::UpdateUIDTableCharLogin, lpSessionData->GetAccountName(), NULL, dwUID, dwCID, dwSessionID, dwServerID, peerAddress)) { ERRLOG4(g_Log, "UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / " "ij¸¯ÅÍ ·Î±×ÀÎ ½ÇÆÐ : UID¼­¹ö·Î UpdateUIDTableCharLogin Àü¼Û ½ÇÆÐ", dwUID, dwCID, dwSessionID, dwServerID); lpSessionData->PopRequest(); usCharLoginError = 1; } else { INFLOG4(g_Log, "UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / " "ij¸¯ÅÍ ·Î±×ÀÎ ½Ãµµ : UID¼­¹ö·Î UpdateUIDTableCharLogin Àü¼Û ¼º°ø", dwUID, dwCID, dwSessionID, dwServerID); } } if(0 != usCharLoginError) { SendPacket::CharLoginError(SendStream, dwRequestKey, DBUpdateData::LOGIN, dwUID, dwCID, usCharLoginError); } return true; } // ij¸¯ÅÍ ·Î±×¾Æ¿ô bool CharLogout(CSendStream& SendStream, unsigned long dwServerID, Item::CItemSerialMgr& itemSerialMgr, PktDBUpdate* lpPktDBUpdate) { unsigned __int64 dwItemSerial = lpPktDBUpdate->m_dlItemSerial; unsigned long dwSessionID = lpPktDBUpdate->m_dwSessionID; unsigned long dwUID = lpPktDBUpdate->m_dwUserID; unsigned long dwCID = lpPktDBUpdate->m_dwCharID; unsigned char cAdminFlag = lpPktDBUpdate->m_cAdminFlag; #ifdef ENABLE_PACKET_LOG DETLOG4(g_PacketLog, "ParseCharUpdate::CharLogout : UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / ", dwUID, dwCID, dwSessionID, dwServerID); #endif using namespace DataStorage; CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession(dwUID); CCharacterData* lpCharacterData = 0; if(0 == lpSessionData || 0 == (lpCharacterData = lpSessionData->GetCharacterData())) { // ¼­¹ö ¼¼¼Ç ¾ò±â ½ÇÆÐ ERRLOG6(g_Log, "UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / SessionData:0x%p / CharacterData:0x%p /" "ij¸¯ÅÍ ·Î±×¾Æ¿ô ½ÇÆÐ : ¼¼¼ÇÀ̳ª ij¸¯ÅÍ µ¥ÀÌÅͰ¡ ¾ø½À´Ï´Ù.", dwUID, dwCID, dwSessionID, dwServerID, lpSessionData, lpCharacterData); } else if(!lpSessionData->GetRealmPointCheck()) { } else if(lpSessionData->GetSessionID() != dwSessionID || lpSessionData->GetServerID() != dwServerID || dwCID != lpSessionData->GetCID() || dwCID != lpCharacterData->GetCID()) { // ¼¼¼ÇID / ¼­¹ö ID / CID´Ù¸§ ERRLOG8(g_Log, "UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / " "SessionDataCID:%10u / CharacterDataCID:%10u / " "SessionDataSessionID:%10u / SessionDataServerID:0x%08X / " "ij¸¯ÅÍ ·Î±×¾Æ¿ô ½ÇÆÐ : ¼¼¼ÇID or ¼­¹öID or CID´Ù¸§", dwUID, dwCID, dwSessionID, dwServerID, lpSessionData->GetCID(), lpCharacterData->GetCID(), lpSessionData->GetSessionID(), lpSessionData->GetServerID()); } else if(CSessionData::SE_CHAR_ENABLED != lpSessionData->GetSessionState()) { // ij¸¯ÅÍ »óŰ¡ Ȱ¼ºÈ­ »óŰ¡ ¾Æ´Õ´Ï´Ù. ERRLOG4(g_Log, "UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / " "ij¸¯ÅÍ ·Î±×¾Æ¿ô ½ÇÆÐ : ij¸¯ÅÍ È°¼ºÈ­ »óŰ¡ ¾Æ´Õ´Ï´Ù.", dwUID, dwCID, dwSessionID, dwServerID); } else { // ij¸¯ÅÍ µ¥ÀÌÅÍ ¾÷µ¥ÀÌÆ® unsigned long dwDataLen = lpPktDBUpdate->GetLen() - sizeof(PktDBUpdate); if(lpPktDBUpdate->m_TypeCode == DBUpdateData::LOGOUT && sizeof(PktDBUpdate) <= lpPktDBUpdate->GetLen()) { if(!lpCharacterData->SerializeIn(reinterpret_cast(lpPktDBUpdate + 1), lpPktDBUpdate->m_usUpdate, dwDataLen, DBUpdateData::MAX_UPDATE_DB)) { ERRLOG4(g_Log, "UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / " "ij¸¯ÅÍ ·Î±×¾Æ¿ô ÀÌ»ó : ij¸¯ÅÍ µ¥ÀÌÅÍ ¾÷µ¥ÀÌÆ® ½ÇÆÐ", dwUID, dwCID, dwSessionID, dwServerID); } else { // µ¥ÀÌÅÍ ¾÷µ¥ÀÌÆ® ¼º°ø. ·©Å·À» ¾÷µ¥ÀÌÆ®ÇÑ´Ù. const CHAR_INFOST& charInfo = lpCharacterData->GetInfo(); CRankingDBMgr::GetInstance().UpdateRanking( RankingNode(charInfo.Name, charInfo.Fame, static_cast(charInfo.Level), static_cast(charInfo.Class))); } } lpCharacterData->SetAdminFlag(cAdminFlag); // ÆÄƼ¿¡ ·Î±×¾Æ¿ô Àϸ² CPartyDBInfo* lpParty = CPartyDBMgr::GetInstance().OpenParty( CDBSingleObject::GetInstance(), lpCharacterData->GetPID()); if (0 != lpParty) { CPartyDBMgr::GetInstance().LogoutPartyMember( CDBSingleObject::GetInstance(), lpParty, dwCID); } // ±æµå¿¡ ·Î±×¾Æ¿ô ¾Ë¸² CGuildDB* lpGuild = static_cast( CGuildDBMgr::GetInstance().GetGuild(lpCharacterData->GetGID())); if (0 != lpGuild) { lpGuild->SendLoginOutMember(dwCID, 0); } // ij¸¯ÅÍ ºñȰ¼ºÈ­. if(!lpSessionData->CharDisable(dwCID, dwServerID)) { ERRLOG4(g_Log, "UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / " "ij¸¯ÅÍ ·Î±×¾Æ¿ô ½ÇÆÐ : ij¸¯ÅÍ ºñȰ¼ºÈ­ ½ÇÆÐ", dwUID, dwCID, dwSessionID, dwServerID); } else { INFLOG4(g_Log, "UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / " "ij¸¯ÅÍ ·Î±×¾Æ¿ô ¼º°ø", dwUID, dwCID, dwSessionID, dwServerID); // ·Î±×¾Æ¿ôÇßÀ¸´Ï, ¼¼¼ÇÀ» ´Ý´Â´Ù. CSessionDataMgr::GetInstance().SessionClose(dwUID, dwSessionID); if (GameRYL::CHINA == CServerSetup::GetInstance().GetNationType()) { // LogOut 󸮸¦ ÇØÁØ´Ù. DBComponent::GameDB::UpdatePlayTime(CDBSingleObject::GetInstance(), dwUID, 1); } } } // ¾ÆÀÌÅÛ ½Ã¸®¾ó ¾÷µ¥ÀÌÆ® if(itemSerialMgr.SetItemSerial(dwItemSerial)) { // ½Ã¸®¾óÀÌ ¹Ù²î¾úÀ¸¹Ç·Î DB¿¡ ¾÷µ¥ÀÌÆ®ÇÑ´Ù. if(!itemSerialMgr.SaveItemSerial(CDBSingleObject::GetInstance(), dwServerID)) { ERRLOG4(g_Log, "UID:%10u / CID:%10u / ServerID:0x%08X / Serial:0x%016I64X / ij¸¯ÅÍ ·Î±×¾Æ¿ô : ¾ÆÀÌÅÛ ½Ã¸®¾ó ¾÷µ¥ÀÌÆ® ½ÇÆÐ", dwUID, dwCID, dwServerID, itemSerialMgr.GetItemSerial()); } } return true; } // ij¸¯ÅÍ Á¸À̵¿ bool CharMoveZone(CSendStream& SendStream, unsigned long dwServerID, Item::CItemSerialMgr& itemSerialMgr, PktDBUpdate* lpPktDBUpdate) { unsigned __int64 dwItemSerial = lpPktDBUpdate->m_dlItemSerial; unsigned long dwSessionID = lpPktDBUpdate->m_dwSessionID; unsigned long dwUID = lpPktDBUpdate->m_dwUserID; unsigned long dwCID = lpPktDBUpdate->m_dwCharID; #ifdef ENABLE_PACKET_LOG DETLOG4(g_PacketLog, "ParseCharUpdate::CharMoveZone : UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / ", dwUID, dwCID, dwSessionID, dwServerID); #endif using namespace DataStorage; CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession(dwUID); CCharacterData* lpCharacterData = 0; if(0 == lpSessionData || 0 == (lpCharacterData = lpSessionData->GetCharacterData())) { // ¼­¹ö ¼¼¼Ç ¾ò±â ½ÇÆÐ ERRLOG6(g_Log, "UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / SessionData:0x%p / CharacterData:0x%p " "ij¸¯ÅÍ Á¸À̵¿ ½ÇÆÐ : ¼¼¼Ç ¶Ç´Â ij¸¯ÅÍ µ¥ÀÌÅͰ¡ ¾ø½À´Ï´Ù", dwUID, dwCID, dwSessionID, dwServerID, lpSessionData, lpCharacterData); } else if(lpSessionData->GetSessionID() != dwSessionID || lpSessionData->GetServerID() != dwServerID || dwCID != lpSessionData->GetCID() || dwCID != lpCharacterData->GetCID()) { // ¼¼¼ÇID / ¼­¹ö ID / CID´Ù¸§ ERRLOG8(g_Log, "UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / " "SessionDataCID:%10u / CharacterDataCID:%10u / " "SessionDataSessionID:%10u / SessionDataServerID:0x%08X / " "ij¸¯ÅÍ Á¸À̵¿ ½ÇÆÐ : ¼¼¼ÇID or ¼­¹öID or CID´Ù¸§", dwUID, dwCID, dwSessionID, dwServerID, lpSessionData->GetCID(), lpCharacterData->GetCID(), lpSessionData->GetSessionID(), lpSessionData->GetServerID()); } else if(CSessionData::SE_CHAR_ENABLED != lpSessionData->GetSessionState()) { // ij¸¯ÅÍ »óŰ¡ Ȱ¼ºÈ­ »óŰ¡ ¾Æ´Õ´Ï´Ù. ERRLOG4(g_Log, "UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / " "ij¸¯ÅÍ Á¸À̵¿ ½ÇÆÐ : ij¸¯ÅÍ È°¼ºÈ­ »óŰ¡ ¾Æ´Õ´Ï´Ù.", dwUID, dwCID, dwSessionID, dwServerID); } else { // ij¸¯ÅÍ µ¥ÀÌÅÍ ¾÷µ¥ÀÌÆ® unsigned long dwDataLen = lpPktDBUpdate->GetLen() - sizeof(PktDBUpdate); if(lpPktDBUpdate->m_TypeCode == DBUpdateData::ZONEMOVE && sizeof(PktDBUpdate) <= lpPktDBUpdate->GetLen()) { if(!lpCharacterData->SerializeIn(reinterpret_cast(lpPktDBUpdate + 1), lpPktDBUpdate->m_usUpdate, dwDataLen, DBUpdateData::MAX_UPDATE_DB)) { ERRLOG4(g_Log, "UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / " "ij¸¯ÅÍ Á¸À̵¿ ÀÌ»ó : ij¸¯ÅÍ µ¥ÀÌÅÍ ¾÷µ¥ÀÌÆ® ½ÇÆÐ", dwUID, dwCID, dwSessionID, dwServerID); } else { // µ¥ÀÌÅÍ ¾÷µ¥ÀÌÆ® ¼º°ø. ·©Å·À» ¾÷µ¥ÀÌÆ®ÇÑ´Ù. const CHAR_INFOST& charInfo = lpCharacterData->GetInfo(); CRankingDBMgr::GetInstance().UpdateRanking( RankingNode(charInfo.Name, charInfo.Fame, static_cast(charInfo.Level), static_cast(charInfo.Class))); } } // ÆÄƼ¿¡ ·Î±×¾Æ¿ô Àϸ² CPartyDBInfo* lpParty = CPartyDBMgr::GetInstance().OpenParty( CDBSingleObject::GetInstance(), lpCharacterData->GetPID()); if (0 != lpParty) { CPartyDBMgr::GetInstance().LogoutPartyMember( CDBSingleObject::GetInstance(), lpParty, dwCID); } // ±æµå¿¡ ·Î±×¾Æ¿ô ¾Ë¸² CGuildDB* lpGuild = static_cast( CGuildDBMgr::GetInstance().GetGuild(lpCharacterData->GetGID())); if (0 != lpGuild) { lpGuild->SendLoginOutMember(dwCID, 0); } // ij¸¯ÅÍ ºñȰ¼ºÈ­. if(!lpSessionData->CharMove(dwCID, dwServerID)) { ERRLOG4(g_Log, "UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / " "ij¸¯ÅÍ Á¸À̵¿ ½ÇÆÐ : ij¸¯ÅÍ ºñȰ¼ºÈ­ ½ÇÆÐ", dwUID, dwCID, dwSessionID, dwServerID); } else { INFLOG4(g_Log, "UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / " "ij¸¯ÅÍ Á¸À̵¿ ¼º°ø", dwUID, dwCID, dwSessionID, dwServerID); // Á¸À̵¿½Ã¿¡´Â ¼¼¼ÇÀ» ´ÝÁö ¾Ê´Â´Ù. // CSessionDataMgr::GetInstance().SessionClose(dwUID, dwSessionID); if (GameRYL::CHINA == CServerSetup::GetInstance().GetNationType()) { // LogOut 󸮸¦ ÇØÁØ´Ù. DBComponent::GameDB::UpdatePlayTime(CDBSingleObject::GetInstance(), dwUID, 1); } } } // ¾ÆÀÌÅÛ ½Ã¸®¾ó ¾÷µ¥ÀÌÆ® if(itemSerialMgr.SetItemSerial(dwItemSerial)) { // ½Ã¸®¾óÀÌ ¹Ù²î¾úÀ¸¹Ç·Î DB¿¡ ¾÷µ¥ÀÌÆ®ÇÑ´Ù. if(!itemSerialMgr.SaveItemSerial(CDBSingleObject::GetInstance(), dwServerID)) { ERRLOG4(g_Log, "UID:%10u / CID:%10u / ServerID:0x%08X / Serial:0x%016I64X / ij¸¯ÅÍ Á¸À̵¿ : ¾ÆÀÌÅÛ ½Ã¸®¾ó ¾÷µ¥ÀÌÆ® ½ÇÆÐ", dwUID, dwCID, dwServerID, itemSerialMgr.GetItemSerial()); } } return true; } // ij¸¯ÅÍ ¾÷µ¥ÀÌÆ® bool CharUpdate(CSendStream& SendStream, unsigned long dwServerID, Item::CItemSerialMgr& itemSerialMgr, PktDBUpdate* lpPktDBUpdate) { unsigned __int64 dwItemSerial = lpPktDBUpdate->m_dlItemSerial; unsigned long dwSessionID = lpPktDBUpdate->m_dwSessionID; unsigned long dwUID = lpPktDBUpdate->m_dwUserID; unsigned long dwCID = lpPktDBUpdate->m_dwCharID; #ifdef ENABLE_PACKET_LOG DETLOG4(g_PacketLog, "ParseCharUpdate::CharUpdate : UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / ", dwUID, dwCID, dwSessionID, dwServerID); #endif using namespace DataStorage; CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession(dwUID); CCharacterData* lpCharacterData = 0; if(0 == lpSessionData || 0 == (lpCharacterData = lpSessionData->GetCharacterData())) { // ¼­¹ö ¼¼¼Ç ¾ò±â ½ÇÆÐ ERRLOG6(g_Log, "UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / SessionData:0x%p / CharacterData:0x%p /" "ij¸¯ÅÍ µ¥ÀÌÅÍ ¾÷µ¥ÀÌÆ® ½ÇÆÐ : ¼¼¼ÇÀ̳ª ij¸¯ÅÍ µ¥ÀÌÅͰ¡ ¾ø½À´Ï´Ù", dwUID, dwCID, dwSessionID, dwServerID, lpSessionData, lpCharacterData); } else if(lpSessionData->GetSessionID() != dwSessionID || lpSessionData->GetServerID() != dwServerID || dwCID != lpSessionData->GetCID() || dwCID != lpCharacterData->GetCID()) { // ¼¼¼ÇID / ¼­¹ö ID / CID´Ù¸§ ERRLOG8(g_Log, "UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / " "SessionDataCID:%10u / CharacterDataCID:%10u / " "SessionDataSessionID:%10u / SessionDataServerID:0x%08X / " "ij¸¯ÅÍ µ¥ÀÌÅÍ ¾÷µ¥ÀÌÆ® ½ÇÆÐ : ¼¼¼ÇID or ¼­¹öID or CID´Ù¸§", dwUID, dwCID, dwSessionID, dwServerID, lpSessionData->GetCID(), lpCharacterData->GetCID(), lpSessionData->GetSessionID(), lpSessionData->GetServerID()); } else if(CSessionData::SE_CHAR_ENABLED != lpSessionData->GetSessionState()) { // ij¸¯ÅÍ »óŰ¡ Ȱ¼ºÈ­ »óŰ¡ ¾Æ´Õ´Ï´Ù. ERRLOG4(g_Log, "UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / " "ij¸¯ÅÍ µ¥ÀÌÅÍ ¾÷µ¥ÀÌÆ® ½ÇÆÐ : ij¸¯ÅÍ È°¼ºÈ­ »óŰ¡ ¾Æ´Õ´Ï´Ù.", dwUID, dwCID, dwSessionID, dwServerID); } else { // ij¸¯ÅÍ µ¥ÀÌÅÍ ¾÷µ¥ÀÌÆ® unsigned long dwDataLen = lpPktDBUpdate->GetLen() - sizeof(PktDBUpdate); if(lpPktDBUpdate->m_TypeCode == DBUpdateData::UPDATE && sizeof(PktDBUpdate) <= lpPktDBUpdate->GetLen()) { if(!lpCharacterData->SerializeIn(reinterpret_cast(lpPktDBUpdate + 1), lpPktDBUpdate->m_usUpdate, dwDataLen, DBUpdateData::MAX_UPDATE_DB)) { ERRLOG4(g_Log, "UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / " "ij¸¯ÅÍ µ¥ÀÌÅÍ ¾÷µ¥ÀÌÆ® : ij¸¯ÅÍ µ¥ÀÌÅÍ ¾÷µ¥ÀÌÆ® ½ÇÆÐ", dwUID, dwCID, dwSessionID, dwServerID); } else { // µ¥ÀÌÅÍ ¾÷µ¥ÀÌÆ® ¼º°ø. ·©Å·À» ¾÷µ¥ÀÌÆ®ÇÑ´Ù. const CHAR_INFOST& charInfo = lpCharacterData->GetInfo(); CRankingDBMgr::GetInstance().UpdateRanking( RankingNode(charInfo.Name, charInfo.Fame, static_cast(charInfo.Level), static_cast(charInfo.Class))); } } } // ¾ÆÀÌÅÛ ½Ã¸®¾ó ¾÷µ¥ÀÌÆ® if(itemSerialMgr.SetItemSerial(dwItemSerial)) { // ½Ã¸®¾óÀÌ ¹Ù²î¾úÀ¸¹Ç·Î DB¿¡ ¾÷µ¥ÀÌÆ®ÇÑ´Ù. if(!itemSerialMgr.SaveItemSerial(CDBSingleObject::GetInstance(), dwServerID)) { ERRLOG4(g_Log, "UID:%10u / CID:%10u / ServerID:0x%08X / Serial:0x%016I64X / ij¸¯ÅÍ ¾÷µ¥ÀÌÆ® : ¾ÆÀÌÅÛ ½Ã¸®¾ó ¾÷µ¥ÀÌÆ® ½ÇÆÐ", dwUID, dwCID, dwServerID, itemSerialMgr.GetItemSerial()); } } return true; } bool UpdateDeposit(CSendStream& SendStream, PktBase* lpPktBase) { PktDeposit* lpPktDeposit = static_cast(lpPktBase); unsigned char cCmd = lpPktDeposit->m_cCmd; char* lpData = lpPktDeposit->m_szData + sizeof(unsigned long); unsigned long dwUID = 0; memcpy(&dwUID, lpPktDeposit->m_szData, sizeof(unsigned long)); #ifdef ENABLE_PACKET_LOG DETLOG4(g_PacketLog, "ParseCharUpdate::UpdateDeposit : UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / ", dwUID, 0, 0, 0); #endif char szPassword[Deposit::PASSWORD_LENGTH + 1]; memset(szPassword, 0, sizeof(char) * (Deposit::PASSWORD_LENGTH + 1)); unsigned long dwGold = 0; switch(cCmd) { case PktDeposit::CMD::PASSWORD: memcpy(szPassword, lpData, Deposit::PASSWORD_LENGTH); break; case PktDeposit::CMD::GOLD: memcpy(&dwGold, lpData, sizeof(unsigned long)); break; } // Á¢¼Ó DB¿¡¼­ ¼¼¼Ç È®ÀÎ using namespace DataStorage; CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession(dwUID); CStoreData* lpStoreData = 0; if(0 == lpSessionData || 0 == (lpStoreData = lpSessionData->GetStoreData())) { ERRLOG6(g_Log, "UID:%10u / Cmd:%u / Password:%s / Gold:%10u / SessionData:0x%p / StoreData:0x%p / " "â°í Á¤º¸ ¾÷µ¥ÀÌÆ® ½ÇÆÐ : ¼¼¼ÇÀ̳ª â°í µ¥ÀÌÅͰ¡ ¾ø½À´Ï´Ù", dwUID, cCmd, szPassword, dwGold, lpSessionData, lpStoreData); } else if(CSessionData::SE_CHAR_ENABLED != lpSessionData->GetSessionState()) { ERRLOG4(g_Log, "UID:%10u / Cmd:%u / Password:%s / Gold:%10u / â°í Á¤º¸ ¾÷µ¥ÀÌÆ® ½ÇÆÐ : ij¸¯ÅͰ¡ Ȱ¼ºÈ­µÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù", dwUID, cCmd, szPassword, dwGold); } else if(dwUID != lpSessionData->GetUID() || dwUID != lpStoreData->GetUID()) { ERRLOG6(g_Log, "UID:%10u / Cmd:%u / SessionUID:%10u / StoreUID:%10u / Password:%s / Gold:%10u / " "â°í Á¤º¸ ¾÷µ¥ÀÌÆ® ½ÇÆÐ : â°í UID¿Í ¼¼¼ÇUID°¡ ´Ù¸¨´Ï´Ù", dwUID, cCmd, lpSessionData->GetUID(), lpStoreData->GetUID(), szPassword, dwGold); } else { STORE_INFO storeInfo = lpStoreData->GetStoreInfo(); switch(cCmd) { case PktDeposit::CMD::PASSWORD: memcpy(storeInfo.Password, szPassword, std::min(int(Deposit::PASSWORD_LENGTH), int(STORE_INFO::MAX_PASS_LEN))); storeInfo.Password[STORE_INFO::MAX_PASS_LEN - 1] = 0; break; case PktDeposit::CMD::GOLD: storeInfo.Gold = dwGold; break; } lpStoreData->SetStoreInfo(storeInfo); } return true; } bool UpdateDepositDB(CSendStream& SendStream, PktBase* lpPktBase) { PktDepositUpdateDB* lpPktDepositUpdateDB = static_cast(lpPktBase); unsigned long dwUID = lpPktDepositUpdateDB->m_dwUID; unsigned long dwCID = lpPktDepositUpdateDB->m_dwCID; unsigned long dwTabFlag = lpPktDepositUpdateDB->m_dwTabFlag; unsigned short usDataSize = lpPktDepositUpdateDB->m_usDataSize; unsigned char cTabNum = lpPktDepositUpdateDB->m_cTabNum; #ifdef ENABLE_PACKET_LOG DETLOG4(g_PacketLog, "ParseCharUpdate::UpdateDepositDB : UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / ", dwUID, dwCID, 0, 0); #endif // Á¢¼Ó DB¿¡¼­ ¼¼¼Ç È®ÀÎ using namespace DataStorage; CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession(dwUID); CStoreData* lpStoreData = 0; if(0 == lpSessionData || 0 == (lpStoreData = lpSessionData->GetStoreData())) { ERRLOG4(g_Log, "UID:%10u / CID:%10u / SessionData:0x%p / StoreData:0x%p / â°í Á¤º¸ ¾÷µ¥ÀÌÆ® ½ÇÆÐ : ¼¼¼ÇÀÌ ¾ø°Å³ª â°í µ¥ÀÌÅͰ¡ ¾ø½À´Ï´Ù.", dwUID, dwCID, lpSessionData, lpStoreData); } else if(CSessionData::SE_CHAR_ENABLED != lpSessionData->GetSessionState()) { ERRLOG2(g_Log, "UID:%10u / CID:%10u / â°í Á¤º¸ ¾÷µ¥ÀÌÆ® ½ÇÆÐ : ij¸¯ÅͰ¡ Ȱ¼ºÈ­µÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù", dwUID, dwCID); } else if(dwUID != lpSessionData->GetUID() || dwUID != lpStoreData->GetUID()) { ERRLOG4(g_Log, "UID:%10u / CID:%10u / SessionUID:%10u / StoreUID:%10u / " "â°í Á¤º¸ ¾÷µ¥ÀÌÆ® ½ÇÆÐ : â°í UID¿Í ¼¼¼ÇUID°¡ ´Ù¸¨´Ï´Ù", dwUID, dwCID, lpSessionData->GetUID(), lpStoreData->GetUID()); } else { STORE_INFO storeInfo = lpStoreData->GetStoreInfo(); if(storeInfo.Flag != dwTabFlag) { storeInfo.Flag = dwTabFlag; lpStoreData->SetStoreInfo(storeInfo); } if (PktDepositUpdateDB::TabNum::TAB_12 == cTabNum) { lpStoreData->SetStore1(reinterpret_cast(lpPktDepositUpdateDB + 1), usDataSize); } else if (PktDepositUpdateDB::TabNum::TAB_34 == cTabNum) { lpStoreData->SetStore2(reinterpret_cast(lpPktDepositUpdateDB + 1), usDataSize); } } return true; } bool UpdateFriendDB(CSendStream& SendStream, PktBase* lpPktBase) { PktFriendDB* lpPktFriendDB = static_cast(lpPktBase); unsigned char cCmd = lpPktFriendDB->m_cCmd; unsigned long dwUID = lpPktFriendDB->m_dwOwnerUID; unsigned long dwCID = lpPktFriendDB->m_dwOwnerCID; unsigned long dwRefCID = lpPktFriendDB->m_dwReferenceCID; unsigned long dwData = lpPktFriendDB->m_dwData; unsigned long dwGID = lpPktFriendDB->m_dwGID; // ±æµå Á¤º¸. unsigned short wClass = lpPktFriendDB->m_wClass; // Ŭ·¡½º Á¤º¸. char cLevel = lpPktFriendDB->m_cLevel; // ·¹º§ Á¤º¸. unsigned long dwServerID = lpPktFriendDB->m_dwServerID; #ifdef ENABLE_PACKET_LOG DETLOG4(g_PacketLog, "ParseCharUpdate::UpdateFriendDB : UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / ", dwUID, dwCID, 0, dwServerID); #endif using namespace DataStorage; CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession(dwUID); CCharacterData* lpCharacterData = 0; CSessionData* lpRefSessionData = 0; CCharacterData* lpRefCharacterData = 0; unsigned long dwRefSessionDataCID = 0; unsigned long dwRefCharacterDataCID = 0; if(0 == lpSessionData || 0 == (lpCharacterData = lpSessionData->GetCharacterData())) { // ¼¼¼Ç ¾ø°Å³ª µ¥ÀÌÅÍ ¾øÀ½ ERRLOG5(g_Log, "UID:%10u / CID:%10u / RefCID:%10u / SessionData:0x%p / CharacterData:0x%p / " "Ä£±¸ ÆÐŶ ó¸® ½ÇÆÐ : ¼¼¼ÇÀÌ ¾ø°Å³ª, ¼¼¼Ç¿¡ ij¸¯ÅÍ µ¥ÀÌÅͰ¡ ¾ø½À´Ï´Ù.", dwUID, dwCID, dwRefCID, lpSessionData, lpCharacterData); } else if(CSessionData::SE_CHAR_ENABLED != lpSessionData->GetSessionState()) { // ¼¼¼Ç »óÅ ÀÌ»ó ERRLOG4(g_Log, "UID:%10u / CID:%10u / RefCID:%10u / ST:%s / " "Ä£±¸ ÆÐŶ ó¸® ½ÇÆÐ : ¼¼¼ÇÀÌ È°¼ºÈ­µÇÁö ¾Ê¾Ò½À´Ï´Ù", dwUID, dwCID, dwRefCID, g_szSessionStateString[lpSessionData->GetSessionState()]); } else if(dwCID != lpCharacterData->GetCID() || dwCID != lpSessionData->GetCID()) { // CIDÀÌ»ó ERRLOG5(g_Log, "UID:%10u / CID:%10u / RefCID:%10u / SessionDataCID:%10u / CharacterDataCID:%10u / " "Ä£±¸ ÆÐŶ ó¸® ½ÇÆÐ : ¼¼¼Ç ¶Ç´Â ij¸¯ÅÍÀÇ CID°¡ ÀÌ»óÇÕ´Ï´Ù", dwUID, dwCID, dwRefCID, lpSessionData->GetCID(), lpCharacterData->GetCID()); } else { switch(cCmd) { case PktFriendDB::ADD_FRIEND: lpRefSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(dwRefCID); if(0 == lpRefSessionData || 0 == (lpRefCharacterData = lpRefSessionData->GetCharacterData()) || dwRefCID != (dwRefCharacterDataCID = lpRefCharacterData->GetCID()) || dwRefCID != (dwRefSessionDataCID = lpRefSessionData->GetCID())) { ERRLOG7(g_Log, "UID:%10u / CID:%10u / RefCID:%10u / RefSession:0x%p / RefCharacterData:0x%p / " "RefSessionDataCID:%10u / RefCharacterDataCID:%10u / Ä£±¸ ÆÐŶ ó¸® ½ÇÆÐ : Ä£±¸ Ãß°¡ ½ÇÆÐ - Ä£±¸°¡ ·Î±×ÀÎÇÏÁö ¾Ê¾Ò½À´Ï´Ù", dwUID, dwCID, dwRefCID, lpRefSessionData, lpRefCharacterData, dwRefCharacterDataCID, dwRefSessionDataCID); } else if(!lpCharacterData->AddFriend(dwRefCID, lpRefCharacterData->GetName(), dwGID, wClass, cLevel, dwServerID)) { ERRLOG3(g_Log, "UID:%10u / CID:%10u / RefCID:%10u / Ä£±¸ ÆÐŶ ó¸® ½ÇÆÐ : Ä£±¸ Ãß°¡ ½ÇÆÐ", dwUID, dwCID, dwRefCID); } break; case PktFriendDB::REMOVE_FRIEND: if(!lpCharacterData->RemoveFriend(dwRefCID)) { ERRLOG3(g_Log, "UID:%10u / CID:%10u / RefCID:%10u / Ä£±¸ ÆÐŶ ó¸® ½ÇÆÐ : Ä£±¸ Á¦°Å ½ÇÆÐ", dwUID, dwCID, dwRefCID); } break; case PktFriendDB::ADD_BAN: lpRefSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(dwRefCID); if(0 == lpRefSessionData || 0 == (lpRefCharacterData = lpRefSessionData->GetCharacterData()) || dwRefCID != (dwRefCharacterDataCID = lpRefCharacterData->GetCID()) || dwRefCID != (dwRefSessionDataCID = lpRefSessionData->GetCID())) { ERRLOG7(g_Log, "UID:%10u / CID:%10u / RefCID:%10u / RefSession:0x%p / RefCharacterData:0x%p / " "RefSessionDataCID:%10u / RefCharacterDataCID:%10u / Ä£±¸ ÆÐŶ ó¸® ½ÇÆÐ : °ÅºÎ Ãß°¡ ½ÇÆÐ - °ÅºÎ ´ë»óÀÚ°¡ ·Î±×ÀÎÇÏÁö ¾Ê¾Ò½À´Ï´Ù", dwUID, dwCID, dwRefCID, lpRefSessionData, lpRefCharacterData, dwRefCharacterDataCID, dwRefSessionDataCID); } else if(!lpCharacterData->AddBan(dwRefCID, lpRefCharacterData->GetName(), lpRefCharacterData->GetGID(), lpRefCharacterData->GetClass(), lpRefCharacterData->GetLevel(), dwServerID)) { ERRLOG3(g_Log, "UID:%10u / CID:%10u / RefCID:%10u / Ä£±¸ ÆÐŶ ó¸® ½ÇÆÐ : °ÅºÎ Ãß°¡ ½ÇÆÐ", dwUID, dwCID, dwRefCID); } break; case PktFriendDB::REMOVE_BAN: if(!lpCharacterData->RemoveBan(dwRefCID)) { ERRLOG3(g_Log, "UID:%10u / CID:%10u / RefCID:%10u / Ä£±¸ ÆÐŶ ó¸® ½ÇÆÐ : °ÅºÎ Á¦°Å ½ÇÆÐ", dwUID, dwCID, dwRefCID); } break; case PktFriendDB::SETGROUP: if(!lpCharacterData->SetFriendGroup(dwRefCID, dwData)) { ERRLOG4(g_Log, "UID:%10u / CID:%10u / RefCID:%10u / dwData:0x%08X / Ä£±¸ ÆÐŶ ó¸® ½ÇÆÐ : ±×·ì ¼³Á¤ ½ÇÆÐ", dwUID, dwCID, dwRefCID, dwData); } break; case PktFriendDB::FRIEND_INFO: { // Ä£±¸ Á¤º¸ ¾÷µ¥ÀÌÆ® // CFriendList friendList = lpCharacterData->GetFriendList(); CFriendList::Rebind* lpRebind = friendList.GetFriend(dwRefCID); if(lpRebind) { // ¾÷µ¥ÀÌÆ® // lpRebind->UpdateServerID(dwServerID); lpRebind->UpdateLevel(cLevel); lpRebind->UpdateGID(dwGID); lpRebind->UpdateClass(wClass); lpCharacterData->SetFriendUpdateData(); lpCharacterData->UpdateDBData(CDBSingleObject::GetInstance()); } } break; case PktFriendDB::BAN_INFO: { // °ÅºÎ Á¤º¸ ¾÷µ¥ÀÌÆ® // CBanList banList = lpCharacterData->GetBanList(); CBanList::Rebind* lpRebind = banList.GetBan(dwRefCID); if(lpRebind) { // ¾÷µ¥ÀÌÆ® // lpRebind->UpdateServerID(dwServerID); lpRebind->UpdateLevel(cLevel); lpRebind->UpdateGID(dwGID); lpRebind->UpdateClass(wClass); lpCharacterData->SetBadUpdateData(); lpCharacterData->UpdateDBData(CDBSingleObject::GetInstance()); } } break; } } return true; } bool UpdateQuestDB(CSendStream& SendStream, PktBase* lpPktBase) { PktQuestDB* lpPktQuestDB = static_cast(lpPktBase); unsigned long dwUID = lpPktQuestDB->m_dwUID; unsigned long dwCID = lpPktQuestDB->m_dwCID; unsigned long dwExecuteQuestSize = lpPktQuestDB->m_wExecuteQuestSize; unsigned long dwHistoryQuestSize = lpPktQuestDB->m_wHistoryQuestSize; #ifdef ENABLE_PACKET_LOG DETLOG4(g_PacketLog, "ParseCharUpdate::UpdateQuestDB : UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / ", dwUID, dwCID, 0, 0); #endif using namespace DataStorage; CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession(dwUID); CCharacterData* lpCharacterData = 0; if(0 == lpSessionData || 0 == (lpCharacterData = lpSessionData->GetCharacterData())) { // ¼¼¼Ç ¾ø°Å³ª µ¥ÀÌÅÍ ¾øÀ½ ERRLOG4(g_Log, "UID:%10u / CID:%10u / SessionData:0x%p / CharacterData:0x%p / " "Äù½ºÆ® ÆÐŶ ó¸® ½ÇÆÐ : ¼¼¼ÇÀÌ ¾ø°Å³ª, ¼¼¼Ç¿¡ ij¸¯ÅÍ µ¥ÀÌÅͰ¡ ¾ø½À´Ï´Ù.", dwUID, dwCID, lpSessionData, lpCharacterData); } else if(CSessionData::SE_CHAR_ENABLED != lpSessionData->GetSessionState()) { // ¼¼¼Ç »óÅ ÀÌ»ó ERRLOG3(g_Log, "UID:%10u / CID:%10u / ST:%s / " "Äù½ºÆ® ÆÐŶ ó¸® ½ÇÆÐ : ¼¼¼ÇÀÌ È°¼ºÈ­µÇÁö ¾Ê¾Ò½À´Ï´Ù", dwUID, dwCID, g_szSessionStateString[lpSessionData->GetSessionState()]); } else if(dwCID != lpCharacterData->GetCID() || dwCID != lpSessionData->GetCID()) { // CIDÀÌ»ó ERRLOG4(g_Log, "UID:%10u / CID:%10u / SessionDataCID:%10u / CharacterDataCID:%10u / " "Äù½ºÆ® ÆÐŶ ó¸® ½ÇÆÐ : ¼¼¼Ç ¶Ç´Â ij¸¯ÅÍÀÇ CID°¡ ÀÌ»óÇÕ´Ï´Ù", dwUID, dwCID, lpSessionData->GetCID(), lpCharacterData->GetCID()); } else { QUEST quest; memset(&quest, 0, sizeof(QUEST)); quest.dwSize = dwExecuteQuestSize; memcpy(quest.Data, lpPktQuestDB + 1, dwExecuteQuestSize); SERLOG5(g_Log, "UID:%10u / CID:%10u / SessionDataCID:%10u / CharacterDataCID:%10u / " "Äù½ºÆ® ÆÐŶ ó¸® : Quest Size : %d", dwUID, dwCID, lpSessionData->GetCID(), lpCharacterData->GetCID(), dwExecuteQuestSize); HISTORY history; memset(&history, 0, sizeof(HISTORY)); history.dwSize = dwHistoryQuestSize; memcpy(history.Data, reinterpret_cast(lpPktQuestDB + 1) + dwExecuteQuestSize, dwHistoryQuestSize); lpCharacterData->SetQuest(quest); lpCharacterData->SetHistory(history); } return true; } bool UpdateConfigInfoDB(CSendStream& SendStream, PktBase* lpPktBase) { PktConfigInfo* lpPktConfigInfo = static_cast(lpPktBase); unsigned long dwUID = lpPktConfigInfo->m_dwUserID; unsigned long dwCID = lpPktConfigInfo->m_dwCharID; unsigned short usSize = lpPktConfigInfo->m_wSize; #ifdef ENABLE_PACKET_LOG DETLOG4(g_PacketLog, "ParseCharUpdate::UpdateConfigInfoDB : UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / ", dwUID, dwCID, 0, 0); #endif using namespace DataStorage; CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetOpenSession(dwUID); CCharacterData* lpCharacterData = 0; if(0 == lpSessionData || 0 == (lpCharacterData = lpSessionData->GetCharacterData())) { // ¼¼¼Ç ¾ø°Å³ª µ¥ÀÌÅÍ ¾øÀ½ ERRLOG4(g_Log, "UID:%10u / CID:%10u / SessionData:%0xp / CharacterData:%0xp / " "¼³Á¤ ÆÐŶ ó¸® ½ÇÆÐ : ¼¼¼ÇÀÌ ¾ø°Å³ª, ¼¼¼Ç¿¡ ij¸¯ÅÍ µ¥ÀÌÅͰ¡ ¾ø½À´Ï´Ù.", dwUID, dwCID, lpSessionData, lpCharacterData); } else if(CSessionData::SE_CHAR_ENABLED != lpSessionData->GetSessionState()) { // ¼¼¼Ç »óÅ ÀÌ»ó ERRLOG3(g_Log, "UID:%10u / CID:%10u / ST:%s / " "¼³Á¤ ÆÐŶ ó¸® ½ÇÆÐ : ¼¼¼ÇÀÌ È°¼ºÈ­µÇÁö ¾Ê¾Ò½À´Ï´Ù", dwUID, dwCID, g_szSessionStateString[lpSessionData->GetSessionState()]); } else if(dwCID != lpCharacterData->GetCID() || dwCID != lpSessionData->GetCID()) { // CIDÀÌ»ó ERRLOG4(g_Log, "UID:%10u / CID:%10u / SessionDataCID:%10u / CharacterDataCID:%10u / " "¼³Á¤ ÆÐŶ ó¸® ½ÇÆÐ : ¼¼¼Ç ¶Ç´Â ij¸¯ÅÍÀÇ CID°¡ ÀÌ»óÇÕ´Ï´Ù", dwUID, dwCID, lpSessionData->GetCID(), lpCharacterData->GetCID()); } else { CONFIG config; memset(&config, 0, sizeof(CONFIG)); char* lpSrc = reinterpret_cast(lpPktConfigInfo + 1); char* lpDst = config.Data; memcpy(lpDst, lpSrc, sizeof(PeaceModeInfo)); lpSrc += sizeof(PeaceModeInfo); lpDst += sizeof(PeaceModeInfo); memcpy(lpDst, lpSrc, sizeof(RejectOption)); lpSrc += sizeof(RejectOption); lpDst += sizeof(RejectOption); config.dwSize = sizeof(PeaceModeInfo) + sizeof(RejectOption); lpCharacterData->SetConfig(config); } return true; } bool SaveEnemy(CSendStream& SendStream, PktBase* lpPktBase) { PktSaveEnemy* lpSaveEnemy = static_cast(lpPktBase); unsigned long dwCID = lpSaveEnemy->m_dwCID; unsigned long dwAttackedCID = lpSaveEnemy->m_dwAttackedCID; unsigned long dwTick = ::GetTickCount(); #ifdef ENABLE_PACKET_LOG DETLOG4(g_PacketLog, "ParseCharUpdate::SaveEnemy : UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / ", 0, dwCID, 0, 0); #endif using namespace DataStorage; CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(dwCID); if(lpSessionData) { CSessionData::SaveEnemy* lpSaveEnemyInfo = lpSessionData->GetSaveEnemy(); for(unsigned char cIndex = 0; cIndex < CSessionData::SaveEnemy::MAX_SAVING_ENEMY; cIndex++) { if(lpSaveEnemyInfo[cIndex].m_dwCID==dwAttackedCID) { lpSaveEnemyInfo[cIndex].m_dwCID = dwAttackedCID; lpSaveEnemyInfo[cIndex].m_dwTick = dwTick; return true; } } for(unsigned char cIndex = 0; cIndex < CSessionData::SaveEnemy::MAX_SAVING_ENEMY; cIndex++) { if(!lpSaveEnemyInfo[cIndex].m_dwCID) { lpSaveEnemyInfo[cIndex].m_dwCID = dwAttackedCID; lpSaveEnemyInfo[cIndex].m_dwTick = dwTick; return true; } } unsigned char cDeleteIndex = 0xff; unsigned long dwDeleteTick = dwTick; for(unsigned char cIndex = 0; cIndex < CSessionData::SaveEnemy::MAX_SAVING_ENEMY; cIndex++) { if(lpSaveEnemyInfo[cIndex].m_dwCID) { if(lpSaveEnemyInfo[cIndex].m_dwTick<=dwDeleteTick) { dwDeleteTick = lpSaveEnemyInfo[cIndex].m_dwTick; cDeleteIndex = cIndex; } } } if(cDeleteIndex!=0xff) { lpSaveEnemyInfo[cDeleteIndex].m_dwCID = dwAttackedCID; lpSaveEnemyInfo[cDeleteIndex].m_dwTick = dwTick; } return true; } return true; } bool UpdateKeyInfo(CSendStream& SendStream, PktBase* lpPktBase) { PktKeyInfo* lpKeyInfo = static_cast(lpPktBase); unsigned long dwCID = lpKeyInfo->m_dwCID; #ifdef ENABLE_PACKET_LOG DETLOG4(g_PacketLog, "ParseCharUpdate::UpdateKeyInfo : UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / ", 0, dwCID, 0, 0); #endif using namespace DataStorage; CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(dwCID); if (lpSessionData) { KeyInfo* pKeyInfo = lpSessionData->GetKeyInfo(); pKeyInfo->m_cUsed = 1; memcpy(pKeyInfo->m_dwKeyInfo, lpKeyInfo->m_dwKeyInfo, sizeof(unsigned long)*PktKeyInfo::MAX_KEY_INFO); //DBComponent::GameDB::UpdateKeyInfo(CDBSingleObject::GetInstance(), pKeyInfo, lpSessionData->GetUID()); } return true; } bool UseCashItem(CSendStream& SendStream, PktBase* lpPktBase) { PktUI* lpPktUI = static_cast(lpPktBase); unsigned long dwCID = lpPktUI->m_dwRecver; #ifdef ENABLE_PACKET_LOG DETLOG4(g_PacketLog, "ParseCharUpdate::UseCashItem : UID:%10u / CID:%10u / SessionID:%10u / ServerID:0x%08X / ", 0, dwCID, 0, 0); #endif using namespace DataStorage; CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(dwCID); unsigned short usError = 0; /// ½ºÅä¾îµåÇÁ·Î½ÃÁ® Ãß°¡ÇÔ (2009.05.09 ÀÏ ¹«½¼ÀÌÀ¯ÀÎÁö ½ºÅä¾îµåÇÁ·Î½ÃÁ®°¡ ¾ø¾úÀ½) // ¿©±â¼­ DB¿¡ Äõ¸®¸¦ ³¯·ÁÁØ´Ù. 1½Ã°£ °áÀç±Ý¾× if(DBComponent::GameDB::AddPremiumService(CDBSingleObject::GetInstance(), lpSessionData->GetUID(), 1, lpPktUI->m_cRemainItemNum)) { // °á°ú º¸³»±â SendPacket::CharUseCashItem(SendStream, lpPktUI->m_dwSender, lpPktUI->m_dwRecver, lpPktUI->m_itemPos, lpPktUI->m_cRemainItemNum, 0); return true; } // °á°ú º¸³»±â SendPacket::CharUseCashItem(SendStream, lpPktUI->m_dwSender, lpPktUI->m_dwRecver, lpPktUI->m_itemPos, lpPktUI->m_cRemainItemNum, PktUI::USE_FAILED); return false ; } bool ExtraEvent(CSendStream& SendStream, PktBase* lpPktBase) { // edith 2009.09.05 ½Å±Ô À̺¥Æ® Á¦ÀۺκРPktExtraEvent* lpPktEE = static_cast(lpPktBase); unsigned long dwUID = lpPktEE->m_dwUserID; unsigned long dwCID = lpPktEE->m_dwCharID; unsigned long dwEventID = lpPktEE->m_dwEventID; unsigned int dwEVENT = LOWORD(dwEventID); unsigned int dwVALUE = HIWORD(dwEventID); using namespace DataStorage; CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(dwCID); unsigned short usError = 0; unsigned int dwEventFlag = 0; if(DBComponent::GameDB::UpdateExtraEvent(CDBSingleObject::GetInstance(), lpSessionData->GetUID(), dwEventID, dwEVENT, dwVALUE, &dwEventFlag)) { if(dwEventFlag != 1) { usError = PktExtraEvent::EVENT_CLEAR; } else if(dwEVENT == 1) { int day = 0; if(dwVALUE == 30) day = 7; else if(dwVALUE == 60) day = 15; else if(dwVALUE == 90) day = 30; // °ñ¹Ú dayÀÏ º¸»ó if(!DBComponent::GameDB::AddPremiumService(CDBSingleObject::GetInstance(), dwUID, 1, day)) usError = PktExtraEvent::FAIL_REWARD; else { lpPktEE->m_dwValue1 = dwEVENT; lpPktEE->m_dwValue2 = dwVALUE; } } else usError = PktExtraEvent::EVENT_NONE; } else usError = PktExtraEvent::FAIL_EVENT; SendPacket::CharExtraEvent(SendStream, lpPktEE->m_dwUserID, lpPktEE->m_dwCharID, lpPktEE->m_dwEventID, lpPktEE->m_dwValue1, lpPktEE->m_dwValue2, usError); return false; } } namespace ParseCharAdmin { bool AdminCommandLog(CSendStream& SendStream, PktBase* lpPktBase) { PktAdminCommandLog* lpAdminCommandLog = static_cast(lpPktBase); char szCommand[PktAdminCommandLog::MAX_COMMAND_SIZE] = {0, }; unsigned long dwAdminCID = lpAdminCommandLog->m_dwAdminCID; unsigned long dwCID = lpAdminCommandLog->m_dwCID; memcpy(szCommand, lpAdminCommandLog->m_szCommand, PktAdminCommandLog::MAX_COMMAND_SIZE); using namespace DataStorage; CSessionData* lpSessionData = CSessionDataMgr::GetInstance().GetCharLoadedSession(dwAdminCID); if(lpSessionData) { DBComponent::GameDB::InsertAdminCommandLog(CDBSingleObject::GetInstance(), lpSessionData->GetOldServerGroupID(), dwAdminCID, dwCID, szCommand); } return true; } } }