#include "stdafx.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "RegularAgentDispatch.h" RylServerInfo CRegularAgentDispatch::ms_AgentServerInfo[SERVER_ID::MAX_GROUP_NUM]; CMultiDispatch& CRegularAgentDispatch::GetDispatchTable(void) { static CMultiDispatch multiDispatch; return multiDispatch; } CTempCharacterMgr& CRegularAgentDispatch::GetTempCharacterMgr(void) { static CTempCharacterMgr tempCharacterMgr; return tempCharacterMgr; } CRegularAgentDispatch::CRegularAgentDispatch(CSession& Session) : CRylServerDispatch(Session, MAX_PACKET_DISPATCH_PER_PULSE), m_cGroup(0) { } CRegularAgentDispatch::~CRegularAgentDispatch() { } bool CRegularAgentDispatch::Initialize(void) { // ÆÄÀÏ ¿­±â const char szGroupFileName[MAX_PATH] = "./Script/Server/ServerGroup.txt"; const char szIPFileName[MAX_PATH] = "./Script/Server/ServerIP.txt"; FILE *lpGroupFile = fopen(szGroupFileName, "rt"); FILE *lpIPFile = fopen(szIPFileName, "rt"); const int MAX_BUFFERSIZE = 256; char szGroupBuffer[MAX_BUFFERSIZE]; char szIPBuffer[MAX_BUFFERSIZE]; if (NULL == lpGroupFile || NULL == lpIPFile) { ERRLOG2(g_Log, "Cannot load server group/IP file : %s or %s", szGroupFileName, szIPFileName); return false; } for (int nGroup = 0; nGroup < SERVER_ID::MAX_GROUP_NUM; ) { if (NULL == fgets(szGroupBuffer, MAX_BUFFERSIZE, lpGroupFile) || NULL == fgets(szIPBuffer, MAX_BUFFERSIZE, lpIPFile)) { break; } nGroup = atoi(strtok(szIPBuffer, "\n:")); ms_AgentServerInfo[nGroup].m_ServerUID.sID.Group = nGroup; ms_AgentServerInfo[nGroup].m_ServerAddress.S_un.S_addr = inet_addr(strtok(NULL, "\n:")); ms_AgentServerInfo[nGroup].m_usChannelClientNum[0] = 1; ms_AgentServerInfo[nGroup].m_usChannelClientNum[1] = 2; ms_AgentServerInfo[nGroup].m_usChannelNum = 2; strncpy(ms_AgentServerInfo[nGroup].m_szGroupName, strtok(szGroupBuffer, "\n"), RylServerInfo::GROUP_NAME_LENGTH - 1); ms_AgentServerInfo[nGroup].m_szGroupName[RylServerInfo::GROUP_NAME_LENGTH - 1] = '\0'; ms_AgentServerInfo[nGroup].m_nGroupNameLen = strlen(ms_AgentServerInfo[nGroup].m_szGroupName); } fclose(lpGroupFile); fclose(lpIPFile); return true; } void CRegularAgentDispatch::Connected() { int nGroup = 0; for (; nGroup < SERVER_ID::MAX_GROUP_NUM; ++nGroup) { if (ms_AgentServerInfo[nGroup].m_ServerAddress.S_un.S_addr == GetRemoteAddr().get_addr_in().sin_addr.S_un.S_addr) { break; } } if (SERVER_ID::MAX_GROUP_NUM == nGroup) { ERRLOG0(g_Log, "Á¤½Ä Áß°è ¼­¹ö¿Í ¿¬°áÇÒ ¼ö ¾ø½À´Ï´Ù."); Shutdown(); return; } char* lpBuffer = m_SendStream.GetBuffer(sizeof(PktSL)); if (NULL != lpBuffer) { PktSL* lpPktSL = reinterpret_cast(lpBuffer); const int MAX_ADDRESS = 128; char szAddress[MAX_ADDRESS]; CTCPFactory tcpFactory; tcpFactory.GetNetworkInfo(szAddress, MAX_ADDRESS); lpPktSL->m_Address.S_un.S_addr = inet_addr(szAddress); SERVER_ID serverID = {0,}; serverID.sID.Type = CServerSetup::AdminToolServer; serverID.sID.Group = nGroup; serverID.sID.Channel = CServerSetup::GetInstance().GetChannelFromCmdLine() + 2; serverID.sID.ID = SERVER_ID::ADMIN_TOOL_ZONE; lpPktSL->m_dwServerID = serverID.dwID; if (m_SendStream.WrapHeader(sizeof(PktSL), CmdSysServerLogin, 0, 0)) { INFLOG2(g_Log, "Áß°è¼¼¼Ç(0x%p)¿¡ ¼­¹ö(0x%08x)ÀÇ ·Î±×ÀÎÆÐŶÀ» Àü¼ÛÇÕ´Ï´Ù.", this, serverID); } } } void CRegularAgentDispatch::Disconnected() { INFLOG2(g_Log, "Áß°è¼¼¼Ç(0x%p)°ú ¼­¹ö(%d)ÀÇ ¿¬°áÀ» ²÷½À´Ï´Ù.", this, m_cGroup); GetDispatchTable().RemoveDispatch(m_cGroup); } bool CRegularAgentDispatch::DispatchPacket(PktBase* lpPktBase) { switch (lpPktBase->GetCmd()) { case CmdSysServerLogin: return ParseServerLogin(lpPktBase); case CmdBGServerCharSlot: return RegularAgentPacketParse::ParseGetCharSlot(lpPktBase); case CmdAdminToolGetData: return RegularAgentPacketParse::ParseGetCharData(lpPktBase, m_cGroup); default: // ÆÐŶ Command°¡ invaildÇÑÁö º»´Ù. invalidÇÑ °æ¿ì´Â ´Ù½Ã °Ë»öÇØ¼­ vaildÇÑ À§Ä¡¸¦ ã¾Æ³½´Ù. LogErrorPacket("ÆÐŶ Çì´õÀÇ ÆÐŶ Ä¿¸Çµå°¡ À߸øµÇ¾ú½À´Ï´Ù.", lpPktBase->GetCmd()); break; } return true; } bool CRegularAgentDispatch::ParseServerLogin(PktBase* lpPktBase) { PktSL* lpPktSL = static_cast(lpPktBase); SERVER_ID serverID = {0,}; serverID.dwID = lpPktSL->m_dwServerID; m_cGroup = serverID.sID.Group; if (false == GetDispatchTable().SetDispatch(m_cGroup, this)) { ERRLOG3(g_Log, "DP:0x%p/IP:%s/Duplicated servergroup login : %d", this, GetRemoteAddr().get_addr_string(), m_cGroup); return false; } DETLOG3(g_Log, "DP:0x%p/IP:%s/Servergroup login : %d", this, GetRemoteAddr().get_addr_string(), m_cGroup); return true; } bool RegularAgentPacketParse::ParseGetCharSlot(PktBase* lpPktBase) { PktBGServerCharSlotAck* lpPktCharSlotAck = static_cast(lpPktBase); // TODO : ÇöÀç´Â ÀÓÀÇÀÇ Ä³¸¯ÅÍ Çϳª¸¦ °ñ¶ó ¹Ù·Î Á¤º¸¸¦ ¿äûÇÕ´Ï´Ù. (â°í Á¤º¸¸¸ ¾òÀ¸¸é µÇ¹Ç·Î...) // ÃßÈÄ È¯Àü¼Ò¿¡ ij¸¯ÅÍ ¼±Åà ±â´ÉÀÌ Ãß°¡µÇ¸é Ŭ¶óÀÌ¾ðÆ®¿¡ PktBGServerCharSlotAck¸¦ º¸³»¼­ ¼±ÅÃÇÒ ¼ö ÀÖµµ·Ï ¼öÁ¤ÇØ¾ß ÇÕ´Ï´Ù. unsigned long dwCID = lpPktCharSlotAck->m_dwCID; unsigned char cGroup = lpPktCharSlotAck->m_cGroup; CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(dwCID); if (NULL == lpCharacter) { ERRLOG1(g_Log, "CID:0x%08x ij¸¯ÅͰ¡ ¾ø½À´Ï´Ù.", dwCID); return false; } CTempCharacter* lpTempCharacter = CRegularAgentDispatch::GetTempCharacterMgr().GetCharacter(dwCID, cGroup); if(0 != lpTempCharacter) { unsigned long dwTempUID = 0; if(DBComponent::AuthDB::GetUIDFromBattleUID( CDBSingleObject::GetInstance(), lpCharacter->GetUID(), &dwTempUID)) { int nCount = 0; for(; nCount < USER_INFO::MAX_CHAR_NUM; ++nCount) { if(0 != lpPktCharSlotAck->m_dwSlotCID[nCount]) { lpTempCharacter->SetUID(dwTempUID); lpTempCharacter->SetCID(lpPktCharSlotAck->m_dwSlotCID[nCount]); lpTempCharacter->SetCharacterName(lpPktCharSlotAck->m_szSlotName[nCount]); lpTempCharacter->SetData(CTempCharacter::SLOT_INFO_SET); DETLOG5(g_Log, "UID:%10u/CID:%10u/Á¤¼· UID¾ò¾î¿À±â ¼º°ø : Á¤¼·¿¡ ij¸¯ÅÍ µ¥ÀÌÅÍ ¿äû : UID:%10u/CID:%10u/Group:%d/", lpCharacter->GetUID(), dwCID, dwTempUID, lpPktCharSlotAck->m_dwSlotCID[nCount], cGroup); if(SendGetCharData(dwTempUID, lpPktCharSlotAck->m_dwSlotCID[nCount], lpPktCharSlotAck->m_szSlotName[nCount], dwCID, cGroup)) { lpTempCharacter->AddDataRequestCount(); } break; } } // ij¸¯ÅͰ¡ ÇѸ¶¸®µµ ¾ø´Â °æ¿ì. if(nCount == USER_INFO::MAX_CHAR_NUM) { CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher(); if (NULL != lpDispatch) { GameClientSendPacket::SendCharBGServerMileageChange(lpDispatch->GetSendStream(), dwCID, cGroup, PktBGServerMileageChange::MC_INFO, 0, lpCharacter->GetMileage(), PktBGServerMileageChange::NONE_CHARACTER); } } } else { ERRLOG3(g_Log, "UID:%10u/CID:%10u/Á¤¼· UID¾ò¾î¿À±â ½ÇÆÐ : %s", lpCharacter->GetUID(), dwCID, CDBSingleObject::GetInstance().GetErrorString()); } } else { ERRLOG2(g_Log, "UID:%10u/CID:%10u/Á¤¼· UID¾ò¾î¿À±â ½ÇÆÐ : Àӽà ij¸¯ÅÍ »ý¼º ½ÇÆÐ", lpCharacter->GetUID(), dwCID); } return true; } bool RegularAgentPacketParse::ParseGetCharData(PktBase* lpPktBase, unsigned char cGroup) { PktAdminToolGetDataAck* lpPktGetDataAck = static_cast(lpPktBase); char* lpDataBuffer = reinterpret_cast(lpPktGetDataAck + 1); unsigned long dwUID = lpPktGetDataAck->m_dwUID; unsigned long dwCID = lpPktGetDataAck->m_dwCID; unsigned long dwRequestKey = lpPktGetDataAck->m_dwRequestKey; unsigned char cType = lpPktGetDataAck->m_cType; unsigned long dwGold = 0; CTempCharacter* lpTempCharacter = CRegularAgentDispatch::GetTempCharacterMgr().GetCharacter(dwRequestKey, cGroup); if (NULL != lpTempCharacter) { if (PktAdminToolGetData::CHAR_EXTRA_DATA == cType) { lpTempCharacter->SetUID(dwUID); lpTempCharacter->SetCID(dwCID); lpTempCharacter->GetCharInfoEx() = *reinterpret_cast(lpDataBuffer); lpDataBuffer += sizeof(CHAR_INFOEX); lpTempCharacter->GetQuest() = *reinterpret_cast(lpDataBuffer); lpDataBuffer += sizeof(QUEST); lpTempCharacter->GetHistory() = *reinterpret_cast(lpDataBuffer); lpDataBuffer += sizeof(HISTORY); lpTempCharacter->GetConfig() = *reinterpret_cast(lpDataBuffer); lpDataBuffer += sizeof(CONFIG); // STORE_INFO ------------------------------------------------------------------------------------ STORE_INFO& storeInfo = lpTempCharacter->GetStoreInfo() = *reinterpret_cast(lpDataBuffer); //-------------------------------------------------------------------------------------------------- lpTempCharacter->SetData(CTempCharacter::CHAR_DATA_SET); lpTempCharacter->ReleaseDataRequestCount(); dwGold = storeInfo.Gold; CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(dwRequestKey); if (NULL != lpCharacter) { DETLOG6(g_Log, "UID:%10u/CID:%10u/Á¤¼·UID:%10u/Á¤¼·CID:%10u/Group:%d/Gold:%10u/Á¤¼·¿¡¼­ µ·À» ¾ò¾î¿Ô½À´Ï´Ù.", lpCharacter->GetUID(), lpCharacter->GetCID(), dwUID, dwCID, cGroup, dwGold); CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher(); if (NULL != lpDispatch) { GameClientSendPacket::SendCharBGServerMileageChange(lpDispatch->GetSendStream(), dwRequestKey, cGroup, PktBGServerMileageChange::MC_INFO, dwGold, lpCharacter->GetMileage(), PktBase::NO_SERVER_ERR); return true; } } } } return true; } bool RegularAgentPacketParse::SendGetCharSlot(unsigned long dwCID, unsigned char cGroup) { CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(dwCID); if (NULL == lpCharacter) { ERRLOG1(g_Log, "CID:0x%08x ij¸¯ÅͰ¡ ¾ø½À´Ï´Ù.", dwCID); return false; } /* // Test : ȯÀü¼Ò »ç¿ë Á¦ÇÑ if (10000002 != lpCharacter->GetUID() && 10000012 != lpCharacter->GetUID() && 10000006 != lpCharacter->GetUID() && 10000015 != lpCharacter->GetUID() && 10000310 != lpCharacter->GetUID() && 10000027 != lpCharacter->GetUID() && 10001591 != lpCharacter->GetUID() && 10000020 != lpCharacter->GetUID() && 10000601 != lpCharacter->GetUID() && 10000013 != lpCharacter->GetUID()) { return true; } */ GET_MULTI_DISPATCH(lpDispatch, cGroup, CRegularAgentDispatch, CRegularAgentDispatch::GetDispatchTable()); if (NULL == lpDispatch) { ERRLOG2(g_Log, "CID:0x%08x ±×·ì:%d ¿¬°á¼¼¼Ç ±¸ÇÏ±â ½ÇÆÐ", dwCID, cGroup); return false; } unsigned long dwTempUID = 0; // ij¸¯ÅÍ ½½·Ô Á¤º¸¸¦ µÚÁ® ºÁ¼­. ÀÖÀ¸¸é, ±× UID·Î ¿äûÀ» º¸³»°í, ¾øÀ¸¸é SlotÀ¸·Î ¿äÃ»ÇØ º»´Ù. CTempCharacter* lpTempCharacter = CRegularAgentDispatch::GetTempCharacterMgr().GetCharacter(dwCID, cGroup); if(0 == lpTempCharacter) { // ij¸¯ÅÍ »ý¼º ½ÇÆÐ. } else if(lpTempCharacter->IsSetData(CTempCharacter::SLOT_INFO_SET)) { // ij¸¯ÅÍ µ¥ÀÌÅ͸¦ µÚÁ® ºÁ¼­. ÀÖÀ¸¸é ±× Á¤º¸·Î µ¥ÀÌÅ͸¦ º¸³»°í, ¾øÀ¸¸é µ¥ÀÌÅÍ ¿äûÇÑ´Ù. /* ¿î¿µÅø·Î â°í °Çµé ½Ã ¹®Á¦ »ý±æ ¼ö ÀÖÀ½.. if(lpTempCharacter->IsSetData(CTempCharacter::CHAR_DATA_SET)) { CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher(); if (NULL != lpDispatch) { GameClientSendPacket::SendCharBGServerMileageChange(lpDispatch->GetSendStream(), dwCID, cGroup, PktBGServerMileageChange::MC_INFO, lpTempCharacter->GetStoreInfo().Gold, lpCharacter->GetMileage(), PktBase::NO_SERVER_ERR); } } else*/ { if(SendGetCharData(lpTempCharacter->GetUID(), lpTempCharacter->GetCID(), lpTempCharacter->GetCharacterName(), dwCID, cGroup)) { lpTempCharacter->AddDataRequestCount(); } } } else if(DBComponent::AuthDB::GetUIDFromBattleUID( CDBSingleObject::GetInstance(), lpCharacter->GetUID(), &dwTempUID)) { // ij¸¯ÅÍ ½½·Ô Á¤º¸°¡ ¾øÀ¸¹Ç·Î, Á¤¼·¿¡ ij¸¯ÅÍ ½½·Ô µ¥ÀÌÅÍ ¿äû. DETLOG4(g_Log, "UID:%10u/CID:%10u/Á¤¼· UID¾ò¾î¿À±â ¼º°ø : Á¤¼· UID:%10u/Group:%d", lpCharacter->GetUID(), dwCID, dwTempUID, cGroup); CSendStream& SendStream = lpDispatch->GetSendStream(); char* lpBuffer = SendStream.GetBuffer(sizeof(PktBGServerCharSlot)); if (NULL != lpBuffer) { PktBGServerCharSlot* lpCharSlot = reinterpret_cast(lpBuffer); lpCharSlot->m_dwCID = dwCID; lpCharSlot->m_dwUID = dwTempUID; lpCharSlot->m_cGroup = cGroup; return SendStream.WrapHeader(sizeof(PktBGServerCharSlot), CmdBGServerCharSlot, 0, 0); } } else { ERRLOG3(g_Log, "UID:%10u/CID:%10u/Á¤¼· UID¾ò¾î¿À±â ½ÇÆÐ : %s", lpCharacter->GetUID(), dwCID, CDBSingleObject::GetInstance().GetErrorString()); } return false; } bool RegularAgentPacketParse::SendGetCharData(unsigned long dwUID, unsigned long dwSlotCID, const char* szSlotName, unsigned long dwCID, unsigned char cGroup) { GET_MULTI_DISPATCH(lpDispatch, cGroup, CRegularAgentDispatch, CRegularAgentDispatch::GetDispatchTable()); if (NULL == lpDispatch) { ERRLOG2(g_Log, "CID:0x%08x ±×·ì:%d ¿¬°á¼¼¼Ç ±¸ÇÏ±â ½ÇÆÐ", dwCID, cGroup); return false; } CSendStream& SendStream = lpDispatch->GetSendStream(); char* lpBuffer = SendStream.GetBuffer(sizeof(PktAdminToolGetData)); if (NULL != lpBuffer) { PktAdminToolGetData* lpGetData = reinterpret_cast(lpBuffer); lpGetData->m_cType = PktAdminToolGetData::GET_CHAR_DATA; lpGetData->m_dwUID = dwUID; lpGetData->m_dwCID = dwSlotCID; strncpy(lpGetData->m_szName, szSlotName, CHAR_INFOST::MAX_NAME_LEN); // Á¤¼·ÀÇ Á¤º¸¸¦ ¿äûÇÑ Ä³¸¯ÅÍÀÇ ¾ÆÀ̵𸦠º¸°üÇØµÓ´Ï´Ù. lpGetData->m_dwRequestKey = dwCID; if(SendStream.WrapHeader(sizeof(PktAdminToolGetData), CmdAdminToolGetData, 0, 0)) { return true; } } return false; } bool RegularAgentPacketParse::SendSetCharData(unsigned long dwCID, unsigned long dwMileage, unsigned char cGroup) { CTempCharacter* lpTempCharacter = CRegularAgentDispatch::GetTempCharacterMgr().GetCharacter(dwCID, cGroup); CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(dwCID); if (NULL != lpTempCharacter && NULL != lpCharacter && lpTempCharacter->IsSetData(CTempCharacter::CHAR_DATA_SET)) { /* // Test : ȯÀü¼Ò »ç¿ë Á¦ÇÑ if (10000002 != lpCharacter->GetUID() && 10000012 != lpCharacter->GetUID() && 10000006 != lpCharacter->GetUID() && 10000015 != lpCharacter->GetUID() && 10000310 != lpCharacter->GetUID() && 10000027 != lpCharacter->GetUID() && 10001591 != lpCharacter->GetUID() && 10000020 != lpCharacter->GetUID() && 10000601 != lpCharacter->GetUID() && 10000013 != lpCharacter->GetUID()) { return true; } */ CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher(); if(!(lpTempCharacter->GetStoreInfo().Flag & PktDepositUpdateDB::USED_DEPOSIT)) { // â°í¸¦ »ç¿ëÇÑ ÀûÀÌ ¾ø´Ù! ERRLOG2(g_Log, "CID:0x%08x/DataRequestCount:0x%08x/â°í¸¦ »ç¿ëÇÑ ÀûÀÌ ¾ø¾î¼­ µ¥ÀÌÅ͸¦ ¾÷µ¥ÀÌÆ®ÇÒ ¼ö ¾ø½À´Ï´Ù.", dwCID, lpTempCharacter->GetStoreInfo().Flag); if (NULL != lpDispatch) { GameClientSendPacket::SendCharBGServerMileageChange(lpDispatch->GetSendStream(), dwCID, cGroup, PktBGServerMileageChange::MC_RESULT, 0, lpCharacter->GetMileage(), PktBGServerMileageChange::NOT_USED_STORE); } return true; } if(0 != lpTempCharacter->GetDataRequestCount()) { ERRLOG2(g_Log, "CID:0x%08x/DataRequestCount:%u/µ¥ÀÌÅ͸¦ ¾÷µ¥ÀÌÆ® ÇÒ ¼ö ¾ø½À´Ï´Ù. µ¥ÀÌÅÍ ¿äûÁßÀÔ´Ï´Ù.", dwCID, lpTempCharacter->GetDataRequestCount()); if (NULL != lpDispatch) { GameClientSendPacket::SendCharBGServerMileageChange(lpDispatch->GetSendStream(), dwCID, cGroup, PktBGServerMileageChange::MC_RESULT, 0, lpCharacter->GetMileage(), PktBGServerMileageChange::DATA_REQUESTING); } return true; } unsigned char cGroup = lpTempCharacter->GetGroup(); GET_MULTI_DISPATCH(lpAgentDispatch, cGroup, CRegularAgentDispatch, CRegularAgentDispatch::GetDispatchTable()); if (NULL == lpAgentDispatch) { ERRLOG2(g_Log, "CID:0x%08x ±×·ì:%d ¿¬°á¼¼¼Ç ±¸ÇÏ±â ½ÇÆÐ", dwCID, cGroup); if (NULL != lpDispatch) { GameClientSendPacket::SendCharBGServerMileageChange(lpDispatch->GetSendStream(), dwCID, cGroup, PktBGServerMileageChange::MC_RESULT, 0, lpCharacter->GetMileage(), PktBGServerMileageChange::SERVER_ERROR); } return true; } if (lpCharacter->GetMileage() < dwMileage) { ERRLOG1(g_Log, "CID:0x%08x °øÇå ¸Þ´ÞÀÌ ÃæºÐÇÏÁö ¾Ê½À´Ï´Ù.", dwCID); if (NULL != lpDispatch) { GameClientSendPacket::SendCharBGServerMileageChange(lpDispatch->GetSendStream(), dwCID, cGroup, PktBGServerMileageChange::MC_RESULT, 0, lpCharacter->GetMileage(), PktBGServerMileageChange::NOT_ENOUGH_MEDAL); } return true; } unsigned long dwAddGold = dwMileage * 10; unsigned long dwSrcGold = lpTempCharacter->GetStoreInfo().Gold; if(ULONG_MAX - dwAddGold < dwSrcGold) { // µ· ¿À¹öÇÃ·Î¿ì ¹ß»ý if (NULL != lpDispatch) { GameClientSendPacket::SendCharBGServerMileageChange(lpDispatch->GetSendStream(), dwCID, cGroup, PktBGServerMileageChange::MC_RESULT, 0, lpCharacter->GetMileage(), PktBGServerMileageChange::MONEY_OVERFLOW); } return true; } unsigned long dwDstGold = dwSrcGold + dwAddGold; GAMELOG::LogTakeGold(*lpCharacter, dwSrcGold, dwDstGold, dwAddGold, TakeType::TS_DEPOSIT, TakeType::TS_DEPOSIT, GAMELOG::sTakeGoldLogV2::BATTLE_DEPOSIT, 0); lpCharacter->SetMileage(lpCharacter->GetMileage() - dwMileage); lpTempCharacter->GetStoreInfo().Gold = dwDstGold; CSendStream& SendStream = lpAgentDispatch->GetSendStream(); PktAdminToolSetData baseData; memset(&baseData, 0, sizeof(PktAdminToolSetData)); baseData.m_dwSerial = Item::CItemFactory::GetInstance().GetItemUID(); baseData.m_dwUID = lpTempCharacter->GetUID(); baseData.m_dwCID = lpTempCharacter->GetCID(); baseData.m_dwRequestKey = dwCID; // ------------------------------------------------------------------------------------------------- // OPEN_UPDATE_DATA char* lpOpenBuffer = SendStream.GetBuffer(sizeof(PktAdminToolSetData)); if (NULL != lpOpenBuffer) { PktAdminToolSetData* lpOpenSetData = reinterpret_cast(lpOpenBuffer); *lpOpenSetData = baseData; lpOpenSetData->m_cType = PktAdminToolSetData::OPEN_UPDATE_DATA; SendStream.WrapHeader(sizeof(PktAdminToolSetData), CmdAdminToolSetData, 0, PktBase::NO_SERVER_ERR); } // ------------------------------------------------------------------------------------------------- // CHAR_EXTRA_DATA unsigned short usBufferSize = sizeof(PktAdminToolSetData) + sizeof(CHAR_INFOEX) + sizeof(QUEST) + sizeof(HISTORY) + sizeof(CONFIG) + sizeof(STORE_INFO); char* lpExtraBuffer = SendStream.GetBuffer(usBufferSize); if (NULL != lpExtraBuffer) { PktAdminToolSetData* lpExtraSetData = reinterpret_cast(lpExtraBuffer); char* In_DataBuffer = reinterpret_cast(lpExtraSetData + 1); CopyMemory(In_DataBuffer, &lpTempCharacter->GetCharInfoEx(), sizeof(CHAR_INFOEX)); In_DataBuffer += sizeof(CHAR_INFOEX); CopyMemory(In_DataBuffer, &lpTempCharacter->GetQuest(), sizeof(QUEST)); In_DataBuffer += sizeof(QUEST); CopyMemory(In_DataBuffer, &lpTempCharacter->GetHistory(), sizeof(HISTORY)); In_DataBuffer += sizeof(HISTORY); CopyMemory(In_DataBuffer, &lpTempCharacter->GetConfig(), sizeof(CONFIG)); In_DataBuffer += sizeof(CONFIG); *reinterpret_cast(In_DataBuffer) = lpTempCharacter->GetStoreInfo(); *lpExtraSetData = baseData; lpExtraSetData->m_cType = PktAdminToolSetData::CHAR_EXTRA_DATA; SendStream.WrapHeader(usBufferSize, CmdAdminToolSetData, 0, PktBase::NO_SERVER_ERR); } // ------------------------------------------------------------------------------------------------- // FINISH_UPDATE_DATA char* lpFinishBuffer = SendStream.GetBuffer(sizeof(PktAdminToolSetData)); if (NULL != lpFinishBuffer) { PktAdminToolSetData* lpFinishSetData = reinterpret_cast(lpFinishBuffer); *lpFinishSetData = baseData; lpFinishSetData->m_cType = PktAdminToolSetData::FINISH_UPDATE_DATA; SendStream.WrapHeader(sizeof(PktAdminToolSetData), CmdAdminToolSetData, 0, PktBase::NO_SERVER_ERR); } //-------------------------------------------------------------------------------------------------- if (NULL != lpDispatch) { DETLOG10(g_Log, "UID:%10u/CID:%10u/Á¤¼·UID:%10u/Á¤¼·CID:%10u/Group:%d/" "ÀÔ±ÝÀü:%10u/ÀÔ±ÝÈÄ:%10u/ÀԱݾ×:%10u/»ç¿ë¸¶Àϸ®Áö:%10u/ÇöÀ縶Àϸ®Áö:%10u/" "Á¤¼·¿¡ µ·À» ¾÷µ¥ÀÌÆ®Çß½À´Ï´Ù.", lpCharacter->GetUID(), lpCharacter->GetCID(), baseData.m_dwUID, baseData.m_dwCID, cGroup, dwSrcGold, dwDstGold, dwAddGold, dwMileage, lpCharacter->GetMileage()); GameClientSendPacket::SendCharBGServerMileageChange(lpDispatch->GetSendStream(), dwCID, cGroup, PktBGServerMileageChange::MC_RESULT, lpTempCharacter->GetStoreInfo().Gold, lpCharacter->GetMileage(), PktBase::NO_SERVER_ERR); } } return true; }