|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// The copyright to the contents herein is the property of Valve, L.L.C.
// The contents may be used and/or copied only with the written permission of
// Valve, L.L.C., or in accordance with the terms and conditions stipulated in
// the agreement/contract under which the contents have been supplied.
//
// Purpose:
//
// $Workfile: $
// $Date: $
//
//-----------------------------------------------------------------------------
// $Log: $
//
// $NoKeywords: $
//=============================================================================
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include <assert.h>
// base vgui interfaces
#include <VGUI_Controls.h>
#include <VGUI_IInput.h>
#include <VGUI_ISurface.h>
#include <VGUI_IScheme.h>
#include <VGUI_IVGui.h>
#include <VGUI_MouseCode.h>
#include "filesystem.h"
// vgui controls
#include <VGUI_Button.h>
#include <VGUI_CheckButton.h>
#include <VGUI_ComboBox.h>
#include <VGUI_FocusNavGroup.h>
#include <VGUI_Frame.h>
#include <VGUI_KeyValues.h>
#include <VGUI_ListPanel.h>
#include <VGUI_MessageBox.h>
#include <VGUI_Panel.h>
#include <VGUI_PropertySheet.h>
#include <VGUI_ToggleButton.h>
#include <VGUI_QueryBox.h>
// serverbrowser headers
#include "inetapi.h"
//#include "msgbuffer.h"
#include "proto_oob.h"
#include "ServerContextMenu.h"
#include "socket.h"
#include "util.h"
#include "vinternetdlg.h"
#include "dialogcvarchange.h"
//#include "ModList.h"
#include "DialogGameInfo.h"
#include "ConfigPanel.h"
// game list
#include "FavoriteGames.h"
#include "GamePanelInfo.h"
// tracker stuff
//#include "Tracker.h"
#include "TrackerProtocol.h"
//#include "OnlineStatus.h"
// interface to game engine / tracker
#include "IRunGameEngine.h"
using namespace vgui;
static VInternetDlg *s_InternetDlg = NULL; CSysModule * g_hTrackerNetModule = NULL;
//-----------------------------------------------------------------------------
// Purpose: Constructor
//-----------------------------------------------------------------------------
VInternetDlg::VInternetDlg( unsigned int userid ) : Frame(NULL, "VInternetDlg") { s_InternetDlg = this; m_iUserID=userid; m_bLoggedIn=false;
MakePopup();
m_pSavedData = NULL;
// create the controls
m_pContextMenu = new CServerContextMenu(this); // m_pContextMenu->SetVisible(false);
m_pFavoriteGames = new CFavoriteGames(this);
SetMinimumSize(570, 550);
m_pGameList = m_pFavoriteGames;
// property sheet
m_pTabPanel = new PropertySheet(this, "GameTabs");
m_pTabPanel->SetTabWidth(150); // m_pTabPanel->SetScrolling(true);
m_pTabPanel->AddPage(m_pFavoriteGames, "My Servers"); m_pTabPanel->AddActionSignalTarget(this);
m_pStatusLabel = new Label(this, "StatusLabel", "");
LoadControlSettings("Admin\\DialogAdminServer.res");
m_pStatusLabel->SetText("");
// Setup tracker objects
// tracker doc
//g_pTrackerDoc = new CTrackerDoc();
// create the networking
/*m_pServerSession = new CServerSession();
// load networking dll
char szDLL[_MAX_PATH];
// now load the net interface so we can use it
g_pFullFileSystem->GetLocalPath("Friends/TrackerNET.dll", szDLL); g_pFullFileSystem->GetLocalCopy(szDLL); g_hTrackerNetModule = Sys_LoadModule(szDLL);
CreateInterfaceFn netFactory = Sys_GetFactory(g_hTrackerNetModule); m_pNet = (ITrackerNET *)netFactory(TRACKERNET_INTERFACE_VERSION, NULL);
m_pNet->Initialize(27030, 27100); m_iServerAddr=m_pNet->GetNetAddress("tracker3.valvesoftware.com:1200"); // uncomment this to do the "tracker" magic
//SendInitialLogin();
*/
// load filters
LoadFilters(); // load window settings
LoadDialogState(this, "AdminServer");
// let us be ticked every frame
ivgui()->AddTickSignal(this->GetVPanel());
}
//-----------------------------------------------------------------------------
// Purpose: Destructor
//-----------------------------------------------------------------------------
VInternetDlg::~VInternetDlg() { // set a flag indicating the threads should kill themselves
// m_pNet->Shutdown(false);
// m_pNet->deleteThis();
// m_pNet = NULL;
Sys_UnloadModule(g_hTrackerNetModule);
}
//-----------------------------------------------------------------------------
// Purpose: Called once to set up
//-----------------------------------------------------------------------------
void VInternetDlg::Initialize() { SetTitle("Admin", true); SetVisible(false); }
//-----------------------------------------------------------------------------
// Purpose:
// Input : serverID -
// Output : serveritem_t
//-----------------------------------------------------------------------------
serveritem_t &VInternetDlg::GetServer(unsigned int serverID) { return m_pGameList->GetServer(serverID); }
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void VInternetDlg::Open( void ) { m_pTabPanel->RequestFocus(); // if serverbrowser file is not there we will try to transfer the favorites list.
FileHandle_t f = g_pFullFileSystem->Open("AdminServer.vdf", "rb"); if (f) { g_pFullFileSystem->Close( f ); }
surface()->SetMinimized(GetVPanel(), false); SetVisible(true); RequestFocus(); m_pTabPanel->RequestFocus(); MoveToFront(); }
//-----------------------------------------------------------------------------
// Purpose: relayouts the dialogs controls
//-----------------------------------------------------------------------------
void VInternetDlg::PerformLayout() { BaseClass::PerformLayout();
int x, y, wide, tall; GetClientArea(x, y, wide, tall); // game list in middle
m_pTabPanel->SetBounds(8, y + 8, GetWide() - 16, tall - (28)); x += 4;
// status text along bottom
m_pStatusLabel->SetBounds(x + 2, (tall - y) + 40, wide - 6, 20); m_pStatusLabel->SetContentAlignment(Label::a_northwest);
Repaint();
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void VInternetDlg::OnClose() { // bug here if you exit before logging in.
SaveDialogState(this, "AdminServer"); SaveFilters(); Frame::OnClose(); }
//-----------------------------------------------------------------------------
// Purpose: Loads filter settings from disk
//-----------------------------------------------------------------------------
void VInternetDlg::LoadFilters() { // free any old filters
if (m_pSavedData) { m_pSavedData->deleteThis(); }
m_pSavedData = new KeyValues ("Filters"); if (!m_pSavedData->LoadFromFile(g_pFullFileSystem, "Admin\\AdminServer.vdf", true, "PLATFORM")) { // file not successfully loaded, create the default key
m_pSavedData->FindKey("List", true); m_pSavedData->FindKey("List/Default", true); m_pSavedData->SetString("DefaultFilter", "Default"); }
// load favorite servers
KeyValues *favorites = m_pSavedData->FindKey("Favorites", true); m_bSaveRcon= m_pSavedData->FindKey("SaveRcon", true)->GetInt();
m_pFavoriteGames->LoadFavoritesList(favorites,m_bSaveRcon);
m_bAutoRefresh= m_pSavedData->FindKey("AutoRefresh", true)->GetInt(); if(!m_bAutoRefresh) { m_iRefreshTime=0; } else { m_iRefreshTime= m_pSavedData->FindKey("RefreshTime", true)->GetInt(); }
m_bGraphs= m_pSavedData->FindKey("ShowGraphs", true)->GetInt(); if(!m_bGraphs) { m_iGraphsRefreshTime=0; } else { m_iGraphsRefreshTime= m_pSavedData->FindKey("GraphsRefreshTime", true)->GetInt(); }
m_bDoLogging= m_pSavedData->FindKey("GetLogs", true)->GetInt();
m_pTabPanel->SetActivePage(m_pFavoriteGames); }
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void VInternetDlg::SaveFilters() {
// get the favorites list
KeyValues *favorites = m_pSavedData->FindKey("Favorites", true); m_pFavoriteGames->SaveFavoritesList(favorites,m_bSaveRcon); m_pSavedData->SaveToFile(g_pFullFileSystem, "Admin\\AdminServer.vdf", "PLATFORM");
}
void VInternetDlg::SetConfig(bool autorefresh,bool savercon,int refreshtime,bool graphs,int graphsrefreshtime,bool getlogs) { m_bAutoRefresh=autorefresh; m_bDoLogging = getlogs; m_bSaveRcon=savercon; if(m_bAutoRefresh) { m_iRefreshTime=refreshtime; } else { m_iRefreshTime=0; } m_bGraphs = graphs; if(graphs) { m_iGraphsRefreshTime=graphsrefreshtime; } else { m_iGraphsRefreshTime=0; }
m_pSavedData->SetInt("AutoRefresh",autorefresh); m_pSavedData->SetInt("SaveRcon",savercon); m_pSavedData->SetInt("RefreshTime",refreshtime); m_pSavedData->SetInt("GraphsRefreshTime",graphsrefreshtime); m_pSavedData->SetInt("ShowGraphs",graphs); m_pSavedData->SetInt("GetLogs",getlogs);
}
//-----------------------------------------------------------------------------
// Purpose: Updates status test at bottom of window
// Input : *fmt -
// ... -
//-----------------------------------------------------------------------------
void VInternetDlg::UpdateStatusText(const char *fmt, ...) { if ( !m_pStatusLabel ) return;
char str[ 1024 ]; va_list argptr; va_start( argptr, fmt ); vsprintf( str, fmt, argptr ); va_end( argptr );
m_pStatusLabel->SetText( str ); }
//-----------------------------------------------------------------------------
// Purpose: returns a pointer to a static instance of this dialog
// Output : VInternetDlg
//----------------------------------------------------------------------------
VInternetDlg *VInternetDlg::GetInstance() { return s_InternetDlg; }
//-----------------------------------------------------------------------------
// Purpose:
// Output : CServerContextMenu
//-----------------------------------------------------------------------------
CServerContextMenu *VInternetDlg::GetContextMenu() { return m_pContextMenu; }
//-----------------------------------------------------------------------------
// Purpose: begins the process of joining a server from a game list
// the game info dialog it opens will also update the game list
//-----------------------------------------------------------------------------
CDialogGameInfo *VInternetDlg::JoinGame(IGameList *gameList, unsigned int serverIndex) { // open the game info dialog, then mark it to attempt to connect right away
CDialogGameInfo *gameDialog = OpenGameInfoDialog(gameList, serverIndex);
// set the dialog name to be the server name
gameDialog->Connect();
return gameDialog; }
//-----------------------------------------------------------------------------
// Purpose: joins a game by a specified IP, not attached to any game list
//-----------------------------------------------------------------------------
CDialogGameInfo *VInternetDlg::JoinGame(int serverIP, int serverPort, const char *titleName) { // open the game info dialog, then mark it to attempt to connect right away
CDialogGameInfo *gameDialog = OpenGameInfoDialog(serverIP, serverPort, titleName);
// set the dialog name to be the server name
gameDialog->Connect();
return gameDialog; }
//-----------------------------------------------------------------------------
// Purpose: opens a game info dialog from a game list
//-----------------------------------------------------------------------------
CDialogGameInfo *VInternetDlg::OpenGameInfoDialog(IGameList *gameList, unsigned int serverIndex) { CDialogGameInfo *gameDialog = new CDialogGameInfo(gameList, serverIndex); serveritem_t &server = gameList->GetServer(serverIndex); gameDialog->Run(server.name); return gameDialog; }
//-----------------------------------------------------------------------------
// Purpose: opens a game info dialog by a specified IP, not attached to any game list
//-----------------------------------------------------------------------------
CDialogGameInfo *VInternetDlg::OpenGameInfoDialog(int serverIP, int serverPort, const char *titleName) { CDialogGameInfo *gameDialog = new CDialogGameInfo(NULL, 0, serverIP, serverPort); gameDialog->Run(titleName); return gameDialog; }
//-----------------------------------------------------------------------------
// Purpose: Save position and window size of a dialog from the .vdf file.
// Input : *dialog - panel we are setting position and size
// *dialogName - name of dialog in the .vdf file
//-----------------------------------------------------------------------------
void VInternetDlg::SaveDialogState(Panel *dialog, const char *dialogName) { // write the size and position to the document
int x, y, wide, tall; dialog->GetBounds(x, y, wide, tall);
KeyValues *data; data = m_pSavedData->FindKey(dialogName, true);
data->SetInt("x", x); data->SetInt("y", y); data->SetInt("w", wide); data->SetInt("t", tall); }
//-----------------------------------------------------------------------------
// Purpose: Load position and window size of a dialog from the .vdf file.
// Input : *dialog - panel we are setting position and size
// *dialogName - name of dialog in the .vdf file
//-----------------------------------------------------------------------------
void VInternetDlg::LoadDialogState(Panel *dialog, const char *dialogName) { // read the size and position from the document
KeyValues *data; data = m_pSavedData->FindKey(dialogName, true);
// calculate defaults, center of the screen
int x, y, wide, tall, dwide, dtall; int nx, ny, nwide, ntall; vgui::surface()->GetScreenSize(wide, tall); dialog->GetSize(dwide, dtall); x = (int)((wide - dwide) * 0.5); y = (int)((tall - dtall) * 0.5);
// set dialog
nx = data->GetInt("x", x); ny = data->GetInt("y", y); nwide = data->GetInt("w", dwide); ntall = data->GetInt("t", dtall);
// make sure it's on the screen. If it isn't, move it over so it is.
if (nx + nwide > wide) { nx = wide - nwide; } if (ny + ntall > tall) { ny = tall - ntall; } if (nx < 0) { nx = 0; } if (ny < 0) { ny = 0; }
dialog->SetBounds(nx, ny, nwide, ntall); }
//-----------------------------------------------------------------------------
// Purpose:
// Input : *dest -
// *src -
// bufsize -
//-----------------------------------------------------------------------------
void v_strncpy(char *dest, const char *src, int bufsize) { if (src == dest) return;
strncpy(dest, src, bufsize - 1); dest[bufsize - 1] = 0; }
void VInternetDlg::ConfigPanel() { CConfigPanel *config = new CConfigPanel(m_bAutoRefresh,m_bSaveRcon,m_iRefreshTime,m_bGraphs,m_iGraphsRefreshTime,m_bDoLogging); config->Run(); }
void VInternetDlg::OnManageServer(int serverID) { int i; serveritem_t &server = m_pFavoriteGames->GetServer(serverID); netadr_t addr; memcpy(addr.ip,server.ip,4); addr.port=(server.port & 0xff) << 8 | (server.port & 0xff00) >> 8; addr.type=NA_IP;
const char *netString = net->AdrToString(&addr); char tabName[20];
for(i=0;i<m_pTabPanel->GetNumPages();i++) {
m_pTabPanel->GetTabTitle(i,tabName,20); if(!stricmp(netString,tabName)) { break; } } if(i==m_pTabPanel->GetNumPages()) {
if(m_bSaveRcon) { // rcons are being saved
if(strlen(server.rconPassword)>0) { // this rcon password is already saved :)
ManageServer(serverID,server.rconPassword); return; } }
// otherwise ask for an rcon password
CDialogCvarChange *box = new CDialogCvarChange(); char id[5]; _snprintf(id,5,"%i",serverID); box->AddActionSignalTarget(this); box->SetTitle("Enter Rcon Password",true); box->SetLabelText("CvarNameLabel",""); box->SetLabelText("PasswordLabel","Password:");
box->MakePassword(); box->Activate(id, "","rconpassword","Enter Rcon Password for this Server"); } else { m_pTabPanel->SetActivePage(m_pTabPanel->GetPage(i)); } }
void VInternetDlg::OnPlayerDialog(vgui::KeyValues *data) { const char *type=data->GetString("type"); const char *playerName=data->GetString("player"); if(!stricmp(type,"rconpassword")) { const char *value=data->GetString("value"); serveritem_t &server = m_pFavoriteGames->GetServer(atoi(playerName)); // we encode the serverid in the name field :)
strncpy(server.rconPassword,value,sizeof(server.rconPassword)); // save this password
ManageServer(atoi(playerName),value); } }
void VInternetDlg::ManageServer(int serverID,const char *pass) { serveritem_t &server = m_pFavoriteGames->GetServer(serverID); netadr_t addr; memcpy(addr.ip,server.ip,4); addr.port=(server.port & 0xff) << 8 | (server.port & 0xff00) >> 8; addr.type=NA_IP;
m_pGamePanelInfo = new CGamePanelInfo(this,"Current Server",server.gameDir,m_iRefreshTime,m_iGraphsRefreshTime,m_bDoLogging);
m_pTabPanel->AddPage(m_pGamePanelInfo,net->AdrToString(&addr) );
m_pGamePanelInfo->ChangeGame(server,pass); m_pTabPanel->SetActivePage(m_pGamePanelInfo); }
void VInternetDlg::UpdateServer(serveritem_t &server) { m_pFavoriteGames->UpdateServer(server); }
void VInternetDlg::OnDeleteServer(int chosenPanel) { Panel *delPanel =m_pTabPanel->GetPage(chosenPanel); m_pTabPanel->DeletePage(delPanel);
InvalidateLayout(); Repaint();
}
vgui::PropertySheet *VInternetDlg::GetTabPanel() { return m_pTabPanel; }
void VInternetDlg::OnOpenContextMenu() { // CServerContextMenu *menu = VInternetDlg::GetInstance()->GetContextMenu();
// no selected rows, so don't display default stuff in menu
if( m_pTabPanel->GetActiveTab()->IsCursorOver() || m_pFavoriteGames->IsCursorOver() ) { m_pContextMenu->ShowMenu(this, -1, false, false, false,false); } }
void VInternetDlg::OnTick() {
//FIX ME!!!
return;
/*
// get the latest raw messages
IBinaryBuffer *buf; CNetAddress address; while ((buf = m_pNet->GetIncomingRawData(address)) != NULL) { //ReceivedRawData(buf, address);
buf->Release(); }
// get all the latest messages
IReceiveMessage *recv; while ((recv = m_pNet->GetIncomingData()) != NULL) {
// make sure the message is valid
if (!CheckMessageValidity(recv)) return;
// record the reception
// m_iLastReceivedTime = m_iTime;
// find the message id in the dispatch table
int dataName = recv->GetMsgID();
switch(dataName) { case TSVC_CHALLENGE: { int ChallengeKey; int status = COnlineStatus::ONLINE; int heartbeatRate =10000;//GetHeartBeatRate();
recv->ReadInt("challenge", ChallengeKey); recv->ReadUInt("sessionID", m_iSessionID); // respond to the challenge
ISendMessage *reply = CreateServerMessage(TCLS_RESPONSE); reply->SetSessionID( m_iSessionID );
reply->WriteInt("challenge", ChallengeKey); reply->WriteUInt("sessionID", m_iSessionID); reply->WriteInt("status", status); reply->WriteInt("build", 1994); reply->WriteInt("hrate", heartbeatRate); // heartbeat rate to expect
//m_iPreviousHeartBeatRateSentToServer = heartbeatRate;
// reset the login timeout
//m_iLoginTimeout = system()->getTimeMillis() + COnlineStatus::SERVERCONNECT_TIMEOUT;
m_pNet->SendMessage(reply, NET_RELIABLE); } break;
case TSVC_LOGINOK: { int newStatus; recv->ReadInt("status", newStatus); m_bLoggedIn=true;
SearchForFriend(0, "[email protected]", "", "", "");
} break; case TSVC_FRIENDSFOUND: { //char name[60];
int serverID,sessionID; recv->ReadInt("uid",m_iRemoteUID); recv->ReadInt("serverid",serverID); recv->ReadInt("sessionID",sessionID);
// create the message to the server
ISendMessage *msg = CreateServerMessage(TCLS_ROUTETOFRIEND);
// write in the redirection info
msg->WriteInt("rID", TCL_MESSAGE); msg->WriteUInt("rUserID", m_iRemoteUID); msg->WriteUInt("rSessionID", sessionID); msg->WriteUInt("rServerID", serverID); msg->WriteBlob("rData", "Hello", 5);
m_pNet->SendMessage(msg, NET_RELIABLE);
// lets log off
msg = CreateServerMessage(TCLS_HEARTBEAT); msg->WriteInt("status", COnlineStatus::OFFLINE); m_pNet->SendMessage(msg, NET_RELIABLE);
// m_pNet->Shutdown(true);
// m_pNet->deleteThis();
// SendStatusToServer(COnlineStatus::OFFLINE);
} break;
default: { while(recv->AdvanceField()) { char data[512]; const char *nm=recv->GetFieldName(); recv->ReadString(nm, data, 512);
} }
break;
// { TSVC_CHALLENGE, CServerSession::ReceivedMsg_Challenge },
// { TSVC_LOGINOK, CServerSession::ReceivedMsg_LoginOK },
// { TSVC_LOGINFAIL, CServerSession::ReceivedMsg_LoginFail },
// { TSVC_DISCONNECT, CServerSession::ReceivedMsg_Disconnect },
// { TSVC_FRIENDS, CServerSession::ReceivedMsg_Friends },
// { TSVC_FRIENDUPDATE, CServerSession::ReceivedMsg_FriendUpdate },
// { TSVC_GAMEINFO, CServerSession::ReceivedMsg_GameInfo },
// { TSVC_HEARTBEAT, CServerSession::ReceivedMsg_Heartbeat },
// { TSVC_PINGACK, CServerSession::ReceivedMsg_PingAck },
//default:
// break;
} //ReceivedData(recv);
m_pNet->ReleaseMessage(recv); }
// get the latest fails
while ((recv = m_pNet->GetFailedMessage()) != NULL) {
m_pNet->ReleaseMessage(recv); }
// now let it update itself
m_pNet->RunFrame(); */ }
void VInternetDlg::SearchForFriend(unsigned int uid, const char *email, const char *username, const char *firstname, const char *lastname) { ISendMessage *msg = CreateServerMessage(TCLS_FRIENDSEARCH); msg->WriteUInt("uid", uid); msg->WriteString("Email", email); msg->WriteString("UserName", username); msg->WriteString("FirstName", firstname); msg->WriteString("LastName", lastname);
m_pNet->SendMessage(msg, NET_RELIABLE); }
ISendMessage *VInternetDlg::CreateServerMessage(int msgID) { ISendMessage *msg = m_pNet->CreateMessage(msgID); msg->SetNetAddress(GetServerAddress()); msg->SetSessionID(m_iSessionID); msg->SetEncrypted(true);
return msg; }
CNetAddress VInternetDlg::GetServerAddress() { return m_iServerAddr;// m_pNet->GetNetAddress("tracker.valvesoftware.com:1200");
}
//-----------------------------------------------------------------------------
// Purpose: Sends the first pack in the login sequence
//-----------------------------------------------------------------------------
void VInternetDlg::SendInitialLogin() { // assert(m_iLoginState == LOGINSTATE_WAITINGTORECONNECT || m_iLoginState == LOGINSTATE_DISCONNECTED);
m_iSessionID = 0;
// stop searching for alternate servers
// m_bServerSearch = false;
// int desiredStatus = COnlineStatus::ONLINE;
// setup the login message
/* ISendMessage *loginMsg = m_pNet->CreateMessage(TCLS_LOGIN);
loginMsg->SetNetAddress(GetServerAddress()); loginMsg->SetEncrypted(true); loginMsg->SetSessionID(0);
// const char *adr= GetServerAddress().ToStaticString();
loginMsg->WriteUInt("uid", 36283); loginMsg->WriteString("email", "[email protected]"); loginMsg->WriteString("password", "mrorange"); loginMsg->WriteInt("status", desiredStatus);
m_pNet->SendMessage(loginMsg, NET_RELIABLE); */ // set the current status to be a connecting message
// m_iStatus = COnlineStatus::CONNECTING;
// m_iLoginState = LOGINSTATE_AWAITINGCHALLENGE;
// record the time (for timeouts)
// m_iLoginTimeout = system()->getTimeMillis() + COnlineStatus::SERVERCONNECT_TIMEOUT;
}
//-----------------------------------------------------------------------------
// Purpose: Checks to see if the current message is valid
// replies with a message telling the sender if it's not
//-----------------------------------------------------------------------------
bool VInternetDlg::CheckMessageValidity(IReceiveMessage *dataBlock) { int msgID = dataBlock->GetMsgID(); if (msgID == TSVC_FRIENDS || msgID == TSVC_GAMEINFO || msgID == TSVC_HEARTBEAT || msgID == TSVC_FRIENDUPDATE) { // see if the server really knows us
if (/*m_iStatus < COnlineStatus::ONLINE ||*/ m_iSessionID != dataBlock->SessionID()) { // the server thinks we're still logged on to it
// tell the server we're actually logged off from it
ISendMessage *msg = m_pNet->CreateReply(TCLS_HEARTBEAT, dataBlock); // tell it we're the sessionID it thinks we are
msg->SetSessionID(dataBlock->SessionID()); msg->WriteInt("status", 0); m_pNet->SendMessage(msg, NET_RELIABLE); return false; } }
return true; }
//-----------------------------------------------------------------------------
// Purpose: Message map
//-----------------------------------------------------------------------------
MessageMapItem_t VInternetDlg::m_MessageMap[] = { // MAP_MESSAGE( VInternetDlg, "PageChanged", OnGameListChanged ),
MAP_MESSAGE_INT( VInternetDlg, "Manage", OnManageServer, "serverID" ), MAP_MESSAGE_PARAMS( VInternetDlg, "CvarChangeValue", OnPlayerDialog ), MAP_MESSAGE_INT( VInternetDlg, "DeleteServer", OnDeleteServer, "panelid" ), MAP_MESSAGE( VInternetDlg, "OpenContextMenu", OnOpenContextMenu ), }; IMPLEMENT_PANELMAP(VInternetDlg, vgui::Frame);
|