#include "stdafx.h" ////////////////////////////////////////////////////////////////////////// #include "AgentServer.Timer.WorkLoad.h" #include #include #include #include #include #include #include // _NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND #include #ifdef _NA_006088_20120910_CHAOS_ZONE_FREE_PVP #include #endif // _NA_006088_20120910_CHAOS_ZONE_FREE_PVP #ifdef _NA_006620_20130402_GM_BATTLE_GROUND_EVENT_GAME #include #endif // _NA_006620_20130402_GM_BATTLE_GROUND_EVENT_GAME #ifdef _NA_008543_20151027_ONE_DAYS_GUILD_MISSION #include #endif //(_NA_008543_20151027_ONE_DAYS_GUILD_MISSION) #ifdef _NA_20100802_SPEED_HACK_DETECTION namespace ns_functor { ; struct CheckTickSpeed : public ns_functor::IUserForeachFunctor { virtual bool operator()(User* const user) { DWORD tick_count = GetTickCount(); TickSpeedChecker& checker = user->GetTickSpeedChecker(); if (checker.IsEnabled() && checker.TryActivate(tick_count)) { checker.Update(); } return true; } }; }; //end of namespace #endif BOOL PROCESS_AGENTSERVER_PERIODIC_WORKLOAD::DoInit() { Complete() = FALSE; m_Interval4Update.SetTimer(UPDATE_INTERVAL); m_IntervalUserManager.SetTimer(UPDATE_INTERVAL_USER_MANAGER); m_IntervalRemoveNoActionTempUser.SetTimer(UPDATE_INTERVAL_REMOVE_NOACTION_TEMPUSER); m_IntervalCCUReport.SetTimer(UPDATE_INTERVAL_CCU_REPORT); #ifdef __NA001334_090420_SERVER_SELECT_FACILITY__ m_IntervalServerSelect.SetTimer(UPDATE_INTERVAL_SERVER_SELECT_PROC); #endif m_IntervalS2SUserCount.SetTimer(UPDATE_INTERVAL_S2S_USERCOUNT_NTF); m_IntervalUnExpectedClosingUser.SetTimer(UPDATE_INTERVAL_UNEXPECTED_CLOSING_USER); m_PortalUpdateTimer.SetTimer(20 * SECOND); #ifdef _NA_20100802_SPEED_HACK_DETECTION m_IntervalTickSpeedCheck.SetTimer(UPDATE_INTERVAL_TICK_SPEED_CHECKER); #endif #ifdef _NA_007750_20141113_WZDAT_MODIFY_LOG m_IntervalWzdatLog.SetTimer(UPDATE_INTERVAL_WZDAT_LOG); #endif // _NA_007750_20141113_WZDAT_MODIFY_LOG #ifdef _NA_000000_20131129_ADD_KISS_API //KISS Agent¿ÍÀÇ IPC¸¦ °³¼³ UINT result_error=0; result_error = kiss_wrapper.Open(); if (result_error != ERROR_SUCCESS ) { SUNLOG(eCRITICAL_LOG, _T("|[%s]|KISS Agent Connect Fail![error_code: %d]|"), __FUNCTION__, result_error); } #endif //_NA_000000_20131129_ADD_KISS_API return TRUE; } BOOL PROCESS_AGENTSERVER_PERIODIC_WORKLOAD::DoProcess() { if(!m_Interval4Update.IsExpired()) return TRUE; const DWORD current_tick = GetTickCount(); __TOUCHED(current_tick); AgentServer* const pAgentServer = AgentServer::GetInstance(); UserManager& rUserManager = *UserManager::Instance(); if(m_IntervalUserManager.IsExpired()) rUserManager.GarbageCollector(); if(m_IntervalRemoveNoActionTempUser.IsExpired()) rUserManager.TempUserClosureTimeout(); #ifdef _NA_20100802_SPEED_HACK_DETECTION if (m_IntervalTickSpeedCheck.IsExpired()) { if (TickSpeedChecker::IsGloballyEnabled()) { // Àü¿ª Ȱ¼ºÈ­ ¿©ºÎ ¸ÕÀú °Ë»ç ns_functor::CheckTickSpeed checker; rUserManager.Foreach(&checker); } } #endif ////////////////////////////////////////////////////////////////////////// // ´ÙÀ½ ±¸°£Àº UserManager¿¡¼­ ¼­ºñ½º ÁßÀÎ À¯ÀúµéÀ» Àϰý ó¸®ÇÏ´Â ºÎºÐ // UserManager::Process BOOLEAN bCCUReport = !!m_IntervalCCUReport.IsExpired(); #ifdef __NA001334_090420_SERVER_SELECT_FACILITY__ BOOLEAN bServerSelectProcess = !!m_IntervalServerSelect.IsExpired(); #else BOOLEAN bServerSelectProcess = FALSE; #endif if(bCCUReport || bServerSelectProcess) { MSG_AM_CONNECTION_CCU_REPORT_NTF msg; // for Reporting rUserManager.Process(bCCUReport, bServerSelectProcess, &msg); // (WAVERIX) (090521) (BUG-FIX) µ¿Á¢º¸°í»ó ¹®Á¦ ¼öÁ¤ if(bCCUReport) { pAgentServer->SendToMasterServer(&msg, sizeof(msg)); #ifdef _NA_000000_20131129_ADD_KISS_API //KISS Agent¿¡ µ¿Á¢Á¤º¸¸¦ Àü¼Û if (kiss_wrapper.IsOpened() && (pAgentServer->GetMode() == eSERVER_LIVE || pAgentServer->GetMode() == eSERVER_TESTLIVE)) { SendCCU_To_KISS(CalculateTotalCCU(&msg), static_cast(pAgentServer->GetListenPort_s())); } #endif //_NA_000000_20131129_ADD_KISS_API #ifdef _NA_007750_20141113_WZDAT_MODIFY_LOG if (m_IntervalWzdatLog.IsExpired()) { SERVER_KEY rKey(pAgentServer->GetKey()); TCHAR tszAddInfo[MAX_ADDINFO_SIZE + 1] = { 0, }; _snprintf(tszAddInfo, MAX_ADDINFO_SIZE, "ChannelID:%u,NumberOfUsers:%f", rKey.GetChannelID(), CalculateTotalCCU(&msg)); GAMELOG->LogWzDat(SESSION_CHANNEL_INFO, tszAddInfo); } #endif // _NA_007750_20141113_WZDAT_MODIFY_LOG } } // ////////////////////////////////////////////////////////////////////////// if(m_IntervalS2SUserCount.IsExpired()) { MSG_GA_AUTH_USER_COUNT_NTF msg; msg.m_wUserCount = (WORD)rUserManager.GetNumberOfUsers(); pAgentServer->SendToAuthAgentServer((BYTE*)&msg, sizeof(msg)); } if(m_IntervalUnExpectedClosingUser.IsExpired()) { AgentPartyManager::Instance()->Update(); } if(m_PortalUpdateTimer.IsExpired()) PortalManager::Update(); //_NA_20110630_BATTLE_ZONE_RENEWAL AgentPartyManager::Instance()->DoStartToWaitingRoom(); #ifdef _NA_008679_20160202_REWORK_BATTLEGROUND #else //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND BattleGroundManager::Instance()->Update(); #endif //_NA_008679_20160202_REWORK_BATTLEGROUND #ifdef _NA_006088_20120910_CHAOS_ZONE_FREE_PVP FreePVPManager::Instance()->Update(); #endif // _NA_006088_20120910_CHAOS_ZONE_FREE_PVP #ifdef _NA_006620_20130402_GM_BATTLE_GROUND_EVENT_GAME TeamBattleGroundManager::Instance()->Update(); #endif // _NA_006620_20130402_GM_BATTLE_GROUND_EVENT_GAME #ifdef _NA_008543_20151027_ONE_DAYS_GUILD_MISSION OneDaysGuildMissionManager::Instance()->Update(); #endif //(_NA_008543_20151027_ONE_DAYS_GUILD_MISSION) return TRUE; } BOOL PROCESS_AGENTSERVER_PERIODIC_WORKLOAD::IsComplete() { return m_bComplete; } BOOL PROCESS_AGENTSERVER_PERIODIC_WORKLOAD::DoRelease() { #ifdef _NA_000000_20131129_ADD_KISS_API //KISS Agent¿ÍÀÇ IPC°³¼³À» Á¾·á if (kiss_wrapper.IsOpened() ) { kiss_wrapper.Close(); } #endif //_NA_000000_20131129_ADD_KISS_API return TRUE; } VOID PROCESS_AGENTSERVER_PERIODIC_WORKLOAD::OnMsg(sSIG_MSG* pSIG_MSG) { __UNUSED(pSIG_MSG); } VOID PROCESS_AGENTSERVER_PERIODIC_WORKLOAD::_Process_CCU_Reporting() { } FLOAT PROCESS_AGENTSERVER_PERIODIC_WORKLOAD::CalculateTotalCCU( const MSG_AM_CONNECTION_CCU_REPORT_NTF* ccu_msg ) { DWORD dwCCU = ccu_msg->dwVillageCount; dwCCU += ccu_msg->dwVillageCountPC; dwCCU += ccu_msg->dwBattleZoneCount; dwCCU += ccu_msg->dwBattleZoneCountPC; #ifdef _CHANNELING_AUTH_FLOW_HANGAME_USER_ dwCCU += ccu_msg->numberOfInVillageHangame; // Village | Default | Hangame dwCCU += ccu_msg->numberOfInVillageHangamePC; // Village | PC | Hangame dwCCU += ccu_msg->numberOfInBattleZoneHangame; // BattleZone | Default | Hangame dwCCU += ccu_msg->numberOfInBattleZoneHangamePC; // BattleZone | PC | Hangame #endif //_CHANNELING_AUTH_FLOW_HANGAME_USER_ #ifdef __NA000000_090911_NEOWIZ_USER_CCU_REPORT__ dwCCU += ccu_msg->numberOfInVillageNeowiz; // Village | Default | Neowiz dwCCU += ccu_msg->numberOfInVillageNeowizPC; // Village | PC | Neowiz dwCCU += ccu_msg->numberOfInBattleZoneNeowiz; // BattleZone | Default | Neowiz dwCCU += ccu_msg->numberOfInBattleZoneNeowizPC; // BattleZone | PC | Neowiz #endif return static_cast(dwCCU); } #ifdef _NA_000000_20131129_ADD_KISS_API VOID PROCESS_AGENTSERVER_PERIODIC_WORKLOAD::SendCCU_To_KISS( const float server_ccu, const DWORD agentserver_listenport ) { NOTIFY_INFO_NUM infoNum; int activity_id = 1005; DWORD kiss_port = agentserver_listenport; InitNotifyInfoNumber(&infoNum, activity_id, server_ccu, 0, 0, kiss_port); if (ERROR_SUCCESS != kiss_wrapper.NotifyNumber(&infoNum)) { SUNLOG(eCRITICAL_LOG, _T("|[%s]|KISS Error! Notify Number|"), __FUNCTION__); } } #endif //_NA_000000_20131129_ADD_KISS_API