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

📄 gameservdlg.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		}
	}
	
	return(CDialog::OnCommand(wParam, lParam));
}

void CGameServDlg::OnShowWindow(BOOL bShow, UINT nStatus) 
{
	static BOOL bNeedInit = TRUE;

	CDialog::OnShowWindow(bShow, nStatus);

	if (bShow && bNeedInit)
	{
		bNeedInit = FALSE;
		PostMessage(WM_COMMAND, ID_INIT);
	}
}

void CGameServDlg::UpdateServerMgr(DWORD timeDelta)
{
	// Sanity checks...

	if (!m_pServerMgr) return;
	if (!IsRunning()) return;


	// Let the server update...

	if (m_pServerMgr->Update(0) != DTRUE)
	{
		WriteServerError();
		StopServer();
	}
}

void CGameServDlg::WriteServerError()
{
	char str[256];

	if (m_pServerMgr)
	{
		m_pServerMgr->GetErrorString(str, sizeof(str)-1);
		WriteConsoleString(str);
	}
}

void CGameServDlg::OnClose() 
{
	CDialog::OnClose();
}

void CGameServDlg::OnTimer(UINT nIDEvent) 
{
	// Call the update function...

	//OnUpdate();
	UpdateTimers();
}


void CGameServDlg::OnUpdate()
{
	// Increment our counter...

	g_dwHandled++;


	// If we're currently changing levels, just return...

	if (IsLevelChanging()) return;


	// Get the current time...

	g_timeCur = timeGetTime();
	if (g_timeLast == 0) g_timeLast = g_timeCur;


	// Calculate the delta time...

	g_timeDelta = g_timeCur - g_timeLast;
	g_timeLast  = g_timeCur;


	// Update everything if we're running...

	if (IsRunning())
	{
		// Update the empty exit...

		if (g_bDoEmptyExit)
		{
			DEC_TIMER(g_timerEmptyExit, g_timeDelta);
			if (g_timerEmptyExit == 0)
			{
				g_bNoExitConfirm = TRUE;
				PostMessage(WM_CLOSE);
			}
		}


		// Update the server manager...

		UpdateServerMgr(g_timeDelta);
		if (!IsRunning()) return;


		// Update the game spy manager...

		UpdateGameSpyMgr(g_timeDelta);


		// Update the server registration...

		UpdateServerRegistration(g_timeDelta);
	}
}

void CGameServDlg::UpdateTimers()
{
	DWORD timeCur;

	if(!IsRunning())
		return;

	timeCur = timeGetTime();

	// Update the server time...

	m_timeServerRunning = timeCur - m_timeServerStart;
	if ((m_timeServerLast / 1000) != (m_timeServerRunning / 1000))
	{
		SetDlgItemText(IDC_SERVER_TIME, TimeToString(m_timeServerRunning));
		m_timeServerLast = m_timeServerRunning;
	}


	// Update the game/level time...

	m_timeLevelRunning = timeCur - m_timeLevelStart;
	if ((m_timeLevelLast / 1000) != (m_timeLevelRunning / 1000))
	{
		SetDlgItemText(IDC_GAME_TIME, TimeToString(m_timeLevelRunning));
		m_timeLevelLast = m_timeLevelRunning;
	}


	// Remove any update messages in the queue...

	RemoveMessage(WM_TIMER, 500);
}


void CGameServDlg::OnQuit() 
{
	PostMessage(WM_COMMAND, IDCANCEL);
}

void CGameServDlg::OnServer() 
{
	PostMessage(WM_COMMAND, IDCANCEL);
}

BOOL CGameServDlg::UpdateServerRegistration(DWORD timeDelta)
{
	// Sanity checks...

	if (!m_pServerMgr) return(FALSE);
	if (!g_ServerInfo.m_bRegisterServer) return(FALSE);
	if (g_ServerInfo.m_sAddress[0] == '\0') return(FALSE);


	// Check if it's really time to update...

	static DWORD timerUpdate = 7000;

	DEC_TIMER(timerUpdate, timeDelta);
	if (timerUpdate != 0) return(FALSE);
	else timerUpdate = s_timerWebRegUpdate * 1000;


	// Build the info string...

	CString sInfo;

	sInfo.Format("game=%s&name=%s&ip=%s&players=%i&version=%s", g_sWebGameName, g_ServerInfo.m_sName, g_sFullTcpIpAddress, m_pServerMgr->GetNumClients(), g_sWebGameVer);


	// Send the server info the web page...

	SendWebInfo(sInfo, FALSE);


	// All done...

	return(TRUE);
}

BOOL CGameServDlg::UpdateGameSpyMgr(DWORD timeDelta)
{
	// Sanity checks...

	if (!m_pServerMgr) return(FALSE);
	if (!g_ServerInfo.m_bUseGameSpy) return(FALSE);


	// Update the GameSpy manager...

	m_GameSpyMgr.Update();


	// All done...

	return(TRUE);
}

