⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serverset.cpp

📁 墨香最新私服
💻 CPP
字号:
// ServerSet.cpp: implementation of the CServerSet class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ServerTool.h"
#include "ServerSet.h"
#include "..\[CC]Header\CommonGameFunc.h"
#include "..\[CC]ServerModule\ServerListManager.h"

#include "MHNetwork.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CServerSet::CServerSet()
{
	memset( m_sMASIP, 0, 16 );
	m_nMASPort = 0;

	memset( m_sServerInfoFileName, 0, 256 );
	memset( m_sClientExeVersion, 0, 256 );

	m_nServerSet = 0;
	memset( m_sServerSetName, 0, 256 );

	m_dwTotalUserCount = 0;
	m_nUserLevel = eUSERLEVEL_SUPERUSER;
	strcpy( m_sUserLevel, "SuperUser" );
	
	m_bInit = FALSE;
	
	m_dwMsgCheckTime = 0;

	m_dwMaxUser = 5000;
}

CServerSet::~CServerSet()
{	
	Release();
}

BOOL CServerSet::Init(int ServerSetNum,char* setName,char* setFileName)
{
	m_nServerSet = ServerSetNum;
	strcpy(m_sServerSetName,setName);
	return InitFromFile(setFileName);
}

BOOL CServerSet::InitFromFile(char* setFileName)
{
	char temp[256];
	strcpy( temp, GetDataDirectory() );
	strcat( temp, setFileName );
	SERVERLISTMGR->Load(temp);
	SERVERLISTMGR->SetPositionHead();
	SERVERINFO* pInfo;
	
	CServer* pServer;
	while(pInfo = SERVERLISTMGR->GetNextServerInfo())
	{
		pServer = new CServer(m_nServerSet,pInfo);

		if( pInfo->wServerKind == MONITOR_AGENT_SERVER )
		{
			strcpy(m_sMASIP,pInfo->szIPForUser);
			m_nMASPort = pInfo->wPortForUser;

			m_vecMSServer.push_back( pServer );
		}
		else if( pInfo->wServerKind == MONITOR_SERVER )
		{
			m_vecMSServer.push_back( pServer );
		}
		else
		{
			m_vecServer.push_back(pServer);
		}
	}

	m_bInit = TRUE;
	
	ReadClientExeVersion();
	CreateUserCountFile();	

	SERVERLISTMGR->Clear();

	return TRUE;
}

void CServerSet::Release()
{
	memset( m_sMASIP, 0, 16 );
	m_nMASPort = 0;

	memset( m_sServerInfoFileName, 0, 256 );
	memset( m_sClientExeVersion, 0, 256 );

	m_nServerSet = 0;
	memset( m_sServerSetName, 0, 256 );

	m_dwTotalUserCount = 0;
	m_nUserLevel = eUSERLEVEL_SUPERUSER;
	strcpy( m_sUserLevel, "SuperUser" );
	
	m_bInit = FALSE;

	m_dwMsgCheckTime = 0;

	m_dwMaxUser = 5000;

	vector<CServer*>::iterator iter = m_vecServer.begin();
	for(;iter != m_vecServer.end();++iter)
		delete (*iter);
	m_vecServer.clear();

	iter = m_vecMSServer.begin();
	for(;iter != m_vecMSServer.end();++iter)
		delete (*iter);
	m_vecMSServer.clear();
}

CServer* CServerSet::GetServer( WORD serverkind, WORD servernum )
{	
	vector<CServer*>::iterator iter = m_vecServer.begin();
	for(;iter != m_vecServer.end();++iter)
	{
		if( (*iter)->m_nServerKind == serverkind &&
			(*iter)->m_nServerNum == servernum )
			return (*iter);
	}

	return NULL;
}

CServer* CServerSet::GetServer( SERVERSTATE* pState )
{
	CServer* pServer = GetServer(pState->ServerType,pState->ServerNum);
	if(pServer == NULL)
		return NULL;

//	ASSERT(strcmp( pState->ServerIP, pServer->m_sIP ) == 0);
//	ASSERT(pState->ServerPort == pServer->m_nPort);

	return pServer;
}

