#include "stdafx.h" #include "Statistics.h" #include #include #include VOID GameStatistics::SendPacket_SumMoneyCirculation( MSG_MO_RTTG_USERMONEY_ANS* pMsgANS ) { MasterServerEx* pMasterServer = MasterServerEx::GetMainFrame(); OpServerSession* pOpServer = pMasterServer->ConnectSessions.SessionOpServer(); if( !(pOpServer && pOpServer->IsConnected()) ) { MessageOut( eCRITICAL_LOG, _T("RTTA ÅëÈ­·® º¸°í ºÒ°¡´É:No OpServer") ); return; } ServerTreeNODE* pServerTREE = ServerSessionManager::GetServerTree(); ServerTreeNODE::WORLD_LIST* pWorldList = pServerTREE->GetWorldList(); DWORD dwWorldCount = (DWORD)pWorldList->size(); const DWORD cdwBitMask = (DWORD)((1<size(); for( DWORD j=0 ; jCirculateMoney = 0; pMsgANS->ui64TotalUserMoney = 0; pMsgANS->ui64TotalGetMoney = 0; pMsgANS->ui64TotalLoseMoney = 0; pMsgANS->ui64WarehouseAveMoney = 0; pMsgANS->ui64WarehousePlusMoney = 0; pMsgANS->ui64WarehouseMinusMoney = 0; pMsgANS->JackpotMoney = 0; pMsgANS->usJackpotCnt = 0; DWORD dwInc = 0; ServerTreeNODE::SERVER_NODE_LIST::iterator it = pNodeList->begin(); ServerTreeNODE::SERVER_NODE_LIST::iterator end = pNodeList->end(); for( ; it != end ; ++it ) { sSERVER_NODE* pNode = *it; if( pNode && ( (1<m_ServerType) & cdwBitMask ) ) { GameServerSession* pGameServer = (GameServerSession*)pNode->m_pServerSession; GameStatisticsData* pGameData = pGameServer->GetStatisticsData(); MakePacket_SumMoneyCirculation_GatheringInfo( pGameData, pMsgANS ); ++dwInc; } } if( dwInc ) { // ó¸®µÈ ä³Î¿¡ GameServerÁ¸ÀçÇßÀ¸¸ç, À̸¦ À§ÇØ Ã³¸®µÇ¾úÀ½. // ä³Î ´ç ÅëÈ­·® °è»ê ¿Ï·á ¹× º¸°í pMsgANS->byWorldID = (BYTE)i; pMsgANS->byChannelID = (BYTE)j; pMsgANS->byServerType = 0; pMsgANS->byServerID = 0; pOpServer->Send( (BYTE*)pMsgANS, sizeof(*pMsgANS) ); MessageOutEx( g_pSunLog, CSunLog::cMIDDLE_LOG, CSunLog::cOUTPUT_FILE, CSunLog::cCATE_DEFAULT, _T("ÅëÈ­·® Åë°è [W:%u][C:%u] - ÅëÈ­·®[%I64u] ÀèÆÌ[%I64u]"), i, j, pMsgANS->CirculateMoney, pMsgANS->JackpotMoney ); } #ifdef _DEBUG MessageOut( eFULL_LOG, "UserMoney Send[%u/%u][Get:%I64u][Lose:%I64u][User:%I64u]", pMsgANS->byWorldID, pMsgANS->byChannelID, pMsgANS->ui64TotalGetMoney, pMsgANS->ui64TotalLoseMoney, pMsgANS->ui64TotalUserMoney ); MessageOut( eFULL_LOG, "WareHouseMoney Send[%u/%u][Get:%I64u][Lose:%I64u][User:%I64u]", pMsgANS->byWorldID, pMsgANS->byChannelID, pMsgANS->ui64WarehousePlusMoney, pMsgANS->ui64WarehouseMinusMoney, pMsgANS->ui64WarehouseAveMoney ); MessageOut( eFULL_LOG, "JackpotMoney Send[%u/%u][Cnt:%u][Money:%I64u]", pMsgANS->byWorldID, pMsgANS->byChannelID, pMsgANS->usJackpotCnt, pMsgANS->JackpotMoney ); #endif } // for "channel" } // for "world" } VOID GameStatistics::MakePacket_SumMoneyCirculation_GatheringInfo( GameStatisticsData* pGameData, MSG_MO_RTTG_USERMONEY_ANS* pMsgANS ) { ULONGLONG ui64TempUserMoney; ui64TempUserMoney = pGameData->GetAveUserMoney(); pMsgANS->ui64TotalUserMoney = min( pMsgANS->ui64TotalUserMoney + ui64TempUserMoney, ULLONG_MAX ); ui64TempUserMoney = pGameData->GetAveWarehouseMoney(); pMsgANS->ui64WarehouseAveMoney = min( pMsgANS->ui64WarehouseAveMoney + ui64TempUserMoney, ULLONG_MAX ); // // ÇÊ¿äÇÑ Åë°è¸¸ ¼öÁý for( DWORD j = 0; j < eSTATISTIC_MAX; ++j ) { ui64TempUserMoney = pGameData->GetStatisticsType( (eSTATISTICS_TYPE)j ); switch( (eSTATISTICS_TYPE)j ) { case eSTATISTIC_MONEY_CIRCULATION: { pMsgANS->CirculateMoney = min( pMsgANS->CirculateMoney + ui64TempUserMoney, ULLONG_MAX ); pGameData->ClearStatistics( (eSTATISTICS_TYPE)j ); break; } case eSTATISTIC_MONEY_PLUS: { pMsgANS->ui64TotalGetMoney = min( pMsgANS->ui64TotalGetMoney + ui64TempUserMoney, ULLONG_MAX ); pGameData->ClearStatistics( (eSTATISTICS_TYPE)j ); break; } case eSTATISTIC_MONEY_MINUS: { pMsgANS->ui64TotalLoseMoney = min( pMsgANS->ui64TotalLoseMoney + ui64TempUserMoney, ULLONG_MAX ); pGameData->ClearStatistics( (eSTATISTICS_TYPE)j ); break; } case eSTATISTIC_MONEY_WAREHOUSE_PLUS: { pMsgANS->ui64WarehousePlusMoney = min( pMsgANS->ui64WarehousePlusMoney + ui64TempUserMoney, ULLONG_MAX ); pGameData->ClearStatistics( (eSTATISTICS_TYPE)j ); break; } case eSTATISTIC_MONEY_WAREHOUSE_MINUS: { pMsgANS->ui64WarehouseMinusMoney = min( pMsgANS->ui64WarehouseMinusMoney + ui64TempUserMoney, ULLONG_MAX ); pGameData->ClearStatistics( (eSTATISTICS_TYPE)j ); break; } case eSTATISTIC_JACKPOT_COUNT: { pMsgANS->usJackpotCnt = min( pMsgANS->usJackpotCnt + (USHORT)ui64TempUserMoney, USHRT_MAX ); pGameData->ClearStatistics( (eSTATISTICS_TYPE)j ); break; } case eSTATISTIC_JACKPOT_MONEY: { pMsgANS->JackpotMoney = min( pMsgANS->JackpotMoney + ui64TempUserMoney, ULLONG_MAX ); pGameData->ClearStatistics( (eSTATISTICS_TYPE)j ); break; } } // switch } // for // WOPS¿¡ °ª ³Ñ°ÜÁÖ±â À§ÇØ °è»êµÇ¾úÀ¸¹Ç·Î Áö±ÝÀÇ Á¤º¸ ÃʱâÈ­ pGameData->ClearMoney(); } VOID GameStatistics::SendPacket_StatisticsEtcInfo( MSG_MO_RTTG_GAMESTATISTICS_ANS* pMsgANS ) { MasterServerEx* pMasterServer = MasterServerEx::GetMainFrame(); OpServerSession* pOpServer = pMasterServer->ConnectSessions.SessionOpServer(); if( !(pOpServer && pOpServer->IsConnected()) ) { MessageOut( eCRITICAL_LOG, _T("RTTA ÅëÈ­·® º¸°í ºÒ°¡´É:No OpServer") ); return; } ServerTreeNODE* pServerTREE = ServerSessionManager::GetServerTree(); ServerTreeNODE::WORLD_LIST* pWorldList = pServerTREE->GetWorldList(); DWORD dwWorldCount = (DWORD)pWorldList->size(); const DWORD cdwBitMask = (DWORD)((1<size(); for( DWORD j=0 ; jui64Statitics, 0, sizeof(pMsgANS->ui64Statitics) ); DWORD dwInc = 0; ServerTreeNODE::SERVER_NODE_LIST::iterator it = pNodeList->begin(); ServerTreeNODE::SERVER_NODE_LIST::iterator end = pNodeList->end(); for( ; it != end ; ++it ) { sSERVER_NODE* pNode = *it; if( pNode && ( (1<m_ServerType) & cdwBitMask ) ) { GameServerSession* pGameServer = (GameServerSession*)pNode->m_pServerSession; GameStatisticsData* pGameData = pGameServer->GetStatisticsData(); MakePacket_StatisticsEtcInfo_GatheringInfo( pGameData, pMsgANS ); ++dwInc; } } if( dwInc ) { // ó¸®µÈ ä³Î¿¡ GameServerÁ¸ÀçÇßÀ¸¸ç, À̸¦ À§ÇØ Ã³¸®µÇ¾úÀ½. // ä³Î ´ç ÅëÈ­·® °è»ê ¿Ï·á ¹× º¸°í pMsgANS->byWorldID = (BYTE)i; pMsgANS->byChannelID = (BYTE)j; pMsgANS->byServerType = 0; pMsgANS->byServerID = 0; pOpServer->Send( (BYTE*)pMsgANS, sizeof(*pMsgANS) ); MessageOutEx( g_pSunLog, CSunLog::cMIDDLE_LOG, CSunLog::cOUTPUT_FILE, CSunLog::cCATE_DEFAULT, _T("±âŸ Åë°è [W:%u][C:%u] - "), i, j ); } #ifdef _DEBUG MessageOut( eFULL_LOG, "GameStatistics Send[%u/%u]", pMsgANS->byWorldID, pMsgANS->byChannelID ); #endif } // for "channel" } // for "world" } VOID GameStatistics::MakePacket_StatisticsEtcInfo_GatheringInfo( GameStatisticsData* pGameData, MSG_MO_RTTG_GAMESTATISTICS_ANS* pMsgANS ) { // ÇÊ¿äÇÑ Åë°è¸¸ ¼öÁý for( DWORD j = 0; j < eSTATISTIC_MAX; ++j ) { switch( (eSTATISTICS_TYPE)j ) { case eSTATISTIC_MONEY_CIRCULATION: case eSTATISTIC_MONEY_PLUS: case eSTATISTIC_MONEY_MINUS: case eSTATISTIC_MONEY_WAREHOUSE_PLUS: case eSTATISTIC_MONEY_WAREHOUSE_MINUS: case eSTATISTIC_JACKPOT_COUNT: case eSTATISTIC_JACKPOT_MONEY: { // ±âÁ¸ ÅëÈ­·® Á¤º¸¿¡ Æ÷ÇԵǴ °ªµéÀº ¶Ç ³ÖÀ» ÇÊ¿ä ¾ø´Ù break; } default: { ULONGLONG ui64Temp = pGameData->GetStatisticsType( (eSTATISTICS_TYPE)j ); pGameData->ClearStatistics( (eSTATISTICS_TYPE)j ); pMsgANS->ui64Statitics[j] = min( pMsgANS->ui64Statitics[j] + ui64Temp, ULLONG_MAX ); break; } } // switch } // for }