manager.cpp

来自「国外网游源码....除工具源码缺少之外,其余程序都全...至于,什么游戏,因为国」· C++ 代码 · 共 442 行

CPP
442
字号
#include "stdafx.h"
#include "local.h"
#include "manager.h"
#include "config.h"
#include "setup.h"
#include "info.h"
#include "resource.h"
#include "MasterServer.h"


extern HINSTANCE g_hInst;


CManager::CManager()
{
	m_hDlg = NULL;
	m_hInfo = NULL;
	m_cpSetup = NULL;
	m_cpInfo = NULL;

	int i=MAX_SERVERTYPE;
	while(i--)	m_cpConfig[i] = NULL;
}

CManager::~CManager()
{
	if(m_hConsole)
		SetForegroundWindow(m_hConsole);

	if(m_hWnd)	DestroyWindow(m_hWnd);
	if(m_hDlg)	DestroyWindow(m_hDlg);
	if(m_hInfo)	DestroyWindow(m_hInfo);

	SAFE_DELETE(m_cpSetup);
	SAFE_DELETE(m_cpInfo);

	int i=MAX_SERVERTYPE;
	while(i--)	SAFE_DELETE(m_cpConfig[i]);

	_printf("\nPress any key to continue");
	_getch();

	FreeConsole();
}

HWND CManager::Init()
{
	//傍烹牧飘费 檬扁拳(comctl32.lib 傅农)
	INITCOMMONCONTROLSEX icex;
	icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
	icex.dwICC = ICC_INTERNET_CLASSES;
	InitCommonControlsEx(&icex);

	//府摹俊叼飘 扼捞宏矾府 肺靛
//	HMODULE hMod=LoadLibrary("Riched20.dll");
//	DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG1), HWND_DESKTOP, MainDlgProc); 
//	FreeLibrary(hMod);

	m_hWnd = CreateDialog(g_hInst, MAKEINTRESOURCE(IDD_MANAGER), NULL, (DLGPROC)DlgProc);
	if(!m_hWnd)	return NULL;

	SetWindowPos(m_hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE);
	ShowWindow(m_hWnd, SW_SHOW);

	InitServerList(m_hWnd);

	m_cpSetup = new CSetup;
	m_cpInfo = new CInfo;
	m_cpConfig[M_MASTERSERVER] = (CConfig *)new CMSConfig;
	m_cpConfig[M_LOBBYSERVER] = (CConfig *)new CLSConfig;
	m_cpConfig[M_GAMESERVER] = (CConfig *)new CGSConfig;
	m_cpConfig[M_PATCHSERVER] = (CConfig *)new CPSConfig;
	m_cpConfig[M_RELAYSERVER] = (CConfig *)new CPSConfig;


	RECT rect;
	char szTitle[256];

	GetWindowRect(m_hWnd, &rect);

	sprintf(szTitle, "%s:%s - MasterServer [Manager]", g_cMasterServer.m_cConfig.sys_name, g_cMasterServer.m_cConfig.sys_group);
	SetWindowText(m_hWnd, szTitle);
	sprintf(szTitle, "%s:%s - MasterServer [Monitor]", g_cMasterServer.m_cConfig.sys_name, g_cMasterServer.m_cConfig.sys_group);
	m_hConsole = _console(rect.right, rect.top, 640, rect.bottom, 80, 500, szTitle);
	if(!m_hConsole)	return false;

	SetForegroundWindow(m_hConsole);
	SetForegroundWindow(m_hWnd);

	m_bSendAll = true;

	return m_hWnd;
}

void CManager::InitServerList(HWND hWnd)
{
	LVCOLUMN lvCol;

	HWND hList = GetDlgItem(hWnd, IDC_SERVERLIST);

	ListView_SetExtendedListViewStyle(hList, LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES);

	lvCol.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
	lvCol.fmt = LVCFMT_CENTER;
	lvCol.cx = 34;
	lvCol.pszText = "ID";
	lvCol.iSubItem = 0;
	SendMessage(hList, LVM_INSERTCOLUMN, 0, (LPARAM)&lvCol);

	lvCol.cx = 82;
	lvCol.pszText = "Name";
	lvCol.iSubItem = 1;
	SendMessage(hList, LVM_INSERTCOLUMN, 1, (LPARAM)&lvCol);

	lvCol.cx = 42;
	lvCol.pszText = "State";
	lvCol.iSubItem = 2;
	SendMessage(hList, LVM_INSERTCOLUMN, 2, (LPARAM)&lvCol);

	lvCol.cx = 86;
	lvCol.pszText = "RemoteIP";
	lvCol.iSubItem = 3;
	SendMessage(hList, LVM_INSERTCOLUMN, 3, (LPARAM)&lvCol);

	lvCol.cx = 42;
	lvCol.pszText = "Port";
	lvCol.iSubItem = 4;
	SendMessage(hList, LVM_INSERTCOLUMN, 4, (LPARAM)&lvCol);
}

