#include "stdafx.h" #include "Handler_FromMasterServer.h" #include "PacketHandler.Shared.h" #include #include // GUILD #include #include #include // // // #define ADD_HANDLER_INFO_EOR() { MAKEWORD(0, 0), PHASE_NOACTION, (PH_fnHandler)NULL } #define ADD_HANDLER_INFO( c, p, accptablePHASE ) \ { MAKEWORD(c, p), accptablePHASE, (PH_fnHandler)&Handler_FromMasterServer::On##p } sPACKET_HANDLER_INFO* Handler_FromMasterServer::GetHandlerInfo() { static sPACKET_HANDLER_INFO s_pHandlerInfo[] = { // ADD_HANDLER_INFO( MZ_CONNECTION, MZ_SERVER_INFO_CMD, PHASE_UNLIMITED ), ADD_HANDLER_INFO( SERVERCOMMON, SERVERCOMMON_SERVERSHUTDOWN_REQ, PHASE_UNLIMITED ), //HANDLER_MASTER( MZ_CONNECTION, MZ_CONNECTION_REQ_SERVER_INFO_DBR, PHASE_UNLIMITED ), #ifdef __WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__ ADD_HANDLER_INFO( MZ_CONNECTION, MZ_CONNECTION_DISCONNECT_CMD, PHASE_UNLIMITED ), ADD_HANDLER_INFO( MZ_CONNECTION, MZ_CONNECTION_PHASE_SHIFT_CMD, PHASE_UNLIMITED ), ADD_HANDLER_INFO( MZ_CONNECTION, MZ_CONNECTION_BLOCK_CMD, PHASE_UNLIMITED ), ADD_HANDLER_INFO( SERVERCOMMON, SERVERCOMMON_DATA_TRANSFER_PLZ_GIVEME_DATA_ACK, PHASE_UNLIMITED ), ADD_HANDLER_INFO( SERVERCOMMON, SERVERCOMMON_DATA_TRANSFER_PLZ_GIVEME_DATA_NAK, PHASE_UNLIMITED ), ADD_HANDLER_INFO( SERVERCOMMON, SERVERCOMMON_DATA_TRANSFER_SENDDATA_CMD, PHASE_UNLIMITED ), #endif // //__NA001254_20090109_RTTG_FUNC_ADD ADD_HANDLER_INFO( MZ_GUILD, MZ_GUILD_NAME_CHANGE_SYN, PHASE_UNLIMITED ), // ADD_HANDLER_INFO_EOR(), }; return s_pHandlerInfo; }; VOID Handler_FromMasterServer::RegisterHandler_ALL( PACKET_HANDLER_DELEGATOR pInstance ) { pInstance->RegisterHandler_( GetHandlerInfo() ); pInstance->RegisterHandler_( PacketHandlerShared::GetHandlerInfo() ); } Handler_FromMasterServer_IMPL( MZ_SERVER_INFO_CMD ) { // ¼­¹ö Á¤º¸ ¹Þ¾Ò´Ù~ MSG_MZ_SERVER_INFO_CMD *pRecvMsg = (MSG_MZ_SERVER_INFO_CMD*)pMsg; GuildServer* pGuildServer = GuildServer::GetMainFrame(); pGuildServer->SetGuid( pRecvMsg->m_dwServerGUID ); pGuildServer->SetKey( pRecvMsg->ServerKey ); ASSERT( pRecvMsg->m_wDBProxyServerPort != 0 && " DBProxy Æ÷Æ®°¡ 0ÀÔ´Ï´Ù.MZ_SERVER_INFO_CMD ¿À·ù!" ); ASSERT( pRecvMsg->m_wWorldServerPort != 0 && " World Æ÷Æ®°¡ 0ÀÔ´Ï´Ù.MZ_SERVER_INFO_CMD ¿À·ù!" ); GuildServer::sConnectSession& rCONNECTION = pGuildServer->ConnectSessions; if( !rCONNECTION.SessionDBProxy() ) pGuildServer->InitConnectSession( GAME_DBPROXY, pRecvMsg->m_szDBProxyServerIP, pRecvMsg->m_wDBProxyServerPort ); if( !rCONNECTION.SessionWorld() ) pGuildServer->InitConnectSession( WORLD_SERVER, pRecvMsg->m_szWorldServerIP, pRecvMsg->m_wWorldServerPort ); DebugOut("¸¶½ºÅͷκÎÅÍ ¹ÞÀº ¼­¹öŰ ¼ÂÆÃ(%d) (%d, %d, %d, %d)", pRecvMsg->ServerKey, pRecvMsg->ServerKey.GetWorldID(), pRecvMsg->ServerKey.GetChannelID(), pRecvMsg->ServerKey.GetServerType(), pRecvMsg->ServerKey.GetServerID() ); pGuildServer->UpdateAppTitle(); #ifndef __WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__ pGuildServer->ConnectTo( GAME_DBPROXY ); pGuildServer->ConnectTo( WORLD_SERVER ); pGuildServer->SetListenIP_s( pRecvMsg->m_szGuildServerInnerIP ); pGuildServer->SetListenPort_s( pRecvMsg->m_wGuildServerServerInnerPort ); pGuildServer->Listen( SERVER_IOHANDLER ); #else //__WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__ pGuildServer->SetListenIP_s( pRecvMsg->m_szGuildServerInnerIP ); pGuildServer->SetListenPort_s( pRecvMsg->m_wGuildServerServerInnerPort ); #endif //__WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__ } Handler_FromMasterServer_IMPL( SERVERCOMMON_SERVERSHUTDOWN_REQ ) { //Á¾·áÇÒ°Å´Ù!! MSG_SERVERCOMMON_SERVERSHUTDOWN_ANS sendMsg; sendMsg.m_byCategory = SERVERCOMMON; sendMsg.m_byProtocol = SERVERCOMMON_SERVERSHUTDOWN_ANS; // ÀÌ°É ÁØ ³ðÀÌ ¸¶½ºÅÍ´Ï±î ¹Ù·Î ¸®ÅÏ pServerSession->SendPacket( &sendMsg, sizeof(sendMsg) ); DebugOut( "ServerShutdown Packet Recv."); GuildServer::GetMainFrame()->Shutdown(); // Á¾·á! DebugOut( "Server Shutdown Start..." ); } #ifdef __WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__ Handler_FromMasterServer_IMPL( MZ_CONNECTION_DISCONNECT_CMD ) { printf( "RECEIVED [MZ_CONNECTION_DISCONNECT_CMD]\n" ); } Handler_FromMasterServer_IMPL( MZ_CONNECTION_PHASE_SHIFT_CMD ) { MSG_MZ_CONNECTION_PHASE_SHIFT_CMD* pCMD = (MSG_MZ_CONNECTION_PHASE_SHIFT_CMD*)pMsg; ePHASE_SHIFT ePhase = (ePHASE_SHIFT)pCMD->m_dwPHASE_SHIFT; GuildServer* pGuildServer = GuildServer::GetMainFrame(); ePhase = (ePHASE_SHIFT)(ePhase&PHASE_UNLIMITED); // BLOCK CMDÀÏ ¼ö ÀÖ´Ù. ePHASE_SHIFT prevPhase = pGuildServer->GetPhaseStatus(); switch( ePhase ) { case PHASE_UNKNOWN: // ÀÎÁõ ´Ü°è¸¦ ´Ù½Ã °ÅÄ¡¶ó´Â ÀÇ¹Ì break; case PHASE_EXCHANGE: { if( PHASE_EXCHANGE == prevPhase ) return; pGuildServer->SetPhaseStatus( ePhase ); if( PHASE_SERVICE == prevPhase ) { // ´Ù½Ã EXCHANGE»óÅ·ΠÀüȯµÇ¾ú´Ù´Â °ÍÀº ¼­¹ö ¿¬°á »óÀÇ ¹®Á¦ ¶§¹®¿¡ Á¦¾àÀ»... // PHASE_SERVICE -> PHASE_EXCHANGE // À̰ÍÀº PROCESS_CONNECTION_PHASE_SHIFT_CMD___ON_START_EXCHANGE°¡ Á¸ÀçÇÑ´Ù´Â ÀÇ¹Ì // µ¥ÀÌÅ͸¦ ´Ù½Ã ¹Þ¾Æ¾ß ÇÏ´ÂÁö µîµîÀ» NOTIFY_SIGNAL·Î ÇØ°áÇØ º¸ÀÚ. eSCRIPT_DATA_CMD cmd = SCRIPT_DATA_CMD::SET | SCRIPT_DATA_CMD::RANGE::ONENODE | SCRIPT_DATA_CMD::STATUS::MOVE2EMPTYDATA; ScriptDataManager::DataStatusCommand( cmd, SCRIPT_NOTIFY_SIGNAL ); } else { // // PHASE_UNKNOWN -> PHASE_EXCHANGE // // ¼­ºñ½º·ÎÀÇ ÀüȯÀ̹ǷΠÆÄÀÏ Àü¼Ûµîµî, ¿©·¯°¡ÁöÀÇ SolarAuth°ü·Ã ¼­ºñ½º¸¦ // ¹ÞÀ» ¼ö ÀÖ´Ù. ¶Ç´Â ÁÖ¾îÁø CMD¿¡ ´ëÇÑ Ã³¸®¸¦ ¼öÇàÇÒ ¼ö ÀÖ´Ù. // À̰÷¿¡¼­ WorkLoad¼³Á¤ÇÏ¸é µÈ´Ù. // ÀÌ°Í ÀÌ¿ÜÀÇ »óÅÂÀÏ °æ¿ì´Â °ü·Ã WorkLoad Á¦°ÅÇÏÀÚ. ¾Æ´Ï¸é Á¦°ÅµÇµµ·Ï ±¸¼ºÇÑ´Ù. // // ±âÁ¸¿¡ Á¾·áµÇÁö ¾Ê´Â ÀÛ¾÷ÀÌ ÀÖÀ» ¼ö ÀÖ´Ù. À̸¦ ¾î¶»°Ô ÇØ°áÇÒ °ÍÀΰ¡? //if( WorkLoadManager::c_NotExistKey == // pServerSession->GetWorkLoadContainer().FindWorkKey( scriptCode ) ) PROCESS_CONNECTION_PHASE_SHIFT_CMD___ON_START_EXCHANGE* pWorkNode = new PROCESS_CONNECTION_PHASE_SHIFT_CMD___ON_START_EXCHANGE(); pWorkNode->SetInformation( pServerSession, pServerSession->GetSyncKey(), (DWORD)PHASE_EXCHANGE ); WORK_KEY workKey = WorkLoadManager::RegisterTask( pWorkNode ); if( WorkLoadManager::c_NotExistKey != workKey ) { pServerSession->GetWorkLoadContainer().RegisterWork( workKey, (DWORD)(__int64)pWorkNode ); return; } } } break; case PHASE_SERVICE: { if( PHASE_UNKNOWN == prevPhase ) { ASSERT( !"À߸øµÈ Á¦¾î »óÅ´٠ȮÀÎÇÒ °Í" ); return; } else if( PHASE_SERVICE == prevPhase ) { ASSERT( !"À߸øµÈ Á¦¾î »óÅ´٠ȮÀÎÇÒ °Í - ¹º°¡ Âø°¢ÇÑ °Í ¾Æ´Ñ°¡?" ); return; } pGuildServer->SetPhaseStatus( ePhase ); pGuildServer->ConnectTo( GAME_DBPROXY ); pGuildServer->ConnectTo( WORLD_SERVER ); pGuildServer->Listen( SERVER_IOHANDLER ); } break; }; //printf( "RECEIVED {AM_CONNECTION_PHASE_SHIFT_CMD} SEND {MSG_AM_DATA_TRANSFER_PLZ_GIVEME_DATA_SYN}\n" ); } Handler_FromMasterServer_IMPL( MZ_CONNECTION_BLOCK_CMD ) { } Handler_FromMasterServer_IMPL( SERVERCOMMON_DATA_TRANSFER_PLZ_GIVEME_DATA_ACK ) { } Handler_FromMasterServer_IMPL( SERVERCOMMON_DATA_TRANSFER_PLZ_GIVEME_DATA_NAK ) { } Handler_FromMasterServer_IMPL( SERVERCOMMON_DATA_TRANSFER_SENDDATA_CMD ) { //printf( "RECEIVED {_DATA_TRANSFER_SENDDATA_CMD} " ); MSG_SERVERCOMMON_DATA_TRANSFER_SENDDATA_CMD* pMsgCMD = (MSG_SERVERCOMMON_DATA_TRANSFER_SENDDATA_CMD*)pMsg; switch( (DWORD)pMsgCMD->m_wControlCmd ) { case MSG_SERVERCOMMON_DATA_TRANSFER_SENDDATA_CMD::TRANS_CMD_SEND_HEADER: { DWORD dwDataType = (DWORD)pMsgCMD->m_FILE_INFO.m_wDataType; DWORD dwBufferSize = (DWORD)pMsgCMD->m_FILE_INFO.m_dwBufferSize; // // ÇØ´ç 󸮴 ÇöÀç µ¥ÀÌÅÍ ·ÎµùÀ» ¿äûÇÑ ÀÌÈÄ¿¡ ´ëÇÑ Ã¹¹øÂ° ÀÀ´ä¿¡ ´ëÇÑ ¹ÝÀÀÀÌ´Ù. // <1> ÇØ´ç ½ºÅ©¸³Æ® Äڵ尡 ¿Ã¹Ù¸¥ Áö °Ë»ç -> F : NAK // <2> T : ÇØ´ç ½ºÅ©¸³Æ® Äڵ忡 ¹öÆÛ¸¦ ÇÒ´çÇÑ´Ù. // DataStreamCommand (SET blah~ // <3> ±âŸ ŸÀӾƿôµîµîÀÇ º¸¾ÈÁ¤Ã¥À» °­±¸ÇÒ °Í //printf( "\n\tHEADER {Data Type=%u, Buffer Size = %u\n", dwDataType, dwBufferSize ); BYTE* pSTREAM; eSCRIPT_DATA_CMD cmdSTREAM = SCRIPT_DATA_CMD::SET | SCRIPT_DATA_CMD::BUFFERINFO::BUFFER_SIZE; ScriptDataManager::DataStreamCommand( cmdSTREAM, (eSCRIPT_CODE)dwDataType, pSTREAM, dwBufferSize ); eSCRIPT_DATA_CMD cmdSTATUS = SCRIPT_DATA_CMD::SET | SCRIPT_DATA_CMD::RANGE::ONENODE | SCRIPT_DATA_CMD::STATUS::MOVE2LOADING; ScriptDataManager::DataStatusCommand( cmdSTATUS, (eSCRIPT_CODE)dwDataType ); } break; case MSG_SERVERCOMMON_DATA_TRANSFER_SENDDATA_CMD::TRANS_CMD_SEND_DATA: { DWORD dwDataType = (DWORD)pMsgCMD->m_TOKEN_INFO.m_Header.m_wDataType; DWORD dwTokenNo = (DWORD)pMsgCMD->m_TOKEN_INFO.m_Header.m_wTokenNo; DWORD dwBufferSize = (DWORD)pMsgCMD->m_TOKEN_INFO.m_Header.m_wBufferSize; // // ÇØ´ç 󸮴 ÇöÀç µ¥ÀÌÅÍ ·ÎµùÀ» ¿äû¿¡ ´ëÇÑ ÀÀ´äÀ» ó¸®Çϸç, ½ÇÀç µ¥ÀÌÅͰ¡ ÀÔ·ÂµÇ¾î ¿Â´Ù. // Á¾°áÀÚ°¡ ¿Ã¶§±îÁö ÇØ´ç ÅäÅ«¿¡ ÇØ´çÇÏ´Â À§Ä¡¿¡ // (ÇØ´ç ½ºÅ©¸³¿¡ ÇÒ´çµÈ ¹öÆÛ¸¦ ¾ò¾î¼­ ±× À§Ä¡¿¡) µ¥ÀÌÅ͸¦ º¹»çÇØ °£´Ù. // DataStreamCommand (SET blah~ ScriptDataManager::SaveDataStreamToken( (eSCRIPT_CODE)dwDataType, dwTokenNo, dwBufferSize, pMsgCMD->m_TOKEN_INFO.m_pSTREAM ); //if( SCRIPT_CODE_KEY(FIELD) == dwDataType ) //{ // //printf( "\n\tDATA {Data Type=%u, Token no = %u, Buffer Size = %u\n", dwDataType, dwTokenNo, dwBufferSize ); // printf( (CHAR*)pMsgCMD->m_TOKEN_INFO.m_pSTREAM ); // printf( "\n\nDELIM %u\n\n", pMsgCMD->m_TOKEN_INFO.m_pSTREAM[dwBufferSize-1] ); //} //printf( "\n\tDATA {Data Type=%u, Token no = %u, Buffer Size = %u\n", dwDataType, dwTokenNo, dwBufferSize ); } break; case MSG_SERVERCOMMON_DATA_TRANSFER_SENDDATA_CMD::TRANS_CMD_SEND_CLOSURE: // À̰ÍÀ¸·Î Á¾·áÇϵµ·Ï ¼öÇàÇÏÀÚ. // ¿Ï·áµÇ¸é, ÇØ´ç ½ºÅ©¸³Æ® µ¥ÀÌÅÍ ¿Ï·á Äݹé(³»ºÎ ¿¬»ê ¸ñÀû)À» ¼öÇàÇÑ´Ù. //AsyncReloadData { DWORD dwDataType = (DWORD)pMsgCMD->m_FILE_CLOSURE.m_wDataType; DWORD dwCRC = (DWORD)pMsgCMD->m_FILE_CLOSURE.m_dwCRC; printf( "SCRIPT %u\t RECEIVED\n", dwDataType ); eSCRIPT_DATA_CMD cmdSTATUS = SCRIPT_DATA_CMD::SET | SCRIPT_DATA_CMD::RANGE::ONENODE | SCRIPT_DATA_CMD::STATUS::MOVE2LOADED; ScriptDataManager::DataStatusCommand( cmdSTATUS, (eSCRIPT_CODE)dwDataType/*, dwCRC*/ ); ScriptDataManager::ProcessLoadedData( (eSCRIPT_CODE)dwDataType ); } break; }; } #endif //__WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__ //{__NA001254_20090109_RTTG_FUNC_ADD Handler_FromMasterServer_IMPL( MZ_GUILD_NAME_CHANGE_SYN ) { ////////////////////////////////////////////////////////////////////////// // FlowControl flow; FLOWCONTROL_START() { MSG_MZ_GUILD_NAME_CHANGE_SYN* pRecvMsg = (MSG_MZ_GUILD_NAME_CHANGE_SYN*)pMsg; GuildServer* pGuildServer = GuildServer::GetMainFrame(); MSG_DZ_GUILD_NAME_CHANGE_SYN msg; msg.m_dwKey = pRecvMsg->m_dwKey; msg.m_TargetPos = INVALID_POSTYPE_VALUE; msg.m_OperCharGuid = 0;//INVALID_CHARGUID; msg.m_GuildGuid = pRecvMsg->m_GuildGuid; msg.m_dwSessionIndex = pServerSession->GetSessionIndex(); memcpy( msg.m_tszGuildName, pRecvMsg->m_tszGuildName, MAX_GUILDNAME_LENGTH*sizeof(TCHAR) ); msg.m_tszGuildName[MAX_GUILDNAME_LENGTH] = '\0'; IfFailThenBreak(pGuildServer->ConnectSessions.SendToDBProxy(&msg, sizeof(msg)), RC::RC_GUILD_DISCONNECTED_DBP_SERVER); SUNLOG(eDEV_LOG, "[MZ_GUILD_NAME_CHANGE_SYN] ±æµå¸í º¯°æ ½Åû 󸮵Ê.[%d] [%s]", pRecvMsg->m_GuildGuid, pRecvMsg->m_tszGuildName ); return /*RETURN TRUE VALUE*/; } FLOWCONTROL_END; ////////////////////////////////////////////////////////////////////////// // const DWORD errCode = flow.GetErrorCode(); assert( SAFE_NUMERIC_TYPECAST( DWORD, errCode, BYTE ) ); MSG_MZ_GUILD_NAME_CHANGE_SYN* pRecvMsg = (MSG_MZ_GUILD_NAME_CHANGE_SYN*)pMsg; MSG_MZ_GUILD_NAME_CHANGE_NAK NakMsg; NakMsg.m_dwKey = pRecvMsg->m_dwKey; NakMsg.m_byErrorCode = (BYTE)errCode; pServerSession->SendPacket(&NakMsg, sizeof(NakMsg)); } //}__NA001254_20090109_RTTG_FUNC_ADD