void CServerSet::SetUserLevel( int userlevel )
{
	m_nUserLevel = userlevel;

	switch( userlevel )
	{
	case eUSERLEVEL_GOD:		strcpy( m_sUserLevel, "God");			break;
	case eUSERLEVEL_PROGRAMMER:	strcpy( m_sUserLevel, "Programmer");	break;
	case eUSERLEVEL_DEVELOPER:	strcpy( m_sUserLevel, "Developer");		break;
	case eUSERLEVEL_GM:			strcpy( m_sUserLevel, "GM");			break;
	case eUSERLEVEL_SUPERUSER:	strcpy( m_sUserLevel, "SuperUser");		break;
	case eUSERLEVEL_USER:		strcpy( m_sUserLevel, "User");			break;
	case eUSERLEVEL_SUBUSER:	strcpy( m_sUserLevel, "SubUser");		break;
	}	
}

void CServerSet::ReadClientExeVersion()
{
	char temp[256];
	strcpy( temp, GetDataDirectory() );
	strcat( temp, m_sServerSetName );
	strcat( temp, "_ClientExeVersion.ver" );
	
	FILE* fp = fopen( temp, "r" );
	if( fp )
	{
		fscanf( fp, "%s", temp );
		fclose( fp );
		strcpy( m_sClientExeVersion, temp );
		return;
	}

	strcpy( m_sClientExeVersion, "None!!" );
}

void CServerSet::WriteClientExeVersion( char* version )
{
	if( m_bInit )
	{
		strcpy( m_sClientExeVersion, version );

		char temp[256];
		strcpy( temp, GetDataDirectory() );		
		strcat( temp, m_sServerSetName );
		strcat( temp, "_ClientExeVersion.ver" );

		FILE* fp = fopen( temp, "w" );
		if( fp )
		{
			fwrite( version, strlen(version), 1, fp );
			fclose( fp );
		}
	}
}

void CServerSet::CreateUserCountFile()
{
	SYSTEMTIME time;
	GetLocalTime( &time );
	char temp[256];
	char filename[256];
	strcpy( temp, GetUserCountDirectory() );
	sprintf( filename, "%s_%04d%02d%02d_UserCount.txt", m_sServerSetName, time.wYear, time.wMonth, time.wDay );
	strcat( temp, filename );

	FILE* fp = fopen( temp, "a+" );
	if( fp == NULL )
		return;

	fprintf( fp, "Time\tTotal\tDist\tAgent\tMuim\t" );

	// map
	
	vector<CServer*>::iterator iter = m_vecServer.begin();
	for(;iter != m_vecServer.end();++iter)
	{
		if((*iter)->m_nServerKind != MAP_SERVER)
			continue;

		fprintf( fp, "%s\t", (*iter)->m_sName );
	}

	fprintf( fp, "\n" );

	fclose( fp );
}

void CServerSet::WriteUserCount( SYSTEMTIME time )
{
	vector<CServer*>::iterator iter = m_vecServer.begin();
	if( m_bInit )
	if( IsThereOnServer() )
	{
		char temp[256];
		char filename[256];	
		strcpy( temp, GetUserCountDirectory() );
		sprintf( filename, "%s_%04d%02d%02d_UserCount.txt", m_sServerSetName, time.wYear, time.wMonth, time.wDay );
		strcat( temp, filename );

		FILE* fp = fopen( temp, "a+" );
		if( fp == NULL )
			return;

		fprintf( fp, "%02d:%02d:%02d\t", time.wHour, time.wMinute, time.wSecond );

		DWORD total = 0;
		DWORD dist = 0;
		DWORD agent = 0;
		DWORD murim = 0;

		// distribute
		iter = m_vecServer.begin();
		for(;iter != m_vecServer.end();++iter)
		{
			if((*iter)->m_nServerKind != DISTRIBUTE_SERVER)
				continue;
			
			dist += (*iter)->m_dwUserCount;
		}
		total += dist;

		// agent
		iter = m_vecServer.begin();
		for(;iter != m_vecServer.end();++iter)
		{
			if((*iter)->m_nServerKind != AGENT_SERVER)
				continue;
			
			agent += (*iter)->m_dwUserCount;
		}
		total += agent;

		// murim
		iter = m_vecServer.begin();
		for(;iter != m_vecServer.end();++iter)
		{
			if((*iter)->m_nServerKind != MURIM_SERVER)
				continue;
			
			agent += (*iter)->m_dwUserCount;
		}

		fprintf( fp, "%d\t%d\t%d\t%d\t", total, dist, agent, murim );
		// map
		iter = m_vecServer.begin();
		for(;iter != m_vecServer.end();++iter)
		{
			if((*iter)->m_nServerKind != MAP_SERVER)
				continue;
			
			fprintf( fp, "%d\t", (*iter)->m_dwUserCount );
		}
		fprintf( fp, "\n" );

		fclose(fp);
	}
}

