#include "StdAfx.h" #include ".\handler_masterserver.h" #include ".\PortalServer.h" #include #include Handler_MasterServer_IMPL(MP_CONNECTION_SERVER_INFO_CMD) { MSG_MP_CONNECTION_SERVER_INFO_CMD *pRecvMsg = (MSG_MP_CONNECTION_SERVER_INFO_CMD*)pMsg; g_PortalServer.SetGuid( pRecvMsg->m_dwServerGUID ); g_PortalServer.SetKey( pRecvMsg->m_ServerKey ); // ¹ÞÀº ¼­¹öŰ ¼ÂÆÃ DISPMSG("Received From Master..ServerKey : (%d) (%d, %d, %d, %d)\n", pRecvMsg->m_ServerKey, pRecvMsg->m_ServerKey.GetWorldID(), pRecvMsg->m_ServerKey.GetChannelID(), pRecvMsg->m_ServerKey.GetServerType(), pRecvMsg->m_ServerKey.GetServerID() ); g_PortalServer.UpdateAppTitle(); ASSERT( pRecvMsg->m_wDBProxyServerPort != 0 && " DBProxy Æ÷Æ®°¡ 0ÀÔ´Ï´Ù.¿À·ù!" ); ASSERT( pRecvMsg->m_wPortalServerInnerPort != 0 && " Portal Æ÷Æ®°¡ 0ÀÔ´Ï´Ù.¿À·ù!" ); g_PortalServer.SetListenIP_s( pRecvMsg->m_szPortalServerInnerIP ); g_PortalServer.SetListenPort_s( pRecvMsg->m_wPortalServerInnerPort ); if( !g_PortalServer.GetSession( GAME_DBPROXY ) ) g_PortalServer.InitConnectSession( GAME_DBPROXY, pRecvMsg->m_szDBProxyServerIP, pRecvMsg->m_wDBProxyServerPort ); #ifndef __WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__ // Game DB proxy¿Í ¿¬°á ½Ãµµ g_PortalServer.ConnectTo( GAME_DBPROXY ); #else //__WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__ if( g_PortalServer.IsServerInfoFromFile() ) { // Game DB proxy¿Í ¿¬°á ½Ãµµ g_PortalServer.ConnectTo( GAME_DBPROXY ); } #endif //__WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__ } Handler_MasterServer_IMPL(SERVERCOMMON_SERVERSHUTDOWN_REQ) { MSG_SERVERCOMMON_SERVERSHUTDOWN_ANS msgANS; msgANS.m_byCategory = SERVERCOMMON; msgANS.m_byProtocol = SERVERCOMMON_SERVERSHUTDOWN_ANS; pServerSession->SendPacket( &msgANS, sizeof(msgANS) ); g_PortalServer.Shutdown(); } #ifdef __WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__ Handler_MasterServer_IMPL( MP_CONNECTION_DISCONNECT_CMD ) { printf( "RECEIVED [MP_CONNECTION_DISCONNECT_CMD]\n" ); } Handler_MasterServer_IMPL( MP_CONNECTION_PHASE_SHIFT_CMD ) { MSG_MP_CONNECTION_PHASE_SHIFT_CMD* pCMD = (MSG_MP_CONNECTION_PHASE_SHIFT_CMD*)pMsg; ePHASE_SHIFT ePhase = (ePHASE_SHIFT)pCMD->m_dwPHASE_SHIFT; ePhase = (ePHASE_SHIFT)(ePhase&PHASE_UNLIMITED); // BLOCK CMDÀÏ ¼ö ÀÖ´Ù. ePHASE_SHIFT prevPhase = g_PortalServer.GetPhaseStatus(); switch( ePhase ) { case PHASE_UNKNOWN: // ÀÎÁõ ´Ü°è¸¦ ´Ù½Ã °ÅÄ¡¶ó´Â ÀÇ¹Ì break; case PHASE_EXCHANGE: { if( PHASE_EXCHANGE == prevPhase ) return; g_PortalServer.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(); ServerSessionEx* pServerEx = (ServerSessionEx*)pServerSession; pWorkNode->SetInformation( pServerEx, pServerEx->GetSyncKey(), (DWORD)PHASE_EXCHANGE ); WORK_KEY workKey = WorkLoadManager::RegisterTask( pWorkNode ); if( WorkLoadManager::c_NotExistKey != workKey ) { pServerEx->GetWorkLoadContainer().RegisterWork( workKey, (DWORD)(__int64)pWorkNode ); return; } } } break; case PHASE_SERVICE: { if( PHASE_UNKNOWN == prevPhase ) { ASSERT( !"À߸øµÈ Á¦¾î »óÅ´٠ȮÀÎÇÒ °Í" ); return; } else if( PHASE_SERVICE == prevPhase ) { ASSERT( !"À߸øµÈ Á¦¾î »óÅ´٠ȮÀÎÇÒ °Í - ¹º°¡ Âø°¢ÇÑ °Í ¾Æ´Ñ°¡?" ); return; } g_PortalServer.SetPhaseStatus( ePhase ); g_PortalServer.ConnectTo( GAME_DBPROXY ); g_PortalServer.Listen( SERVER_IOHANDLER ); } break; }; //printf( "RECEIVED {AM_CONNECTION_PHASE_SHIFT_CMD} SEND {MSG_AM_DATA_TRANSFER_PLZ_GIVEME_DATA_SYN}\n" ); } Handler_MasterServer_IMPL( MP_CONNECTION_BLOCK_CMD ) { } Handler_MasterServer_IMPL( SERVERCOMMON_DATA_TRANSFER_PLZ_GIVEME_DATA_ACK ) { } Handler_MasterServer_IMPL( SERVERCOMMON_DATA_TRANSFER_PLZ_GIVEME_DATA_NAK ) { } Handler_MasterServer_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__