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

📄 server.cpp

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

#include "stdafx.h"
#include "ServerTool.h"
#include "Server.h"
#include "MapNameManager.h"

#include "MHNetwork.h"

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

extern sMSGOPTION	gMsgOption;

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

CServer::CServer(int ServerSetNum,SERVERINFO* pInfo)
{
	m_nServerSet = ServerSetNum;
	m_nServerKind = pInfo->wServerKind;
	m_nState = eServerState_Off;
	strcpy( m_sState, "OFF" );
	m_nServerNum = pInfo->wServerNum;
	strcpy( m_sIP, pInfo->szIPForServer );	
	m_nPort = pInfo->wPortForServer;
	m_dwUserCount = 0;
	m_bDisconnectUser = FALSE;
	m_nAutoPatchState = AUTOPATCHSTATE_END;
	strcpy( m_sAutoPatchState, "End" );
	strcpy( m_sAutoPatchVersion, "Null" );

	memset( m_nChannelUserCount, 0, sizeof(int)*10 );
	m_nMaxChannel = 0;

	switch(m_nServerKind)
	{
	case DISTRIBUTE_SERVER:
		strcpy( m_sName, "Distribute" );
		break;
	case AGENT_SERVER:
		strcpy( m_sName, "Agent" );
		break;
	case MURIM_SERVER:
		strcpy( m_sName, "Murim" );
		break;
	case MAP_SERVER:
//		strcpy( m_sName, GetMapName(m_nServerNum) );
		strcpy( m_sName, MAPNAME->GetMapName(m_nServerNum) );
		break;
	case MONITOR_AGENT_SERVER:
		{
			strcpy( m_sName, "MAS" );
			strcpy( m_sState, "Disconnect" );
		}
		break;
	case MONITOR_SERVER:
		{
			strcpy( m_sName, "MS" );
			strcpy( m_sState, "Disconnect" );
		}
		break;
	default:
		strcpy( m_sName, "ETC" );
	}
	
}

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

void CServer::Release()
{
	m_nServerSet = -1;
	m_nServerKind = 0;
	m_nState = eServerState_Off;
	strcpy( m_sState, "OFF" );
	m_nServerNum = 0;
	memset( m_sIP, 0, 16 );	
	m_nPort = 0;
	memset( m_sName, 0, 64 );
	m_dwUserCount = 0;	
	m_bDisconnectUser = FALSE;
	m_nAutoPatchState = AUTOPATCHSTATE_END;
	strcpy( m_sAutoPatchState, "End" );
	strcpy( m_sAutoPatchVersion, "Null" );

	memset( m_nChannelUserCount, 0, sizeof(int)*10 );
	m_nMaxChannel = 0;
}

int CServer::SetState( int state )
{
	m_nState = state;

	switch( state )
	{
	case eServerState_Off:
		{
			strcpy( m_sState, "OFF" );
			m_dwUserCount = 0;
			m_bDisconnectUser = FALSE;
			
			memset( m_nChannelUserCount, 0, sizeof(int)*10 );
			m_nMaxChannel = 0;
		}
		break;
		
	case eServerState_On:
		{
			strcpy( m_sState, "ON" );
			if( m_nServerKind == AGENT_SERVER && m_sState == eServerState_Off )
				m_bDisconnectUser = TRUE;
		}
		break;
		
	case eServerState_AbNormal:
		{
			strcpy( m_sState, "AbNormal" );

			CString str;
			char temp[256];
			strcpy( temp, GetDataDirectory() );
			strcat( temp, "ringin.wav" );
			sndPlaySound( temp, SND_LOOP | SND_NODEFAULT | SND_ASYNC );
			str.Format( "%s Server AbNormal!!", m_sName );
			if( gMsgOption.bServer )
			{				
				if( MessageBox( NULL, str, "Error!!", MB_OK ) == IDOK )
				{
					sndPlaySound( NULL, SND_LOOP | SND_NODEFAULT | SND_ASYNC );
					return m_nServerSet;
				}
			}
			else
				return m_nServerSet;

		}
		break;

	case eServerState_Disconnect:
		{
			strcpy( m_sState, "Disconnect" );
			m_nState = eServerState_Off;
		}
		break;
	case eServerState_Connect:
		{
			strcpy( m_sState, "Connect" );
			m_nState = eServerState_On;
		}
		break;
	}

	return -1;
}

void CServer::DoServerOn()
{
	if( m_nState == eServerState_Off )
	{
		MSGEXECUTESERVER msg;
		msg.Category = MP_MORNITORTOOL;
		msg.Protocol = MP_MORNITORTOOL_EXECUTE_MAPSERVER_SYN;
		msg.ServerType = m_nServerKind;
		msg.ServerNum = m_nServerNum;
		strcpy( msg.ServerIP, m_sIP );
		msg.ServerPort = m_nPort;		

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

void CServer::DoServerOff()
{
	if( m_nState == eServerState_On || m_nState == eServerState_AbNormal )
	{
		MSGEXECUTESERVER msg;
		msg.Category = MP_MORNITORTOOL;
		msg.Protocol = MP_MORNITORTOOL_SHUTDOWN_MAPSERVER_SYN;
		msg.ServerType = m_nServerKind;
		msg.ServerNum = m_nServerNum;
		strcpy( msg.ServerIP, m_sIP );
		msg.ServerPort = m_nPort;
		
		NETWORK->Send( m_nServerSet, (MSGROOT*)&msg, sizeof(msg) );
	}
}

void CServer::DoKillServer()
{
	if( m_nState == eServerState_On || m_nState == eServerState_AbNormal )
	{
		MSGEXECUTESERVER msg;
		msg.Category = MP_MORNITORTOOL;
		msg.Protocol = MP_MORNITORTOOL_KILL_SERVER_SYN;
		msg.ServerType = m_nServerKind;
		msg.ServerNum = m_nServerNum;
		strcpy( msg.ServerIP, m_sIP );
		msg.ServerPort = m_nPort;
		
		NETWORK->Send( m_nServerSet, (MSGROOT*)&msg, sizeof(msg) );
	}
}

void CServer::SetAutoPatchState( int nState, char* sVersion )
{
	if( m_nAutoPatchState == AUTOPATCHSTATE_END && nState == AUTOPATCHSTATE_PROC )
		return;

	m_nAutoPatchState = nState;
	switch( m_nAutoPatchState )
	{
	case AUTOPATCHSTATE_START:	strcpy( m_sAutoPatchState, "Start" );	break;
	case AUTOPATCHSTATE_PROC:	strcpy( m_sAutoPatchState, "Proc" );	break;
	case AUTOPATCHSTATE_END:	strcpy( m_sAutoPatchState, "End" );		break;			
	}

	strcpy( m_sAutoPatchVersion, sVersion );
}

void CServer::SetAutoPatchVersion( char* sVersion )
{
	strcpy( m_sAutoPatchVersion, sVersion );
}

void CServer::SetChannelUserCount( MSG_CHANNEL_INFO* pChannelInfo )
{
	memset( m_nChannelUserCount, 0, sizeof(int)*10 );
	m_nMaxChannel = 0;

	m_nMaxChannel = pChannelInfo->Count;
	for( int i = 0; i < m_nMaxChannel; ++i )
		m_nChannelUserCount[i] = pChannelInfo->PlayerNum[i];
}

⌨️ 快捷键说明

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