BOOL CServerSet::IsThereOnServer()
{	
	vector<CServer*>::iterator iter = m_vecServer.begin();
	for(;iter != m_vecServer.end();++iter)
	{
		if((*iter)->m_nState == eServerState_On)
			return TRUE;
	}
	return FALSE;
}

DWORD CServerSet::GetTotalUserCount()
{
	DWORD total = 0;
	DWORD dist = 0;
	DWORD agent = 0;
	
	vector<CServer*>::iterator iter = m_vecServer.begin();
	// distribute
	for(;iter != m_vecServer.end();++iter)
	{
		if((*iter)->m_nServerKind != DISTRIBUTE_SERVER)
			continue;
		
		dist += (*iter)->m_dwUserCount;
	}
	total += dist;
	
	// agent
	iter = m_vecServer.begin();
	for(;iter != m_vecServer.end();++iter)
	{
		if((*iter)->m_nServerKind != AGENT_SERVER)
			continue;
		
		agent += (*iter)->m_dwUserCount;
	}
	total += agent;

	m_dwTotalUserCount = total;

	return m_dwTotalUserCount;
}

BOOL CServerSet::CheckDisconnectUser()
{
	vector<CServer*>::iterator iter = m_vecServer.begin();
	for(;iter != m_vecServer.end();++iter)
	{
		if((*iter)->m_bDisconnectUser)
			return FALSE;
	}

	return TRUE;
}

// operate fn----------------------------------------------------------------------------
void CServerSet::DoServerSetOn() 
{
	if( m_bInit )
	{
		// on 鉴辑 : map, murim -> agent -> distribute
		vector<CServer*>::iterator iter = m_vecServer.begin();
		for(;iter != m_vecServer.end();++iter)
		{
			if((*iter)->m_nServerKind != MAP_SERVER)
				continue;
			
			(*iter)->DoServerOn();
		}
		iter = m_vecServer.begin();
		for(;iter != m_vecServer.end();++iter)
		{
			if((*iter)->m_nServerKind != MURIM_SERVER)
				continue;
			
			(*iter)->DoServerOn();
		}
		iter = m_vecServer.begin();
		for(;iter != m_vecServer.end();++iter)
		{
			if((*iter)->m_nServerKind != AGENT_SERVER)
				continue;
			
			(*iter)->DoServerOn();
		}
		iter = m_vecServer.begin();
		for(;iter != m_vecServer.end();++iter)
		{
			if((*iter)->m_nServerKind != DISTRIBUTE_SERVER)
				continue;
			
			(*iter)->DoServerOn();
		}
	}
}

void CServerSet::DoServerSetOff()
{
	if( m_bInit )
	{
		// on 鉴辑 : map, murim -> agent -> distribute
		vector<CServer*>::iterator iter = m_vecServer.begin();
		for(;iter != m_vecServer.end();++iter)
		{
			if((*iter)->m_nServerKind != MAP_SERVER)
				continue;
			
			(*iter)->DoServerOff();
		}
		iter = m_vecServer.begin();
		for(;iter != m_vecServer.end();++iter)
		{
			if((*iter)->m_nServerKind != MURIM_SERVER)
				continue;
			
			(*iter)->DoServerOff();
		}
		iter = m_vecServer.begin();
		for(;iter != m_vecServer.end();++iter)
		{
			if((*iter)->m_nServerKind != AGENT_SERVER)
				continue;
			
			(*iter)->DoServerOff();
		}
		iter = m_vecServer.begin();
		for(;iter != m_vecServer.end();++iter)
		{
			if((*iter)->m_nServerKind != DISTRIBUTE_SERVER)
				continue;
			
			(*iter)->DoServerOff();
		}
	}
}

