📄 gameservdlg.cpp
字号:
}
}
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 + -