Files
Sun1602/Server/AgentServer/Function/AgentServer.Timer.WorkLoad.cpp
2022-10-26 12:25:11 +08:00

251 lines
8.4 KiB
C++

#include "stdafx.h"
//////////////////////////////////////////////////////////////////////////
#include "AgentServer.Timer.WorkLoad.h"
#include <PacketStruct_AM.h>
#include <AgentServer.h>
#include <UserSessions/UserManager.h>
#include <Zone/ZoneManager.h>
#include <Zone/PortalManager.h>
#include <AgentParty/AgentPartyManager.h>
#include <SunAuth/AuthProtocol_GA.h>
// _NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
#include <ChaosZoneSystem/BattleGroundManager.h>
#ifdef _NA_006088_20120910_CHAOS_ZONE_FREE_PVP
#include <ChaosZoneSystem/FreePVPManager.h>
#endif // _NA_006088_20120910_CHAOS_ZONE_FREE_PVP
#ifdef _NA_006620_20130402_GM_BATTLE_GROUND_EVENT_GAME
#include <ChaosZoneSystem/TeamBattleGroundManager.h>
#endif // _NA_006620_20130402_GM_BATTLE_GROUND_EVENT_GAME
#ifdef _NA_008543_20151027_ONE_DAYS_GUILD_MISSION
#include <ChaosZoneSystem/OneDaysGuildMissionManager.h>
#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<DWORD>(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<FLOAT>(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