void CManager::SetSelectedServer(CLocal *pLocal)
{
	if(pLocal->m_iList == -1)	return;

	HWND hList = GetDlgItem(m_hWnd, IDC_SERVERLIST);

	ListView_SetItemState(hList, pLocal->m_iList, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED);
}

CLocal *CManager::GetSelectedServer()
{
	HWND hList = GetDlgItem(m_hWnd, IDC_SERVERLIST);
	int iSelection = ListView_GetNextItem(hList, -1, LVNI_ALL | LVNI_SELECTED);

	if(iSelection == -1)	return NULL;

	return &g_cMasterServer.m_cpLocal[iSelection];
}

void CManager::SetServerList(CLocal *pLocal)
{
	char buf[50];
	LVITEM lvItem;
	HWND hList = GetDlgItem(m_hWnd, IDC_SERVERLIST);

	lvItem.mask = LVIF_TEXT;
	lvItem.state = 0;
	lvItem.stateMask = 0;
	lvItem.iSubItem = 0;
	lvItem.pszText = _ui64toa(pLocal->m_nAccount, buf, 10);

	if(pLocal->m_iList == -1)
	{
		lvItem.iItem = (short)SendMessage(hList, LVM_GETITEMCOUNT, 0, 0);
		SendMessage(hList, LVM_INSERTITEM, 0, (LPARAM)&lvItem);
	}
	else
	{
		lvItem.iItem = pLocal->m_iList;
		SendMessage(hList, LVM_SETITEM, 0, (LPARAM)&lvItem);
	}

	lvItem.iSubItem = 1;
	lvItem.pszText = _T(pLocal->m_szName);
	SendMessage(hList, LVM_SETITEM, 0, (LPARAM)&lvItem);

	lvItem.iSubItem = 2;
	switch(pLocal->m_nState)
	{
	case CClient::STATE_CLOSE:			lvItem.pszText = "Close";		break;
	case CClient::STATE_DISCONNECT:		lvItem.pszText = "Open";		break;
	case CClient::STATE_LOGIN:			lvItem.pszText = "Start";		break;
	default:							lvItem.pszText = "Unknown";		break;
	}
	SendMessage(hList, LVM_SETITEM, 0, (LPARAM)&lvItem);

	IN_ADDR in_addr;
	in_addr.s_addr = pLocal->m_dwRemoteIP;
	lvItem.iSubItem = 3;
	lvItem.pszText = inet_ntoa(in_addr);
	SendMessage(hList, LVM_SETITEM, 0, (LPARAM)&lvItem);

	lvItem.iSubItem = 4;
	lvItem.pszText = itoa(pLocal->m_wPort, buf, 10);
	SendMessage(hList, LVM_SETITEM, 0, (LPARAM)&lvItem);

	pLocal->m_iList = (short)lvItem.iItem;
}

LRESULT CALLBACK CManager::DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
//	if(msg == WM_SIZE)	g_active = !(wParam == SIZE_MAXHIDE || wParam == SIZE_MINIMIZED);

	switch(msg)
	{
	case WM_INITDIALOG:
		SetDlgItemText(hDlg, IDC_CHAT, "----------------------------------------- Broadcast -------------------------------------------");
		CheckRadioButton(hDlg, IDC_SENDALL, IDC_SENDSEL, IDC_SENDALL);
		break;

	case WM_DESTROY:
		g_cMasterServer.Shotdown();
		break;

	case WM_NOTIFY:
		if(wParam == IDC_SERVERLIST)
		{
			LPNMHDR hdr = (LPNMHDR)lParam;
			LPNMLISTVIEW nlv = (LPNMLISTVIEW)lParam;
//			LPNMITEMACTIVATE nia;

			switch(hdr->code)
			{
			case LVN_ITEMCHANGED:
				if(nlv->uChanged == LVIF_STATE && nlv->uNewState == (LVIS_SELECTED | LVIS_FOCUSED))
				{
					g_cMasterServer.GetManager()->SetButtonState(nlv->iItem);

					if(!g_cMasterServer.GetManager()->m_hInfo)	break;

					g_cMasterServer.GetManager()->SetInfomation(nlv->iItem);
				}
				break;

			case NM_DBLCLK:
				if(g_cMasterServer.GetManager()->m_hInfo)	break;
				g_cMasterServer.GetManager()->m_hInfo = CreateDialog(g_hInst, MAKEINTRESOURCE(IDD_INFO), hDlg, (DLGPROC)CInfo::DlgProc);
				if(g_cMasterServer.GetManager()->m_hInfo)
				{
					RECT rect;
					int x, y, width, height;

					GetWindowRect(g_cMasterServer.GetManager()->m_hWnd, &rect);
					x=rect.left;
					y=rect.bottom;
					GetWindowRect(g_cMasterServer.GetManager()->m_hInfo, &rect);
					width = rect.right - rect.left;
					height = rect.bottom - rect.top;

					MoveWindow(g_cMasterServer.GetManager()->m_hInfo, x, y, width, height, TRUE);
					ShowWindow(g_cMasterServer.GetManager()->m_hInfo, SW_SHOW);
					SetFocus(GetDlgItem(g_cMasterServer.GetManager()->m_hWnd, IDC_SERVERLIST));

					g_cMasterServer.GetManager()->SetInfomation(nlv->iItem);
				}
				break;
			}
		}
		break;

	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
		case IDC_START:
			g_cMasterServer.Open();
			break;

		case IDC_SETUP:
			if(g_cMasterServer.GetManager()->m_hDlg)	break;
			g_cMasterServer.GetManager()->m_hDlg = CreateDialog(g_hInst, MAKEINTRESOURCE(IDD_SETUP), hDlg, (DLGPROC)CSetup::DlgProc);
			if(!g_cMasterServer.GetManager()->m_hDlg)	break;

			ShowWindow(g_cMasterServer.GetManager()->m_hDlg, SW_SHOW);
			break;

		case IDC_CONFIG:
			if(!g_cMasterServer.GetManager()->m_hDlg)
			{
				CLocal *pLocal = g_cMasterServer.GetManager()->GetSelectedServer();
				if(!pLocal)
				{
					g_cMasterServer.GetManager()->m_hDlg = CreateDialog(g_hInst, MAKEINTRESOURCE(IDD_CONFIGMS), hDlg, (DLGPROC)CMSConfig::DlgProc);
				}
				else
				{
					if(pLocal->m_nState != CClient::STATE_LOGIN && pLocal->m_nType != M_MASTERSERVER)
						break;

					switch(pLocal->m_nType)
					{
					case M_MASTERSERVER:
						g_cMasterServer.GetManager()->m_hDlg = CreateDialog(g_hInst, MAKEINTRESOURCE(IDD_CONFIGMS), hDlg, (DLGPROC)CMSConfig::DlgProc);
						break;
					case M_LOBBYSERVER:
						g_cMasterServer.GetManager()->m_hDlg = CreateDialog(g_hInst, MAKEINTRESOURCE(IDD_CONFIGLS), hDlg, (DLGPROC)CLSConfig::DlgProc);
						break;
					case M_GAMESERVER:
						g_cMasterServer.GetManager()->m_hDlg = CreateDialog(g_hInst, MAKEINTRESOURCE(IDD_CONFIGGS), hDlg, (DLGPROC)CGSConfig::DlgProc);
						break;
					case M_PATCHSERVER:
						g_cMasterServer.GetManager()->m_hDlg = CreateDialog(g_hInst, MAKEINTRESOURCE(IDD_CONFIGPS), hDlg, (DLGPROC)CPSConfig::DlgProc);
						break;
					case M_RELAYSERVER:
						g_cMasterServer.GetManager()->m_hDlg = CreateDialog(g_hInst, MAKEINTRESOURCE(IDD_CONFIGPS), hDlg, (DLGPROC)CPSConfig::DlgProc);
						break;
					}
				}

				if(g_cMasterServer.GetManager()->m_hDlg)
					ShowWindow(g_cMasterServer.GetManager()->m_hDlg, SW_SHOW);
			}
			break;

		case IDC_EXIT:
#ifdef	_MODE_SERVICE
			g_cMasterServer.Close();		//蜡历啊 规俊辑 唱柯 饶 辆丰
#else
			g_cMasterServer.Shotdown();		//碍力辆丰
#endif
			break;
		}
		break;
	}

   	return FALSE;
}

void CManager::SetButtonWaiting()
{
	EnableWindow(GetDlgItem(m_hWnd, IDC_ADDSERVER), TRUE);
	EnableWindow(GetDlgItem(m_hWnd, IDC_DELSERVER), TRUE);
	EnableWindow(GetDlgItem(m_hWnd, IDC_START), TRUE);
}

void CManager::SetButtonStart()
{
	SetDlgItemText(m_hWnd, IDC_CHAT, "");

	EnableWindow(GetDlgItem(m_hWnd, IDC_CHAT), TRUE);
	EnableWindow(GetDlgItem(m_hWnd, IDC_SEND), TRUE);
	EnableWindow(GetDlgItem(m_hWnd, IDC_SERVERLIST), TRUE);
	EnableWindow(GetDlgItem(m_hWnd, IDC_START), FALSE);
}

void CManager::SetButtonState(int iItem)
{
	CLocal *pLocal = g_cMasterServer.m_cpLocal + iItem;
	BOOL bEnable = (pLocal->m_nState == CClient::STATE_LOGIN);

	EnableWindow(GetDlgItem(m_hWnd, IDC_SEND), m_bSendAll);
	EnableWindow(GetDlgItem(m_hWnd, IDC_CONFIG), bEnable);
	EnableWindow(GetDlgItem(m_hWnd, IDC_STOP), (bEnable && pLocal->m_nType != M_MASTERSERVER));
}

void CManager::SetInfomation(int iItem)
{
	if(!m_hInfo)	return;

	CLocal *pLocal = g_cMasterServer.m_cpLocal + iItem;

	char szTitle[LEN_BUFFER+1] = {"MasterServer [Infomation] - "};
	switch(pLocal->m_nType)
	{
	case M_MASTERSERVER:
		strcat(szTitle, "MasterServer : ");
		break;
	case M_LOBBYSERVER:
		strcat(szTitle, "LobbyServer : ");
		break;
	case M_GAMESERVER:
		strcat(szTitle, "GameServer : ");
		break;
	case M_PATCHSERVER:
		strcat(szTitle, "PatchServer : ");
		break;
	case M_RELAYSERVER:
		strcat(szTitle, "RelayServer : ");
		break;
	}

	strcat(szTitle, pLocal->m_szName);
	SetWindowText(m_hInfo, szTitle);

	m_cpInfo->SetCurList(iItem);
	m_cpInfo->SetServerStart(pLocal->m_lStartTime);
	m_cpInfo->SetServerEnd(pLocal->m_lEndTime);

	if(pLocal->m_nType == M_RELAYSERVER)
	{
		m_cpInfo->SetCurPacketSize(pLocal->m_nCurPacketSize);
		m_cpInfo->SetMaxPacketSize(pLocal->m_nMaxPacketSize);
	}
	else
	{
		m_cpInfo->SetCurUserCnt(pLocal->m_nUserCnt);
		m_cpInfo->SetMaxUserCnt(pLocal->m_nUserMax);
	}
}

void CManager::SetInfoServerStart(CLocal *pLocal)
{
	if(!m_cpInfo->IsCurList(pLocal->m_iList))
		return;

	m_cpInfo->SetServerStart(pLocal->m_lStartTime);
}

void CManager::SetInfoServerEnd(CLocal *pLocal)
{
	if(!m_cpInfo->IsCurList(pLocal->m_iList))
		return;

	m_cpInfo->SetServerEnd(pLocal->m_lEndTime);
}

void CManager::SetInfoUserCnt(CLocal *pLocal)
{
	if(pLocal->m_nType == M_RELAYSERVER)
	{
		if(pLocal->m_nCurPacketSize > pLocal->m_nMaxPacketSize)
			pLocal->m_nMaxPacketSize = pLocal->m_nCurPacketSize;

		if(!m_cpInfo->IsCurList(pLocal->m_iList))
			return;

		m_cpInfo->SetCurPacketSize(pLocal->m_nCurPacketSize);
		m_cpInfo->SetMaxPacketSize(pLocal->m_nMaxPacketSize);
	}
	else
	{
		if(pLocal->m_nUserCnt > pLocal->m_nUserMax)
			pLocal->m_nUserMax = pLocal->m_nUserCnt;

		if(!m_cpInfo->IsCurList(pLocal->m_iList))
			return;

		m_cpInfo->SetCurUserCnt(pLocal->m_nUserCnt);
		m_cpInfo->SetMaxUserCnt(pLocal->m_nUserMax);
	}
}

⌨️ 快捷键说明

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