BOOL CGameServDlg::UnregisterServer()
{
	// Sanity checks...

	if (!g_ServerInfo.m_bRegisterServer) return(FALSE);
	if (g_ServerInfo.m_sAddress[0] == '\0') return(FALSE);


	// Build the info string...

	CString sInfo;

	sInfo.Format("game=%s&name=%s&ip=%s&players=-1&version=%s", g_sWebGameName, g_ServerInfo.m_sName, g_sFullTcpIpAddress, g_sWebGameVer);


	// Send the server info the web page...

	SendWebInfo(sInfo, FALSE);


	// All done...

	return(TRUE);
}

void CGameServDlg::OnShellMessage(char* pMsg)
{
	// Sanity checks...

	if (!pMsg) return;


	// Figure out what type of message this if...

	char sTemp[128];

	if (!Sparam_Get(sTemp, pMsg, NST_GENERICMESSAGE))
	{
		return;
	}

	switch (atoi(sTemp))
	{
		case NGM_STANDARDUPDATE:	OnStandardUpdate(pMsg); break;
		case NGM_LEVELCHANGING:		OnLevelChanging(pMsg); break;
		case NGM_LEVELCHANGED:		OnLevelChangeUpdate(pMsg); break;
		case NGM_LEVELCHANGESTOP:	OnLevelChangeStop(); break;
		case NGM_CONSOLEMSG:		OnConsoleMessageUpdate(pMsg); break;
	}
}


int ClientIDToIndex(ServerInterface *pInterface, DWORD id)
{
	int i, count;
	ClientInfo info;

	count = pInterface->GetNumClients();
	for(i=0; i < count; i++)
	{
		pInterface->GetClientInfo(i, &info);
		if(info.m_ClientID == id)
			return i;
	}
	return -1;
}


void CGameServDlg::OnStandardUpdate(char* pMsg)
{
	// Update the level info...

	char sTemp[128];

	if (Sparam_Get(sTemp, pMsg, NST_CURLEVEL))
	{
		SetDlgItemText(IDC_GAME_CURLEVEL, sTemp);
	}

	if (Sparam_Get(sTemp, pMsg, NST_NEXTLEVEL))
	{
		SetDlgItemText(IDC_GAME_NEXTLEVEL, sTemp);
	}


	// Get the current player selection info...

	CString sCurSel;
	CString sCurSelName;
	int     nCurSel = m_lbPlayers.GetCurSel();

	if (nCurSel != LB_ERR)
	{
		m_lbPlayers.GetText(nCurSel, sCurSel);

		int i = 0;

		while (sCurSel[i] >= 32)
		{
			sCurSelName += sCurSel[i];
			i++;
		}
	}


	// Update the player info...

	m_lbPlayers.ResetContent();

	int count    = 0;
	int cPlayers = 0;
	int nNewSel  = nCurSel;

	if (Sparam_Get(sTemp, pMsg, NST_PLRCOUNT))
	{
		count = atoi(sTemp);
	}

	for (int i = 1; i <= count; i++)
	{
		char sBase[32];
		char sName[64];

		int j = i-1;

		wsprintf(sBase, "%s%i", NST_PLRNAME_BASE, i);

		if (Sparam_Get(sName, pMsg, sBase))
		{
			strcpy(m_aPis[j].sName, sName);

			wsprintf(sBase, "%s%i", NST_PLRFRAG_BASE, i);

			if (Sparam_Get(sTemp, pMsg, sBase))
			{
				m_aPis[j].nFrags = atoi(sTemp);

				wsprintf(sBase, "%s%i", NST_PLRID_BASE, i);

				if (Sparam_Get(sTemp, pMsg, sBase))
				{
					m_aPis[j].dwID = atoi(sTemp);
				}
				else
				{
					m_aPis[j].dwID = 0;
				}
			}
		}

		int clientIndex = ClientIDToIndex(m_pServerMgr, m_aPis[j].dwID);
		m_aPis[j].dwPing = 0;
		if(clientIndex != -1)
		{
			ClientInfo info;

			if(m_pServerMgr->GetClientInfo(clientIndex, &info))
			{
				m_aPis[j].dwPing = (DWORD)(info.m_Ping * 1000.0f);
			}
		}

		cPlayers++;
	}


	// Sort the players...

	PLAYERINFO TempPi;

	for (i = 0; i < count - 1; i++)
	{
		for (int j = i+1; j < count; j++)
		{
			BOOL bSwap = FALSE;

			if (m_aPis[i].nFrags < m_aPis[j].nFrags) bSwap = TRUE;

			if (m_aPis[i].nFrags == m_aPis[j].nFrags)
			{
				if (strcmp(m_aPis[i].sName, m_aPis[j].sName) > 0) bSwap = TRUE;
			}

			if (bSwap)
			{
				memcpy(&TempPi,  &m_aPis[i], sizeof(PLAYERINFO));
				memcpy(&m_aPis[i], &m_aPis[j], sizeof(PLAYERINFO));
				memcpy(&m_aPis[j], &TempPi,  sizeof(PLAYERINFO));
			}
		}
	}


	// Add the players to the list box...

	nNewSel = LB_ERR;

	for (i = 0; i < count; i++)
	{
		CString sPlayer;
		sPlayer.Format("(%d)\t%s\t%i", m_aPis[i].dwPing, m_aPis[i].sName, m_aPis[i].nFrags);
		int nIndex = m_lbPlayers.AddString(sPlayer);

		if (nIndex != LB_ERR)
		{
			m_lbPlayers.SetItemData(nIndex, m_aPis[i].dwID);

			if (!sCurSelName.IsEmpty() && strcmp(m_aPis[i].sName, sCurSelName) == 0) nNewSel = nIndex;
		}
	}


	// Reselect the selected player if necessary...

	if (nNewSel != LB_ERR)
	{
		m_lbPlayers.SetCurSel(nNewSel);
	}

	CWnd* pWnd = GetDlgItem(IDC_PLAYERS_BOOT);
	if (pWnd)
	{
		pWnd->EnableWindow(nNewSel != LB_ERR);
	}


	// Check for empty exit...

	if (g_bEmptyExit)
	{
		if (m_cPlayers > 0 && cPlayers == 0)
		{
			WriteConsoleString(IDS_CONSOLE_LASTPLAYERLEFT);
			g_bDoEmptyExit   = TRUE;
			g_timerEmptyExit = g_nEmptyExitDelay * 1000;
		}
		else
		{
			if (cPlayers >= 1) g_bDoEmptyExit = FALSE;
		}
	}


	// Set the number of players...

	m_cPlayers = cPlayers;

	SetDlgItemInt(IDC_GAME_PLAYERS, cPlayers);
}

