Files
git 9cb257e7ae Add GameClients drops and keep current 1602 source work.
CN1602 is the local client. KR is the official tree with unpacked Data, System, and Sound. Packed .wpk files stay off git.
2026-08-30 23:24:31 +03:00

475 lines
16 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "stdafx.h"
#include <Version.h>
#include <ServerBuildVersion.h>
#include <IOCPServer.h>
#include <NetworkObject.h>
#include <PacketControl/PacketControl.h>
//=========================================================================================================
// MasterServer Include Files
//
#include "MasterServerEx.h"
#include "Sessions/ServerSessionEx.h"
#include "Sessions/ServerSessionManager.h"
#include "PacketHandler/PacketHandler.h"
#include "Function/ServerInfoManager.h"
#include "Function/AbuseUserManager.h"
#include <WorkLoad/WorkLoadManager.h>
//
#include <WorkLoad/MasterServer.WorkLoad.cxx>
#include "MasterScriptParserManager.h"
//
//=========================================================================================================
MasterServerEx::MasterServerEx()
{
SetPhaseStatus(PHASE_UNKNOWN);
is_service_mode_ = FALSE;
ConnectSessions.Init();
// (CHANGES)(20100311)(hukim) RestrictManager(), GetMasterServerInfo() ????? ??? ??????
// ??????? ???? ??????? ????? ??????. ??????? ??? ??????? ???? ???????? ???
//RestrictManager().Clear();
//GetMasterServerInfo().Init( this );
restrict_manager_.Clear();
master_server_info_.Init(this);
auth_process_work_load_key_ = 0;
master_script_parser_manager_ = NULL;
}
MasterServerEx::~MasterServerEx()
{
// ServerFrame???? ???? ????? Session???? ?????? ?????... ??????
SetPhaseStatus(PHASE_UNKNOWN);
is_service_mode_ = FALSE;
ConnectSessions.Init();
// (CHANGES)(20100311)(hukim) RestrictManager() ????? ??? ?????? ??????? ???? ???????
// ????? ??????. ??????? ??? ??????? ???? ???????? ???
//RestrictManager().Clear();
restrict_manager_.Clear();
auth_process_work_load_key_ = 0;
}
BOOL MasterServerEx::Init()
{
nsPacket::Environment::Init();
InitializeLogger();
MessageOut(eCRITICAL_LOG, _T("*** Master Server Start ***"));
MessageOut(eCRITICAL_LOG, _T("*** Master Server Version = %d ***"), SERVER_RELEASE_BUILD_NO);
// (????/???)??? ???? ????? ??.
__READ_CONFIG_NUMBER(is_service_mode_, _T("COMMON"), _T("SERVICE_MODE"), 0, MASTER_SERVER_INFO_FILE_NAME);
WorkLoadManager::CreateInstance();
PacketHandler::RegisterHandler();
ServerInfoManager::CreateInstance();
ServerSessionManager::CreateInstance();
InitializeDataLoad();
ReloadFromFile_RestrictFunction();
// ??? ???? ??? ?岡? ????(?????? 10??)
ReloadFromFile_StatisticsInterval();
ReloadFromFile_LogicViolationControl();
AbuseUserManager::Instance()->Init();
#ifdef _JP_0_20101123_PMS
SERVER_KEY key = GetKey();
key.Set(0,0,GetServerType(),0);
SetKey(key);
#endif
return TRUE;
}
VOID MasterServerEx::Release()
{
WorkLoadManager::DestroyInstance();
AbuseUserManager::Instance()->Release();
AbuseUserManager::DestroyInstance();
PacketHandler::ReleaseHandler();
if (master_script_parser_manager_ != NULL)
{
master_script_parser_manager_->Release();
master_script_parser_manager_->DestroyInstanceEx();
SAFE_DELETE( master_script_parser_manager_);
}
MessageOut(eCRITICAL_LOG, _T("*** MasterServer Close *** "));
SAFE_DELETE(g_pSunLog);
}
VOID MasterServerEx::Finalize()
{
ServerSessionManager::DestroyInstance();
ServerInfoManager::DestroyInstance();
}
BOOL MasterServerEx::Update( DWORD /*tick*/ )
{
// <2> Server Session ????
WorkLoadManager::Update();
AbuseUserManager::Instance()->Update();
// SunLog Update ????? ????????? ?丟? ???? ???? ??????? ?????? ??.
g_pSunLog->Update();
g_pSecureCollectLog->Update();
// (CHANGES)(20100311)(hukim) GetMasterServerInfo() ????? ??? ?????? ??????? ???? ???????
// ????? ??????. ??????? ??? ??????? ???? ???????? ???
//MasterServerInfo& master_server_info = GetMasterServerInfo();
//master_server_info.Update();
master_server_info_.Update();
return TRUE;
}
VOID MasterServerEx::StartListen()
{
#ifdef __WAVERIX_SERVER_AUTHENTICATION_BY_SOLARAUTH__
do
{
PROCESS_SERVER_AUTHENTICATION* server_auth_work = new PROCESS_SERVER_AUTHENTICATION();
const WORK_KEY server_auth_work_key = WorkLoadManager::RegisterTask(server_auth_work);
if (server_auth_work_key == WorkLoadManager::c_NotExistKey)
{
MessageOut(eCRITICAL_LOG, _T("Can't Register Server Authentication Routine"));
return;
}
auth_process_work_load_key_ = server_auth_work_key;
} while(0);
#endif //__WAVERIX_SERVER_AUTHENTICATION_BY_SOLARAUTH__
// DB Proxy?? ????? ?豕? Listen ?????
Listen(SERVER_IOHANDLER);
// // Account DB pxory ?????? DB ?????? ???? ???? ?????? ???? ???? ??????? ???
// SERVER_KEY serverKey = ServerInfoManager::Instance()->GetServerKey( ACCOUNT_DBPROXY, (char*)m_pAccountDBProxySession->GetConnectIP().c_str() );
// if( !ServerSessionManager::Instance()->FindServer( serverKey ) )
// {
// // ???? ?????? ??????? ??? ??? ?? ??????? ???? ??????? ???? ?豕? ???
// m_pAccountDBProxySession->SetServerKey( serverKey );
// ServerSessionManager::Instance()->AddServer( m_pAccountDBProxySession );
// }
//
// // Op Server ?????? DB ?????? ???? ???? ?????? ???? ???? ??????? ???
// SERVER_KEY opServerKey = ServerInfoManager::Instance()->GetServerKey( OP_SERVER, (char*)m_pOpServerSession->GetConnectIP().c_str() );
// if( !ServerSessionManager::Instance()->FindServer( opServerKey ) )
// {
// // Op Server?? ?????? ?????? ??? ???!
// if( m_pOpServerSession->IsConnected() )
// {
// m_pOpServerSession->SetServerKey( opServerKey );
// ServerSessionManager::Instance()->AddServer( m_pOpServerSession );
// }
// }
//
//#ifdef __WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__
// // Solar Auth Server ?????? DB ?????? ???? ???? ?????? ???? ???? ??????? ???
// SERVER_KEY solarAuthServerKey = ServerInfoManager::Instance()->GetServerKey( SOLARAUTH_SERVER, (char*)m_pSolarAuthServerSession->GetConnectIP().c_str() );
// if( !ServerSessionManager::Instance()->FindServer( solarAuthServerKey ) )
// {
// // ???? ?????? ??????? ??? ??? ?? ??????? ???? ??????? ???? ?豕? ???
// m_pSolarAuthServerSession->SetServerKey( solarAuthServerKey );
// ServerSessionManager::Instance()->AddServer( m_pSolarAuthServerSession );
// }
//#endif
}
ServerSession* MasterServerEx::AllocServerSession(eSERVER_TYPE server_type)
{
ServerSessionEx* server_session =
static_cast<ServerSessionEx*>(MasterServerEx::Handler_AllocServerSession_NoInit(server_type));
if (server_session != NULL)
{
(static_cast<ServerSession*>(server_session))->Init(this);
}
return static_cast<ServerSession*>(server_session);
}
VOID MasterServerEx::FreeServerSession(ServerSession* server_session)
{
// SolarAuth?? ????? ???? ?????? Release?? ??????? ????. ???? ?????? ????? ?? ??.
MasterServerEx::Handler_FreeServerSession(server_session);
}
#include "PacketHandler\Handler_MO.h"
BOOL MasterServerEx::KeyEvent(CHAR pressed_key)
{
switch(pressed_key)
{
case 'A':
{
AbuseUserManager::Instance()->DisplayAbuseInfo();
}
break;
case 'U':
{
AccountDBProxySession* adbp_server = ConnectSessions.SessionAccountDB();
if ((adbp_server != NULL) && adbp_server->IsConnected())
{
MSG_MX_CONNECTION_REQ_SERVER_INFO_SYN msg;
msg.m_byCategory = MX_CONNECTION;
msg.m_byProtocol = MX_CONNECTION_REQ_SERVER_INFO_SYN;
adbp_server->Send(reinterpret_cast<BYTE*>(&msg), sizeof(MSG_MX_CONNECTION_REQ_SERVER_INFO_SYN));
MessageOut(eCRITICAL_LOG, _T("Requesting server information..."));
}
else
{
MessageOut(eCRITICAL_LOG, _T("Account Database Proxy is not connected."));
}
}
break;
case 'S':
break;
case 'R':
{
ReloadFromFile_RestrictFunction();
if (!IsRestrictFuncFromFile())
{
// (CHANGES)(20100311)(hukim) GetMasterServerInfo() ????? ??? ?????? ??????? ???? ???????
// ????? ??????. ??????? ??? ??????? ???? ???????? ???
//GetMasterServerInfo().SendMX_FUNCRESTRICT_RELOAD_REQ(this);
master_server_info_.SendMX_FUNCRESTRICT_RELOAD_REQ(this);
}
ReloadFromFile_LogicViolationControl();
}
break;
case 'X':
{
#ifdef _DEBUG
BYTE world_id = 0;
BYTE channel_id = 0xFF;
BYTE server_type = 0;
BYTE server_id = 0;
SERVER_KEY server_exit_key(world_id, channel_id, server_type, server_id);
EXIT_SERVER_MAP* agent_server_list = NULL;
EXIT_SERVER_MAP* dbp_server_list = NULL;
EXIT_SERVER_MAP* server_list = NULL;
// (CHANGES)(20100311)(hukim) GetMasterServerInfo() ????? ??? ?????? ??????? ???? ???????
// ????? ??????. ??????? ??? ??????? ???? ???????? ???
//MasterServerInfo& master_server_info = this->GetMasterServerInfo();
//BOOL is_success = master_server_info.MakeServerExitList(server_exit_key,
// agent_server_list,
// dbp_server_list,
// server_list);
BOOL is_success = master_server_info_.MakeServerExitList(server_exit_key,
agent_server_list,
dbp_server_list,
server_list);
if (is_success)
{
is_success = master_server_info_.RegisterServerExitProcess(agent_server_list,
dbp_server_list,
server_list);
if (is_success)
{
//???? ????? ??????????(???/???/???????->DB??????) ???????? ????, ???? ???? ???? ????? ?????? ???
MessageOut(
eCRITICAL_LOG,
_T("???? ???? ???????? ????[W:%u/C:%u/T:%u/I:%u] - ?????? ???? ???伊????? ???? ???? ?????? ?????? ??????."),
server_exit_key.GetWorldID(),
server_exit_key.GetChannelID(),
server_exit_key.GetServerType(),
server_exit_key.GetServerID());
return TRUE;
}
}
#else
DISPMSG(_T("??????????????????\n"));
#endif
}
break;
//__NA001254_20090109_RTTG_FUNC_ADD
case 'T':
{
Handler_MO::SendTest();
}
}
return TRUE;
}
//============================================================================================================
// Logger Initializer
//
BOOL MasterServerEx::InitializeLogger()
{
// (CHANGES)(20100311)(hukim) sun_log_file_path ??? ????? ??? 見?? ???? ???? ?㊣伐闖 ???
// ??????? ???? ?????? ???? ??? ????
BYTE sun_log_option = 0;
BYTE sun_log_file_level = 0;
CHAR sun_log_file_path[MAX_PATH];
__READ_CONFIG_NUMBER(sun_log_option, _T("LOGFILE"), _T("SUN_LOGFILE_OPTION"), 0,
MASTER_SERVER_INFO_FILE_NAME);
__READ_CONFIG_NUMBER(sun_log_file_level, _T("LOGFILE"), _T("SUN_LOGFILE_LEVEL"), 0,
MASTER_SERVER_INFO_FILE_NAME);
__READ_CONFIG_STRING(sun_log_file_path, _T("LOGFILE"), _T("SUN_LOGFILE_PATH"), NULL,
MASTER_SERVER_INFO_FILE_NAME);
DISPMSG("Initializing SUNLOG.Master...\t");
g_pSunLog = new CSunLog;
BOOL is_success = g_pSunLog->Init(sun_log_option, sun_log_file_level, sun_log_file_path, _T("Master"));
if (is_success)
{
DISP_OK;
}
else
{
DISP_FAIL;
}
DISPMSG("Initializing SUNLOG.Secure...\t");
g_pSecureCollectLog = new CSunLog;
is_success = g_pSecureCollectLog->Init(sun_log_option, sun_log_file_level, sun_log_file_path, _T("Secure"));
if (is_success)
{
DISP_OK;
}
else
{
DISP_FAIL;
}
return is_success;
}
VOID MasterServerEx::InitializeDataLoad()
{
master_script_parser_manager_ = new MasterScriptParserManager;
master_script_parser_manager_->InitParserPool(NULL);
master_script_parser_manager_->RegisterParser();
#ifndef __WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__
master_script_parser_manager_->Load();
#endif
}
VOID MasterServerEx::StartDataService(){
MessageOut(eCRITICAL_LOG, _T("Data load complete.\n"));
#ifdef __WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__
MasterServerEx::GetMainFrame()->GetParserManager()->Load();
// ????? ??? ???????? PHASE_SHIFT_CMD :: PHASE_EXCHANGE ?????? ??????.
// ????? ???????? ?????? ????? ?????.
// ???? ??? <060802>
ServerSessionManager::SEND_PHASE_SHIFT_CMD_BROADCAST( PHASE_EXCHANGE, PHASE_SERVICE );
// ???? ???? ???, PHASE_SERVICE ???? ??? ???? ????????? PHASE_EXCHANGE??
// ?????? ?????? ????? ?? ?????. ??????, ??? ???? ???? ?????? Control Flag????
// ?眇????? ??? SERVICE ?? ?????? ????.
// ??????? ??????? ?眇????? ???? ????? ???? ??? ???﹉? ?? ???, ?? ??致 ??????
// ?? ?????.
// ???? ?????? ??????? ?????, ???? PHASE_EXCHANGE ?????? ???? ??????? ??? ?? ?????.
// ??? ?????? ?? ???, Field, Battle, DB ????? ??? PHASE_SERVICE ?? ??????.
// Agent, World ???? Front ?譈 ??? ??? ????????? ???????? ??? ???
// ??? PHASE_SERVICE?? ????????. <- ???? ???? ??? ??, ??????? ??????? ????? ??.
#endif //__WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__
}
BOOL MasterServerEx::ReloadFromFile_RestrictFunction()
{
__READ_CONFIG_NUMBER(is_restrict_from_file_, _T("FUNCTIONALRESTRICT"),
_T("GETRESTRICTINFO_FROMFILE"), 0, MASTER_SERVER_INFO_FILE_NAME);
if (is_restrict_from_file_)
{
// (CHANGES)(20100311)(hukim) RestrictManager(), GetMasterServerInfo() ????? ??? ??????
// ??????? ???? ??????? ????? ??????. ??????? ??? ??????? ???? ???????? ???
//sRESTRICT_MGR::MakePacket::Read_FUNCRESTRICT_FROM_FILE(&RestrictManager(), TRUE);
//GetMasterServerInfo().SendGM_OPERATION_FUNCRESTRICT_CMD(this);
sRESTRICT_MGR::MakePacket::Read_FUNCRESTRICT_FROM_FILE(&restrict_manager_, TRUE);
master_server_info_.SendGM_OPERATION_FUNCRESTRICT_CMD(this);
MessageOut(eCRITICAL_LOG, _T("Reload FuncRestrict from DB & Broadcast GameServers"));
}
return TRUE;
}
BOOL MasterServerEx::ReloadFromFile_StatisticsInterval()
{
__READ_CONFIG_NUMBER(statistics_interval_, _T("INTERVAL"), _T("STATISTICS"), 10000,
MASTER_SERVER_INFO_FILE_NAME );
//GetMasterServerInfo().GetMoneyTimer()->SetTimer( statistics_interval_ );
// (CHANGES)(20100311)(hukim) GetMasterServerInfo() ????? ??? ?????? ??????? ???? ???????
// ????? ??????. ??????? ??? ??????? ???? ???????? ???
//GetMasterServerInfo().StartTimerProcess(statistics_interval_);
master_server_info_.StartTimerProcess(statistics_interval_);
return TRUE;
}
BOOL MasterServerEx::ReloadFromFile_LogicViolationControl()
{
// (CHANGES)(20100311)(hukim) GetLogicViolationControl() ????? ??? ?????? ??????? ???? ???????
// ????? ??????. ??????? ??? ??????? ???? ???????? ???
//LOGIC_VIOLATION_CONTOL_FLAGS& controller = GetLogicViolationControl();
//controller.ClearAll();
logic_violation_control_.ClearAll();
BOOL is_forced_disconnect_control;
__READ_CONFIG_NUMBER(is_forced_disconnect_control, _T("LOGIC_VIOLATION_CONTROL"),
_T("FORCED_DISCONNECT"), 0, MASTER_SERVER_INFO_FILE_NAME);
MessageOut(eCRITICAL_LOG, _T("Reload logic-violation control"));
if (is_forced_disconnect_control)
{
logic_violation_control_.Set(eLOGIC_VIOLATION_FIELD_INFO::FORCED_DISCONNECT_CONTROL);
}
return TRUE;
}
//==================================================================================================
//==================================================================================================
//==================================================================================================