void CServerSet::DoServerSetRefresh()
{
	if( m_bInit )
	{
		MSGROOT msg;
		msg.Category = MP_MORNITORTOOL;
		msg.Protocol = MP_MORNITORTOOL_MAPSERVERSTATE_SYN;

		NETWORK->Send( m_nServerSet, &msg, sizeof(msg) );
	}
}

void CServerSet::DoServerOn( WORD serverkind, WORD servernum )
{
	if( m_bInit )
	{
		CServer* pServer = GetServer(serverkind,servernum);
		if(pServer)
			pServer->DoServerOn();
	}
}

void CServerSet::DoServerOff( WORD serverkind, WORD servernum )
{
	if( m_bInit )
	{
		CServer* pServer = GetServer(serverkind,servernum);
		if(pServer)
			pServer->DoServerOff();
	}
}

void CServerSet::DoQueryClientExeVersion()
{
	if( m_bInit )
	{
		MSGROOT msg;
		msg.Category = MP_MORNITORTOOL;
		msg.Protocol = MP_MORNITORTOOL_QUERY_VERSION_SYN;
		
		NETWORK->Send( m_nServerSet, (MSGROOT*)&msg, sizeof(msg) );
	}
}

void CServerSet::DoChangeClientExeVersion( char* version )
{
	if( m_bInit )
	{
		MSGNOTICE msg;
		msg.Category = MP_MORNITORTOOL;
		msg.Protocol = MP_MORNITORTOOL_CHANGE_VERSION_SYN;
		strcpy( msg.Msg, version );
		
		NETWORK->Send( m_nServerSet, (MSGROOT*)&msg, sizeof(msg) );
	}
}

void CServerSet::DoQueryMaxUser()
{
	if( m_bInit )
	{
		MSGROOT msg;
		msg.Category = MP_MORNITORTOOL;
		msg.Protocol = MP_MORNITORTOOL_QUERY_MAXUSER_SYN;
		
		NETWORK->Send( m_nServerSet, (MSGROOT*)&msg, sizeof(msg) );
	}
}

void CServerSet::DoChangeMaxUser( DWORD maxuser )
{
	if( m_bInit )
	{
		MSG_DWORD msg;
		msg.Category = MP_MORNITORTOOL;
		msg.Protocol = MP_MORNITORTOOL_CHANGE_MAXUSER_SYN;
		msg.dwData = maxuser;
		
		NETWORK->Send( m_nServerSet, (MSGROOT*)&msg, sizeof(msg) );
	}
}

void CServerSet::DoQueryUserLevel()
{
	if( m_bInit )
	{
		MSG_DWORD msg;
		msg.Category = MP_MORNITORTOOL;
		msg.Protocol = MP_MORNITORTOOL_CHANGE_USERLEVEL_SYN;
		msg.dwData = 0;
	
		NETWORK->Send( m_nServerSet, (MSGROOT*)&msg, sizeof(msg) );
	}
}

void CServerSet::DoChangeUserLevel( int userlevel )
{
	if( m_bInit )
	{
		MSG_DWORD msg;
		msg.Category = MP_MORNITORTOOL;
		msg.Protocol = MP_MORNITORTOOL_CHANGE_USERLEVEL_SYN;
		msg.dwData = userlevel;

		NETWORK->Send( m_nServerSet, (MSGROOT*)&msg, sizeof(msg) );
	}
}

void CServerSet::DoQueryUserCount()
{
	if( m_bInit )
	{
		MSGROOT msg;
		msg.Category = MP_MORNITORTOOL;
		msg.Protocol = MP_MORNITORTOOL_QUERYUSERCOUNT_SYN;

		NETWORK->Send( m_nServerSet, &msg, sizeof(msg) );
	}
}

