Files
2026-02-13 14:34:15 +08:00

582 lines
14 KiB
C++

#include "Stdafx.h"
#include "Resource.h"
#include "GameServerDlg.h"
#include "ServerCtrlDlg.h"
//////////////////////////////////////////////////////////////////////////////////
//消息定义
#define WM_PROCESS_CMD_LINE (WM_USER+100) //处理命令
//////////////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CGameServerDlg, CDialog)
//系统消息
ON_WM_QUERYENDSESSION()
ON_BN_CLICKED(IDC_OPEN_SERVER, OnBnClickedOpenServer)
ON_BN_CLICKED(IDC_STOP_SERVICE, OnBnClickedStopService)
ON_BN_CLICKED(IDC_START_SERVICE, OnBnClickedStartService)
ON_BN_CLICKED(IDC_CREATE_SERVER, OnBnClickedCreateServer)
ON_BN_CLICKED(IDC_OPTION_SERVER, OnBnClickedOptionServer)
ON_BN_CLICKED(IDC_OPTION_MATCH, OnBnClickedOptionMatch)
ON_BN_CLICKED(IDC_SERVICE_CONTROL, OnBnClickedServiceControl)
ON_BN_CLICKED(IDC_RUN_PARAMETER, OnBnClickedRunParameter)
//自定消息
ON_MESSAGE(WM_PROCESS_CMD_LINE,OnMessageProcessCmdLine)
END_MESSAGE_MAP()
//////////////////////////////////////////////////////////////////////////////////
//构造函数
CGameServerDlg::CGameServerDlg() : CDialog(IDD_DLG_GAME_SERVER)
{
//配置参数
m_bAutoControl=false;
m_bOptionSuccess=false;
ZeroMemory(&m_ModuleInitParameter,sizeof(m_ModuleInitParameter));
return;
}
//析构函数
CGameServerDlg::~CGameServerDlg()
{
}
//控件绑定
VOID CGameServerDlg::DoDataExchange(CDataExchange * pDX)
{
__super::DoDataExchange(pDX);
DDX_Control(pDX, IDC_TRACE_MESSAGE, m_TraceServiceControl);
}
//初始化函数
BOOL CGameServerDlg::OnInitDialog()
{
__super::OnInitDialog();
//设置标题
SetWindowText(TEXT("游戏服务器 -- [ 停止 ]"));
//设置图标
HICON hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
SetIcon(hIcon,TRUE);
SetIcon(hIcon,FALSE);
//设置组件
m_ServiceUnits.SetServiceUnitsSink(this);
//命令处理
LPCTSTR pszCmdLine=AfxGetApp()->m_lpCmdLine;
if (pszCmdLine[0]!=0) PostMessage(WM_PROCESS_CMD_LINE,0,(LPARAM)pszCmdLine);
return TRUE;
}
//确定消息
VOID CGameServerDlg::OnOK()
{
return;
}
//取消函数
VOID CGameServerDlg::OnCancel()
{
//关闭询问
if (m_ServiceUnits.GetServiceStatus()!=ServiceStatus_Stop)
{
LPCTSTR pszQuestion=TEXT("游戏服务器正在运行中,您确实要关闭服务器吗?");
if (AfxMessageBox(pszQuestion,MB_YESNO|MB_DEFBUTTON2|MB_ICONQUESTION)!=IDYES) return;
}
//停止服务
m_ServiceUnits.ConcludeService();
__super::OnCancel();
}
//消息解释
BOOL CGameServerDlg::PreTranslateMessage(MSG * pMsg)
{
//按键过滤
if ((pMsg->message==WM_KEYDOWN)&&(pMsg->wParam==VK_ESCAPE))
{
return TRUE;
}
return __super::PreTranslateMessage(pMsg);
}
//服务状态
VOID CGameServerDlg::OnServiceUnitsStatus(enServiceStatus ServiceStatus)
{
//状态设置
switch (ServiceStatus)
{
case ServiceStatus_Stop: //停止状态
{
//更新标题
UpdateServerTitle(ServiceStatus);
//服务按钮
GetDlgItem(IDC_STOP_SERVICE)->EnableWindow(FALSE);
GetDlgItem(IDC_START_SERVICE)->EnableWindow(TRUE);
//配置按钮
//GetDlgItem(IDC_OPEN_MATCH)->EnableWindow(TRUE);
GetDlgItem(IDC_OPEN_SERVER)->EnableWindow(TRUE);
GetDlgItem(IDC_CREATE_SERVER)->EnableWindow(TRUE);
GetDlgItem(IDC_OPTION_SERVER)->EnableWindow(TRUE);
//if((m_ModuleInitParameter.GameServiceOption.wServerType&GAME_GENRE_MATCH)!=0)
// GetDlgItem(IDC_OPTION_MATCH)->EnableWindow(TRUE);
//运行按钮
//GetDlgItem(IDC_RUN_PARAMETER)->EnableWindow(FALSE);
//GetDlgItem(IDC_SERVICE_CONTROL)->EnableWindow(FALSE);
//提示信息
LPCTSTR pszDescribe=TEXT("服务停止成功");
CTraceService::TraceString(pszDescribe,TraceLevel_Normal);
break;
}
case ServiceStatus_Config: //配置状态
{
//更新标题
UpdateServerTitle(ServiceStatus);
//设置按钮
GetDlgItem(IDC_STOP_SERVICE)->EnableWindow(TRUE);
GetDlgItem(IDC_START_SERVICE)->EnableWindow(FALSE);
//配置按钮
//GetDlgItem(IDC_OPEN_MATCH)->EnableWindow(FALSE);
GetDlgItem(IDC_OPEN_SERVER)->EnableWindow(FALSE);
GetDlgItem(IDC_CREATE_SERVER)->EnableWindow(FALSE);
GetDlgItem(IDC_OPTION_SERVER)->EnableWindow(FALSE);
//GetDlgItem(IDC_OPTION_MATCH)->EnableWindow(FALSE);
//运行按钮
//GetDlgItem(IDC_RUN_PARAMETER)->EnableWindow(FALSE);
//GetDlgItem(IDC_SERVICE_CONTROL)->EnableWindow(FALSE);
//提示信息
LPCTSTR pszDescribe=TEXT("正在初始化组件...");
CTraceService::TraceString(pszDescribe,TraceLevel_Normal);
break;
}
case ServiceStatus_Service: //服务状态
{
//更新标题
UpdateServerTitle(ServiceStatus);
//服务按钮
GetDlgItem(IDC_STOP_SERVICE)->EnableWindow(TRUE);
GetDlgItem(IDC_START_SERVICE)->EnableWindow(FALSE);
//配置按钮
//GetDlgItem(IDC_OPEN_MATCH)->EnableWindow(FALSE);
GetDlgItem(IDC_OPEN_SERVER)->EnableWindow(FALSE);
GetDlgItem(IDC_CREATE_SERVER)->EnableWindow(FALSE);
GetDlgItem(IDC_OPTION_SERVER)->EnableWindow(FALSE);
//运行按钮
//GetDlgItem(IDC_RUN_PARAMETER)->EnableWindow(TRUE);
//GetDlgItem(IDC_SERVICE_CONTROL)->EnableWindow(TRUE);
//提示信息
LPCTSTR pszDescribe=TEXT("服务启动成功");
CTraceService::TraceString(pszDescribe,TraceLevel_Normal);
break;
}
}
return;
}
//更新图标
VOID CGameServerDlg::UpdateServerLogo(LPCTSTR pszServerDLL)
{
//加载资源
HINSTANCE hInstance=AfxLoadLibrary(pszServerDLL);
//加载图形
if (hInstance!=NULL)
{
//设置资源
AfxSetResourceHandle(hInstance);
//设置资源
CStatic * pServerLogo=(CStatic *)GetDlgItem(IDC_SERVER_LOGO);
pServerLogo->SetIcon(::LoadIcon(hInstance,TEXT("SERVER_ICON")));
//释放资源
AfxFreeLibrary(hInstance);
AfxSetResourceHandle(GetModuleHandle(NULL));
}
return;
}
//更新标题
VOID CGameServerDlg::UpdateServerTitle(enServiceStatus ServiceStatus)
{
//变量定义
LPCTSTR pszStatusName=NULL;
LPCTSTR pszServerName=NULL;
//状态字符
switch (ServiceStatus)
{
case ServiceStatus_Stop: //停止状态
{
pszStatusName=TEXT("停止");
break;
}
case ServiceStatus_Config: //配置状态
{
pszStatusName=TEXT("初始化");
break;
}
case ServiceStatus_Service: //运行状态
{
pszStatusName=TEXT("运行");
break;
}
}
//房间名字
if (m_bOptionSuccess==false) pszServerName=TEXT("游戏服务器");
else pszServerName=m_ModuleInitParameter.GameServiceOption.szServerName;
//构造标题
TCHAR szTitle[128]=TEXT("");
_sntprintf_s(szTitle,CountArray(szTitle),TEXT("[ %s ] -- [ %s ]"),pszServerName,pszStatusName);
//设置标题
SetWindowText(szTitle);
return;
}
//更新状态
VOID CGameServerDlg::UpdateParameterStatus(tagModuleInitParameter & ModuleInitParameter)
{
//设置变量
m_bOptionSuccess=true;
m_ModuleInitParameter=ModuleInitParameter;
//更新标题
UpdateServerTitle(ServiceStatus_Stop);
UpdateServerLogo(ModuleInitParameter.GameServiceAttrib.szServerDLLName);
//设置按钮
GetDlgItem(IDC_START_SERVICE)->EnableWindow(TRUE);
GetDlgItem(IDC_OPTION_SERVER)->EnableWindow(TRUE);
if((ModuleInitParameter.GameServiceOption.wServerType&GAME_GENRE_MATCH)!=0)
{
GetDlgItem(IDC_OPTION_MATCH)->EnableWindow(TRUE);
}
//设置控件
SetDlgItemText(IDC_GAME_NAME,m_ModuleInitParameter.GameServiceAttrib.szGameName);
SetDlgItemText(IDC_SERVER_NAME,m_ModuleInitParameter.GameServiceOption.szServerName);
//监听端口
if (m_ModuleInitParameter.GameServiceOption.wServerPort==0)
{
SetDlgItemText(IDC_SERVER_PORT,TEXT("自动适配"));
}
else
{
SetDlgItemInt(IDC_SERVER_PORT,m_ModuleInitParameter.GameServiceOption.wServerPort);
}
//设置模块
LPCTSTR pszServerDLLName=m_ModuleInitParameter.GameServiceAttrib.szServerDLLName;
m_ServiceUnits.CollocateService(pszServerDLLName,m_ModuleInitParameter.GameServiceOption);
//构造提示
TCHAR szString[256]=TEXT("");
LPCTSTR pszServerName=m_ModuleInitParameter.GameServiceOption.szServerName;
_sntprintf_s(szString,CountArray(szString),TEXT("[ %s ] 房间参数加载成功"),pszServerName);
//输出信息
CTraceService::TraceString(szString,TraceLevel_Normal);
return;
}
//启动房间
bool CGameServerDlg::StartServerService(WORD wServerID)
{
//变量定义
tagDataBaseParameter DataBaseParameter;
ZeroMemory(&DataBaseParameter,sizeof(DataBaseParameter));
//设置参数
InitDataBaseParameter(DataBaseParameter);
m_ModuleDBParameter.SetPlatformDBParameter(DataBaseParameter);
//读取配置
CDlgServerItem DlgServerItem;
if (DlgServerItem.OpenGameServer(wServerID)==false)
{
CTraceService::TraceString(TEXT("房间配置参数不存在或者加载失败"),TraceLevel_Exception);
return false;
}
//更新状态
UpdateParameterStatus(DlgServerItem.m_ModuleInitParameter);
//启动服务
try
{
m_ServiceUnits.StartService();
}
catch (...)
{
ASSERT(FALSE);
}
return true;
}
//获取连接
bool CGameServerDlg::InitDataBaseParameter(tagDataBaseParameter & DataBaseParameter)
{
//获取路径
TCHAR szWorkDir[MAX_PATH]=TEXT("");
CWHService::GetWorkDirectory(szWorkDir,CountArray(szWorkDir));
//构造路径
TCHAR szIniFile[MAX_PATH]=TEXT("");
_sntprintf_s(szIniFile,CountArray(szIniFile),TEXT("%s\\ServerParameter.ini"),szWorkDir);
//读取配置
CWHIniData IniData;
IniData.SetIniFilePath(szIniFile);
//连接信息
DataBaseParameter.wDataBasePort=(WORD)IniData.ReadInt(TEXT("PlatformDB"),TEXT("DBPort"),1433);
IniData.ReadString(TEXT("PlatformDB"),TEXT("DBAddr"),NULL,DataBaseParameter.szDataBaseAddr,CountArray(DataBaseParameter.szDataBaseAddr));
IniData.ReadString(TEXT("PlatformDB"),TEXT("DBUser"),NULL,DataBaseParameter.szDataBaseUser,CountArray(DataBaseParameter.szDataBaseUser));
IniData.ReadString(TEXT("PlatformDB"),TEXT("DBPass"),NULL,DataBaseParameter.szDataBasePass,CountArray(DataBaseParameter.szDataBasePass));
IniData.ReadString(TEXT("PlatformDB"),TEXT("DBName"),szPlatformDB,DataBaseParameter.szDataBaseName,CountArray(DataBaseParameter.szDataBaseName));
return true;
}
//启动服务
VOID CGameServerDlg::OnBnClickedStartService()
{
//启动服务
try
{
m_ServiceUnits.StartService();
}
catch (...)
{
ASSERT(FALSE);
}
return;
}
//停止服务
VOID CGameServerDlg::OnBnClickedStopService()
{
//停止服务
try
{
m_ServiceUnits.ConcludeService();
}
catch (...)
{
ASSERT(FALSE);
}
return;
}
//打开房间
VOID CGameServerDlg::OnBnClickedOpenServer()
{
//变量定义
tagDataBaseParameter DataBaseParameter;
ZeroMemory(&DataBaseParameter,sizeof(DataBaseParameter));
//设置参数
InitDataBaseParameter(DataBaseParameter);
m_ModuleDBParameter.SetPlatformDBParameter(DataBaseParameter);
//配置房间
CDlgServerItem DlgServerItem;
if (DlgServerItem.OpenGameServer()==false) return;
//更新状态
UpdateParameterStatus(DlgServerItem.m_ModuleInitParameter);
return;
}
//创建房间
VOID CGameServerDlg::OnBnClickedCreateServer()
{
//变量定义
tagDataBaseParameter DataBaseParameter;
ZeroMemory(&DataBaseParameter,sizeof(DataBaseParameter));
//设置参数
InitDataBaseParameter(DataBaseParameter);
m_ModuleDBParameter.SetPlatformDBParameter(DataBaseParameter);
//创建房间
CDlgServerWizard DlgServerWizard;
if (DlgServerWizard.CreateGameServer()==false) return;
//更新状态
UpdateParameterStatus(DlgServerWizard.m_ModuleInitParameter);
return;
}
//配置房间
VOID CGameServerDlg::OnBnClickedOptionServer()
{
//游戏模块
CGameServiceManagerHelper GameServiceManager;
GameServiceManager.SetModuleCreateInfo(m_ModuleInitParameter.GameServiceAttrib.szServerDLLName,GAME_SERVICE_CREATE_NAME);
//加载模块
if (GameServiceManager.CreateInstance()==false)
{
AfxMessageBox(TEXT("服务组件不存在或者加载失败,配置房间失败"),MB_ICONERROR);
return;
}
//配置房间
CDlgServerWizard DlgServerWizard;
DlgServerWizard.SetWizardParameter(GameServiceManager.GetInterface(),&m_ModuleInitParameter.GameServiceOption);
//创建房间
if (DlgServerWizard.CreateGameServer()==false) return;
//更新状态
UpdateParameterStatus(DlgServerWizard.m_ModuleInitParameter);
return;
}
//配置比赛
VOID CGameServerDlg::OnBnClickedOptionMatch()
{
//不是比赛就过滤
if((m_ModuleInitParameter.GameServiceOption.wServerType&GAME_GENRE_MATCH)==0) return;
//变量定义
tagDataBaseParameter DataBaseParameter;
ZeroMemory(&DataBaseParameter,sizeof(DataBaseParameter));
//设置参数
InitDataBaseParameter(DataBaseParameter);
m_ModuleDBParameter.SetPlatformDBParameter(DataBaseParameter);
//加载信息
//CServerInfoManager ServerInfoManager;
//CMatchOptionBuffer m_MatchOptionBuffer; //模块信息
//if (ServerInfoManager.LoadGameMatchOption(m_ModuleInitParameter.GameServiceAttrib.wKindID,m_MatchOptionBuffer)==true)
//{
// //变量定义
// tagGameMatchOption * pGameMatchOption=NULL;
// for(INT_PTR nIndex=0;nIndex<m_MatchOptionBuffer.m_GameMatchOptionArray.GetCount();nIndex++)
// {
// //获取对象
// pGameMatchOption=m_MatchOptionBuffer.m_GameMatchOptionArray[nIndex];
// CopyMemory(&m_ModuleInitParameter.GameMatchOption,pGameMatchOption,sizeof(m_ModuleInitParameter.GameMatchOption));
// }
//}
//配置房间
CDlgServerMatch DlgServerMatch;
if (DlgServerMatch.OpenGameMatch(m_ModuleInitParameter.GameServiceAttrib.wKindID)==false) return;
//拷贝数据
CopyMemory(&m_ModuleInitParameter.GameMatchOption,&DlgServerMatch.m_GameMatchOption,sizeof(m_ModuleInitParameter.GameMatchOption));
//配置游戏
m_ServiceUnits.CollocateService(m_ModuleInitParameter.GameMatchOption);
//输出信息
CTraceService::TraceString(TEXT("比赛配置加载成功"),TraceLevel_Normal);
}
// 服务控制;
VOID CGameServerDlg::OnBnClickedServiceControl()
{
//m_ServiceUnits.MaintainService();
//CTraceService::TraceString(TEXT("服务器即将维护"), TraceLevel_Warning);
CServerCtrlDlg mDlg(this);
mDlg.DoModal();
}
//运行参数
VOID CGameServerDlg::OnBnClickedRunParameter()
{
//机器标识
TCHAR szMachineID[LEN_MACHINE_ID];
CWHService::GetMachineID(szMachineID);
CTraceService::TraceString(szMachineID, TraceLevel_Exception);
}
//关闭询问
BOOL CGameServerDlg::OnQueryEndSession()
{
//提示消息
if (m_ServiceUnits.GetServiceStatus()!=ServiceStatus_Stop)
{
CTraceService::TraceString(TEXT("服务正在运行中,系统要求注销回话请求失败"),TraceLevel_Warning);
return FALSE;
}
return TRUE;
}
//命令处理
LRESULT CGameServerDlg::OnMessageProcessCmdLine(WPARAM wParam, LPARAM lParam)
{
//变量定义
CWHCommandLine CommandLine;
LPCTSTR pszCommandLine=(LPCTSTR)(lParam);
//房间标识
TCHAR szSrverID[32]=TEXT("");
if (CommandLine.SearchCommandItem(pszCommandLine,TEXT("/ServerID:"),szSrverID,CountArray(szSrverID))==true)
{
//获取房间
WORD wServerID=(WORD)(_tstol(szSrverID));
//启动房间
if (wServerID!=0)
{
//设置变量
m_bAutoControl=true;
//启动房间
StartServerService(wServerID);
}
}
return 0L;
}