void CGameServDlg::OnLevelChanging(char* pMsg)
{
	// Flag the the level is changing...
	m_bLevelChanging = TRUE;
	EnterCriticalSection(&m_CS);
}

void CGameServDlg::OnLevelChangeUpdate(char* pMsg)
{
	OnLevelChangeStop();

	// Update the level info...

	char sTemp[128];

	if (Sparam_Get(sTemp, pMsg, NST_CURLEVEL))
	{
		SetDlgItemText(IDC_GAME_CURLEVEL, sTemp);
		m_sCurLevel = sTemp;
	}

	if (Sparam_Get(sTemp, pMsg, NST_NEXTLEVEL))
	{
		SetDlgItemText(IDC_GAME_NEXTLEVEL, sTemp);
	}


	// Reset the level timer...

	m_timeLevelStart = timeGetTime();
}

void CGameServDlg::OnLevelChangeStop()
{
	// Flag the level is done changing and is now changed...
	m_bLevelChanging = FALSE;
	LeaveCriticalSection(&m_CS);
}

void CGameServDlg::OnConsoleMessageUpdate(char* pMsg)
{
	char sTemp[128];

	if (Sparam_Get(sTemp, pMsg, NST_CONSOLEMSG))
	{
		WriteConsoleString(sTemp);
	}
}

void CGameServDlg::OnConsoleOutput(char* pMsg)
{
	WriteConsoleString(pMsg);
}

void CGameServDlg::OnConsoleSend() 
{
	if (!m_pServerMgr) return;

	char sCmd[128];
	sCmd[0] = '\0';
	if (GetDlgItemText(IDC_CONSOLE_COMMAND, sCmd, 120) == 0) return;

	WriteConsoleString(sCmd);
	SetDlgItemText(IDC_CONSOLE_COMMAND, "");

	m_pServerMgr->RunConsoleString(sCmd);

	UpdateConsoleVars();
}

void CGameServDlg::OnConsoleClear() 
{
	SetDlgItemText(IDC_CONSOLE_WINDOW, "");
}

BOOL CGameServDlg::DestroyWindow() 
{
	StopServer();
	Clear();
	return(CDialog::DestroyWindow());
}

void CGameServDlg::OnOutOfMemory()
{
	AfxMessageBox(IDS_ERROR_MEMORY);
	g_bNoExitConfirm = TRUE;
	SendMessage(WM_COMMAND, IDCANCEL);
	exit(0);
}

void CGameServDlg::OnCommandsNextLevel() 
{
	if (m_pServerMgr)
	{
		WriteConsoleString(IDS_NEXTLEVEL);
		m_pServerMgr->SendToServerShell("NEXTLEVEL");
	}
}

void CGameServDlg::OnPlayersBoot() 
{
	int nCurSel = m_lbPlayers.GetCurSel();
	if (nCurSel == LB_ERR) return;

	DWORD dwID = m_lbPlayers.GetItemData(nCurSel);

	m_pServerMgr->BootClient(dwID);
}

void CGameServDlg::OnSelchangePlayersList() 
{
	int nCurSel = m_lbPlayers.GetCurSel();

	CWnd* pWnd = GetDlgItem(IDC_PLAYERS_BOOT);
	if (pWnd)
	{
		pWnd->EnableWindow(nCurSel != LB_ERR);
	}
}

DWORD WINAPI ThreadUpdate(LPVOID lpParameter)
{
	// Sanity checks...

	if (!lpParameter) return(0);


	// Call the update until we are done...

	CGameServDlg* pDlg = (CGameServDlg*)lpParameter;
	HWND           hWnd = pDlg->GetSafeHwnd();

	while (pDlg->IsRunning())
	{
		DWORD timeNow = timeGetTime();

		if (timeNow - g_timeCur >= 8 && !pDlg->IsLevelChanging())
		{

#if USE_POSTMSG
			pDlg->RemoveMessage(WM_TIMER, 500);
			pDlg->PostMessage(WM_TIMER);
			g_dwPosted++;
#else
			EnterCriticalSection(pDlg->GetCS());
			pDlg->OnUpdate();
			LeaveCriticalSection(pDlg->GetCS());
#endif

		}

		Sleep(9);
	}


	// All done...

	s_bThreadDone = TRUE;
	SS_Trace("Thread is exiting...\n");
	return(TRUE);
}

void CGameServDlg::OnCancel() 
{
	if (g_bNoExitConfirm)
	{
		StopServer();
		CDialog::OnCancel();
		return;
	}

	CString str, title;

	str.LoadString(IDS_CHECKEXIT);

#ifdef _ADDON
	title.LoadString(IDS_APPNAME_AO);
#else
	title.LoadString(IDS_APPNAME);
#endif

	if (MessageBox(str, title, MB_YESNO | MB_ICONQUESTION) == IDYES)
	{
		StopServer();
		CDialog::OnCancel();
	}
}

void CGameServDlg::OnDestroy() 
{
	StopServer();
	CDialog::OnDestroy();
}

void CGameServDlg::RemoveMessage(int nMsg, int nMax)
{
	MSG msg;

	for (int i = 0; i < nMax; i++)
	{
		if (!PeekMessage(&msg, GetSafeHwnd(), nMsg, nMsg, PM_REMOVE))
		{
			return;
		}

		g_dwRemoved++;
	}
}

PLAYERINFO* CGameServDlg::GetFirstPlayerInfo()
{
	if (m_cPlayers <= 0) return(NULL);

	m_iPlayer = -1;

	return(GetNextPlayerInfo());
}

PLAYERINFO* CGameServDlg::GetNextPlayerInfo()
{
	m_iPlayer++;
	if (m_iPlayer >= m_cPlayers) return(NULL);

	return(&m_aPis[m_iPlayer]);
}

void CGameServDlg::OnCommandsOptions() 
{
	NetStart_DoOptionsDialog(GetSafeHwnd(), m_pServerMgr, &g_ServerOptions);
}

void CGameServDlg::OnProcessNetPacket(char* sData, DWORD nLen, BYTE senderAddr[4], DWORD senderPort)
{
	char sAddr[128];

	if (g_ServerInfo.m_bUseGameSpy)
	{
		if(nLen > 0 && sData[0] == '\\')
		{
			sprintf(sAddr, "%d.%d.%d.%d", senderAddr[0], senderAddr[1], senderAddr[2], senderAddr[3]);
			m_GameSpyMgr.OnQuery(sAddr, senderPort, sData, nLen);
		}
	}
}

void CGameServDlg::UpdateConsoleVars()
{
	HCONSOLEVAR hVar = NULL;
	DRESULT     dr   = m_pServerMgr->GetConsoleVar("SpyGameType", &hVar, NULL);
	if (dr == LT_OK && hVar)
	{
		char sTemp[64] = { "" };
		dr = m_pServerMgr->GetVarValueString(hVar, sTemp, 64);
		if (dr == LT_OK && sTemp[0] != '\0')
		{
			m_sGameSpyGameType = sTemp;
		}
	}

	hVar = NULL;
	dr   = m_pServerMgr->GetConsoleVar("SpyGameMode", &hVar, NULL);
	if (dr == LT_OK && hVar)
	{
		char sTemp[64] = { "" };
		dr = m_pServerMgr->GetVarValueString(hVar, sTemp, 64);
		if (dr == LT_OK && sTemp[0] != '\0')
		{
			m_sGameSpyGameMode = sTemp;
		}
	}
}

⌨️ 快捷键说明

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