void CServerSet::DoSendMessage( char* pmsg )
{
	if( m_bInit )
	{
		MSGNOTICE msg;
		msg.Category = MP_MORNITORTOOL;
		msg.Protocol = MP_MORNITORTOOL_NOTICESEND_SYN;
		strcpy( msg.Msg, pmsg );
		
		NETWORK->Send( m_nServerSet, (MSGROOT*)&msg, sizeof(msg) );
	}
}

void CServerSet::DoAutoPatch()
{
	if( m_bInit )
	{
		MSGROOT msg;
		msg.Category = MP_MORNITORTOOL;
		msg.Protocol = MP_MORNITORTOOL_EXECUTE_AUTOPATCH_SYN;
		
		NETWORK->Send( m_nServerSet, &msg, sizeof(msg) );
	}
}

void CServerSet::DoAssertMsgBox( BOOL bState )
{
	if( m_bInit )
	{
		MSG_DWORD msg;
		msg.Category = MP_MORNITORTOOL;
		msg.Protocol = MP_MORNITORTOOL_ASSERTMSGBOX_SYN;
		msg.dwData = (DWORD)bState;
		
		NETWORK->Send( m_nServerSet, &msg, sizeof(msg) );
	}
}

void CServerSet::DoAllUserDisconnect()
{
	if( m_bInit )
	{
		MSGROOT msg;
		msg.Category = MP_MORNITORTOOL;
		msg.Protocol = MP_MORNITORTOOL_DISCONNECT_ALLUSER_SYN;

		NETWORK->Send( m_nServerSet, &msg, sizeof(msg) );
	}
}

void CServerSet::DoServerSetOffAfterUserDiscon()
{
	if( CheckDisconnectUser() )
		DoServerSetOff();
}

void CServerSet::DoMSStateAll()
{
	if( m_bInit )
	{
		MSGROOT msg;
		msg.Category = MP_MORNITORTOOL;
		msg.Protocol = MP_MORNITORTOOL_MSSTATEALL_SYN;

		NETWORK->Send( m_nServerSet, &msg, sizeof(msg) );	
	}
}

void CServerSet::DoQueryChannelInfo()
{
	if( m_bInit )
	{
		MSGROOT msg;
		msg.Category = MP_MORNITORTOOL;
		msg.Protocol = MP_MORNITORTOOL_QUERY_CHANNELINFO_SYN;

		NETWORK->Send( m_nServerSet, &msg, sizeof(msg) );	
	}
}

CServer* CServerSet::GetMSServer( MSSTATE* pState )
{
	vector<CServer*>::iterator iter = m_vecMSServer.begin();
	for(;iter != m_vecMSServer.end();++iter)
	{
		if( ( (*iter)->m_nPort == pState->wServerPort ) &&
			( strcmp((*iter)->m_sIP, pState->sServerIP) == 0 ) )
			return (*iter);
	}

	return NULL;
}

CServer* CServerSet::GetServer( char* pServerIp, WORD wServerPort )
{
	vector<CServer*>::iterator iter = m_vecServer.begin();
	for(;iter != m_vecServer.end();++iter)
	{
		if( ( (*iter)->m_nPort == wServerPort ) &&
			( strcmp((*iter)->m_sIP, pServerIp) == 0 ) )
			return (*iter);
	}

	return NULL;
}

void CServerSet::ClearMSStateAll()
{
	vector<CServer*>::iterator iter = m_vecMSServer.begin();
	for(;iter != m_vecMSServer.end();++iter)
	{
		(*iter)->SetState( eServerState_Disconnect );
	}
}

void CServerSet::DoQueryAutoPatchVersion()
{
	if( m_bInit )
	{
		MSGROOT msg;
		msg.Category = MP_MORNITORTOOL;
		msg.Protocol = MP_MORNITORTOOL_QUERY_AUTOPATCHVERSION_SYN;

		NETWORK->Send( m_nServerSet, &msg, sizeof(msg) );	
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -