// DlgServerItem.cpp : 实现文件 // #include "stdafx.h" #include "resource.h" #include "DlgServerItem.h" #include "afxdialogex.h" //列表属性 #define LIST_STYTE LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_FLATSB // CDlgServerItem 对话框 IMPLEMENT_DYNAMIC(CDlgServerItem, CDialogEx) CDlgServerItem::CDlgServerItem(CWnd* pParent /*=NULL*/) : CDialogEx(IDD_SERVER_ITEM, pParent) { //模块参数 ZeroMemory(&m_ModuleInitParameter, sizeof(m_ModuleInitParameter)); } CDlgServerItem::~CDlgServerItem() { } void CDlgServerItem::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_SERVER_LIST, m_ServerListControl); } bool CDlgServerItem::OpenGameServer() { //设置资源 AfxSetResourceHandle(GetModuleHandle(MODULE_MANAGER_DLL_NAME)); //配置房间 if (DoModal() == IDC_LOAD_SERVER) { return true; } return false; } bool CDlgServerItem::OpenGameServer(WORD wServerID) { //变量定义 tagGameServerInfo GameServerResult; ZeroMemory(&GameServerResult, sizeof(GameServerResult)); //机器标识 TCHAR szMachineID[LEN_MACHINE_ID]; CWHService::GetMachineID(szMachineID); //加载房间 CServerInfoManager ServerInfoManager; if (ServerInfoManager.LoadGameServerInfo(szMachineID, wServerID, GameServerResult) == false) { return false; } //获取参数 if (GetModuleInitParameter(&GameServerResult, true) == false) { return false; } return true; } bool CDlgServerItem::LoadDBServerItem() { //重置列表 m_ServerListControl.DeleteAllItems(); //设置按钮 GetDlgItem(IDC_LOAD_SERVER)->EnableWindow(FALSE); GetDlgItem(IDC_DELETE_SERVER)->EnableWindow(FALSE); GetDlgItem(IDC_SERVICE_ATTRIB)->EnableWindow(FALSE); //机器标识 TCHAR szMachineID[LEN_MACHINE_ID]; CWHService::GetMachineID(szMachineID); //加载信息 CServerInfoManager ServerInfoManager; if (ServerInfoManager.LoadGameServerInfo(szMachineID, m_ServerInfoBuffer) == true) { //变量定义 POSITION Position = m_ServerInfoBuffer.m_GameServerInfoMap.GetStartPosition(); bool bFind = false; //枚举模块 while (Position != NULL) { //获取对象 WORD wServerID = 0L; tagGameServerInfo * pGameServerInfo = NULL; m_ServerInfoBuffer.m_GameServerInfoMap.GetNextAssoc(Position, wServerID, pGameServerInfo); //插入列表 ASSERT(pGameServerInfo != NULL); if (pGameServerInfo != NULL) { m_ServerListControl.InsertServerInfo(pGameServerInfo); if (g_StartP.wServerID == pGameServerInfo->wServerID) { bool bRet = GetModuleInitParameter(pGameServerInfo, true); if (bRet == false) { g_StartP.iErr = -1; } else { bFind = true; } } } } if (bFind == false && g_StartP.iErr != -1) g_StartP.iErr = -2; return true; } return false; } bool CDlgServerItem::UpdateControlStatus() { //获取选择 POSITION Position = m_ServerListControl.GetFirstSelectedItemPosition(); //设置列表 if (Position != NULL) { //获取房间 INT nListItem = m_ServerListControl.GetNextSelectedItem(Position); tagGameServerInfo * pGameServerInfo = (tagGameServerInfo *)m_ServerListControl.GetItemData(nListItem); //设置按钮 if (pGameServerInfo->dwNativeVersion != 0L) { GetDlgItem(IDC_LOAD_SERVER)->EnableWindow(TRUE); GetDlgItem(IDC_DELETE_SERVER)->EnableWindow(TRUE); GetDlgItem(IDC_SERVICE_ATTRIB)->EnableWindow(TRUE); } else { GetDlgItem(IDC_LOAD_SERVER)->EnableWindow(FALSE); GetDlgItem(IDC_DELETE_SERVER)->EnableWindow(TRUE); GetDlgItem(IDC_SERVICE_ATTRIB)->EnableWindow(FALSE); } } else { //设置按钮 GetDlgItem(IDC_LOAD_SERVER)->EnableWindow(FALSE); GetDlgItem(IDC_DELETE_SERVER)->EnableWindow(FALSE); GetDlgItem(IDC_SERVICE_ATTRIB)->EnableWindow(FALSE); } return true; } bool CDlgServerItem::GetModuleInitParameter(tagGameServerInfo * pGameServerInfo, bool bAutoMode) { //效验参数 ASSERT(pGameServerInfo != NULL); if (pGameServerInfo == NULL) return false; //游戏模块 CGameServiceManagerHelper GameServiceManager; GameServiceManager.SetModuleCreateInfo(pGameServerInfo->szServerDLLName, GAME_SERVICE_CREATE_NAME); ///---由DLL玩法类实现的 //创建判断 if (pGameServerInfo->dwNativeVersion == 0) { //构造提示 TCHAR szString[128] = TEXT(""); _sntprintf(szString, CountArray(szString), TEXT("[ %s ] 游戏服务器组件还没有安装,请先安装对应的游戏服务器"), pGameServerInfo->szGameName); //提示消息 if (bAutoMode == true) CTraceService::TraceString(szString, TraceLevel_Exception); else AfxMessageBox(szString, MB_ICONERROR); return false; } //更新判断 if (pGameServerInfo->dwNativeVersion != pGameServerInfo->dwServerVersion) { //构造提示 TCHAR szString[128] = TEXT(""); _sntprintf(szString, CountArray(szString), TEXT("[ %s ] 游戏服务器组件已经更新了,不能继续用于启动房间"), pGameServerInfo->szGameName); //提示消息 if (bAutoMode == true) CTraceService::TraceString(szString, TraceLevel_Exception); else AfxMessageBox(szString, MB_ICONERROR); return false; } //加载模块 if (GameServiceManager.CreateInstance() == false) { //构造提示 TCHAR szString[128] = TEXT(""); _sntprintf(szString, CountArray(szString), TEXT("[ %s ] 服务组件不存在或者加载失败,请重新安装服务组件"), pGameServerInfo->szGameName); //提示消息 if (bAutoMode == true) CTraceService::TraceString(szString, TraceLevel_Exception); else AfxMessageBox(szString, MB_ICONERROR); return false; } //模块属性 GameServiceManager->GetServiceAttrib(m_ModuleInitParameter.GameServiceAttrib); ///---DLL提供配置 ///+++赋值前,清空下 memset(&m_ModuleInitParameter.GameServiceOption, 0, sizeof(m_ModuleInitParameter.GameServiceOption)); //挂接属性 m_ModuleInitParameter.GameServiceOption.wGameID = pGameServerInfo->wGameID; m_ModuleInitParameter.GameServiceOption.wKindID = pGameServerInfo->wKindID; m_ModuleInitParameter.GameServiceOption.wNodeID = pGameServerInfo->wNodeID; m_ModuleInitParameter.GameServiceOption.wSortID = pGameServerInfo->wSortID; m_ModuleInitParameter.GameServiceOption.wServerID = pGameServerInfo->wServerID; //税收配置 m_ModuleInitParameter.GameServiceOption.lCellScore = pGameServerInfo->lCellScore; m_ModuleInitParameter.GameServiceOption.wRevenueRatio = pGameServerInfo->wRevenueRatio; m_ModuleInitParameter.GameServiceOption.lServiceScore = pGameServerInfo->lServiceScore; //房间配置 m_ModuleInitParameter.GameServiceOption.lRestrictScore = pGameServerInfo->lRestrictScore; m_ModuleInitParameter.GameServiceOption.lMinTableScore = pGameServerInfo->lMinTableScore; m_ModuleInitParameter.GameServiceOption.lMinEnterScore = pGameServerInfo->lMinEnterScore; m_ModuleInitParameter.GameServiceOption.lMaxEnterScore = pGameServerInfo->lMaxEnterScore; //会员限制 m_ModuleInitParameter.GameServiceOption.cbMinEnterMember = pGameServerInfo->cbMinEnterMember; m_ModuleInitParameter.GameServiceOption.cbMaxEnterMember = pGameServerInfo->cbMaxEnterMember; //房间配置 m_ModuleInitParameter.GameServiceOption.dwServerRule = pGameServerInfo->dwServerRule; m_ModuleInitParameter.GameServiceOption.dwAttachUserRight = pGameServerInfo->dwAttachUserRight; //房间属性 m_ModuleInitParameter.GameServiceOption.wMaxPlayer = pGameServerInfo->wMaxPlayer; m_ModuleInitParameter.GameServiceOption.wTableCount = pGameServerInfo->wTableCount; m_ModuleInitParameter.GameServiceOption.wServerPort = pGameServerInfo->wServerPort; m_ModuleInitParameter.GameServiceOption.wServerKind = pGameServerInfo->wServerKind; m_ModuleInitParameter.GameServiceOption.wServerType = pGameServerInfo->wServerType; lstrcpyn(m_ModuleInitParameter.GameServiceOption.szServerName, pGameServerInfo->szServerName, LEN_SERVER); lstrcpyn(m_ModuleInitParameter.GameServiceOption.szServerPasswd, pGameServerInfo->szServerPasswd, LEN_PASSWORD); //分组属性 m_ModuleInitParameter.GameServiceOption.cbDistributeRule = pGameServerInfo->cbDistributeRule; m_ModuleInitParameter.GameServiceOption.wMinDistributeUser = pGameServerInfo->wMinDistributeUser; m_ModuleInitParameter.GameServiceOption.wDistributeTimeSpace = pGameServerInfo->wDistributeTimeSpace; m_ModuleInitParameter.GameServiceOption.wDistributeDrawCount = pGameServerInfo->wDistributeDrawCount; m_ModuleInitParameter.GameServiceOption.wMinPartakeGameUser = pGameServerInfo->wMinPartakeGameUser; m_ModuleInitParameter.GameServiceOption.wMaxPartakeGameUser = pGameServerInfo->wMaxPartakeGameUser; //连接信息 lstrcpyn(m_ModuleInitParameter.GameServiceOption.szDataBaseName, pGameServerInfo->szDataBaseName, CountArray(m_ModuleInitParameter.GameServiceOption.szDataBaseName)); lstrcpyn(m_ModuleInitParameter.GameServiceOption.szDataBaseAddr, pGameServerInfo->szDataBaseAddr, CountArray(m_ModuleInitParameter.GameServiceOption.szDataBaseAddr)); //数据设置 UINT uCustomRuleSize = sizeof(m_ModuleInitParameter.GameServiceOption.cbCustomRule); CopyMemory(m_ModuleInitParameter.GameServiceOption.cbCustomRule, pGameServerInfo->cbCustomRule, uCustomRuleSize); ///+++此玩法的场馆信息 CServerInfoManager serverInfoManager; std::vector vecVenueInfo; //场馆列表 serverInfoManager.LoadVenueInfos(m_ModuleInitParameter.GameServiceAttrib.wKindID, vecVenueInfo); m_ModuleInitParameter.vecVenueInfo = vecVenueInfo; ///+++如果是金币场,使用场馆的最新配置 if (m_ModuleInitParameter.GameServiceOption.wNodeID > 0) { for (std::vector::iterator it = vecVenueInfo.begin(); it != vecVenueInfo.end(); it++) { if (it->wVenueID == m_ModuleInitParameter.GameServiceOption.wNodeID) { m_ModuleInitParameter.GameServiceOption.lCellScore = it->sBaseScore; m_ModuleInitParameter.GameServiceOption.lMinEnterScore = it->sMinScore; m_ModuleInitParameter.GameServiceOption.lMaxEnterScore = it->sMaxScore; m_ModuleInitParameter.GameServiceOption.lRestrictScore = it->lRestrictScore; m_ModuleInitParameter.GameServiceOption.lServiceScore = it->sServiceScore; m_ModuleInitParameter.GameServiceOption.wRevenueRatio = it->wRevenueRatio; lstrcpyn(m_ModuleInitParameter.GameServiceOption.szExtConfig, it->szExtConfig, CountArray(it->szExtConfig)); break; } } } return true; } BEGIN_MESSAGE_MAP(CDlgServerItem, CDialogEx) ON_BN_CLICKED(IDOK, &CDlgServerItem::OnBnClickedOk) ON_BN_CLICKED(IDC_LOAD_SERVER, &CDlgServerItem::OnBnClickedLoadServer) ON_BN_CLICKED(IDC_RELOAD_LIST, &CDlgServerItem::OnBnClickedReloadList) ON_BN_CLICKED(IDC_DELETE_SERVER, &CDlgServerItem::OnBnClickedDeleteServer) ON_BN_CLICKED(IDC_SERVICE_ATTRIB, &CDlgServerItem::OnBnClickedServiceAttrib) ON_NOTIFY(LVN_ITEMCHANGED, IDC_SERVER_LIST, &CDlgServerItem::OnLvnItemchangedServerList) ON_NOTIFY(NM_DBLCLK, IDC_SERVER_LIST, &CDlgServerItem::OnNMDblclkServerList) ON_WM_TIMER() END_MESSAGE_MAP() // CDlgServerItem 消息处理程序 void CDlgServerItem::OnBnClickedOk() { return; } void CDlgServerItem::OnBnClickedLoadServer() { //获取选择 ASSERT(m_ServerListControl.GetFirstSelectedItemPosition() != NULL); POSITION Position = m_ServerListControl.GetFirstSelectedItemPosition(); //获取房间 INT nListItem = m_ServerListControl.GetNextSelectedItem(Position); tagGameServerInfo * pGameServerInfo = (tagGameServerInfo *)m_ServerListControl.GetItemData(nListItem); //设置变量 if ((pGameServerInfo != NULL) && (GetModuleInitParameter(pGameServerInfo, false) == true)) { //修改所选择节点 TCHAR szWorkDir[MAX_PATH] = TEXT(""); CWHService::GetWorkDirectory(szWorkDir, CountArray(szWorkDir)); //构造路径 TCHAR szIniFile[MAX_PATH] = TEXT(""); _sntprintf(szIniFile, CountArray(szIniFile), TEXT("%s\\Parameter.ini"), szWorkDir); CString csText; csText.Format(L"%d", pGameServerInfo->wServerID); //保存 BOOL bRet = WritePrivateProfileString(TEXT("Server"), TEXT("ServerID"), csText, szIniFile); EndDialog(IDC_LOAD_SERVER); } return; } void CDlgServerItem::OnBnClickedReloadList() { //加载列表 LoadDBServerItem(); return; } void CDlgServerItem::OnBnClickedDeleteServer() { //获取选择 ASSERT(m_ServerListControl.GetFirstSelectedItemPosition() != NULL); POSITION Position = m_ServerListControl.GetFirstSelectedItemPosition(); //获取房间 INT nListItem = m_ServerListControl.GetNextSelectedItem(Position); tagGameServerInfo * pGameServerInfo = (tagGameServerInfo *)m_ServerListControl.GetItemData(nListItem); //设置变量 if (pGameServerInfo != NULL) { //构造提示 TCHAR szString[128] = TEXT(""); _sntprintf(szString, CountArray(szString), TEXT("确实要删除 [ %s ] 游戏房间吗?"), pGameServerInfo->szServerName); //提示消息 if (AfxMessageBox(szString, MB_ICONQUESTION | MB_YESNO) != IDYES) return; //删除房间 CServerInfoManager ServerInfoManager; if (ServerInfoManager.DeleteGameServer(pGameServerInfo->wServerID) == false) return; //删除列表 m_ServerListControl.DeleteItem(nListItem); m_ServerInfoBuffer.DeleteServerInfo(pGameServerInfo->wServerID); //设置列表 if (m_ServerListControl.GetItemCount() > 0) { //设置变量 INT nItemCount = m_ServerListControl.GetItemCount(); INT nNextItem = (nListItem >= nItemCount) ? (nItemCount - 1) : nListItem; //设置选择 m_ServerListControl.SetItemState(nNextItem, LVIS_SELECTED, LVIS_SELECTED); } //更新控制 UpdateControlStatus(); } return; } void CDlgServerItem::OnBnClickedServiceAttrib() { return; } void CDlgServerItem::OnLvnItemchangedServerList(NMHDR *pNMHDR, LRESULT *pResult) { //更新控制 UpdateControlStatus(); return; } void CDlgServerItem::OnNMDblclkServerList(NMHDR *pNMHDR, LRESULT *pResult) { //加载配置 if (((NMITEMACTIVATE *)pNMHDR)->iItem != LB_ERR) { OnBnClickedLoadServer(); } return; } BOOL CDlgServerItem::OnInitDialog() { CDialogEx::OnInitDialog(); //设置资源 AfxSetResourceHandle(GetModuleHandle(NULL)); //加载房间 LoadDBServerItem(); if (g_StartP.iAuto == 1) { SetTimer(3, 1000, NULL); //自动选择 } return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } void CDlgServerItem::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 if (nIDEvent == 3) { KillTimer(nIDEvent); if (g_StartP.wServerID > 0) EndDialog(IDC_LOAD_SERVER); } CDialogEx::OnTimer(nIDEvent); }