|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#ifdef _XBOX
#include "xbox/xbox_platform.h"
#include "xbox/xbox_win32stubs.h"
#endif
#if !defined( _X360 )
#include <windows.h>
#endif
#include <stdio.h>
#include "ChangeGameDialog.h"
#include "ModInfo.h"
#include "EngineInterface.h"
#include <vgui_controls/ListPanel.h>
#include <KeyValues.h>
// memdbgon must be the last include file in a .cpp file!!!
#include <tier0/memdbgon.h>
using namespace vgui;
//-----------------------------------------------------------------------------
// Purpose: Constructor
//-----------------------------------------------------------------------------
CChangeGameDialog::CChangeGameDialog(vgui::Panel *parent) : Frame(parent, "ChangeGameDialog") { SetSize(400, 340); SetMinimumSize(400, 340); SetTitle("#GameUI_ChangeGame", true);
m_pModList = new ListPanel(this, "ModList"); m_pModList->SetEmptyListText("#GameUI_NoOtherGamesAvailable"); m_pModList->AddColumnHeader(0, "ModName", "#GameUI_Game", 128);
LoadModList(); LoadControlSettings("Resource/ChangeGameDialog.res");
// if there's a mod in the list, select the first one
if (m_pModList->GetItemCount() > 0) { m_pModList->SetSingleSelectedItem(m_pModList->GetItemIDFromRow(0)); } }
//-----------------------------------------------------------------------------
// Purpose: Destructor
//-----------------------------------------------------------------------------
CChangeGameDialog::~CChangeGameDialog() { }
//-----------------------------------------------------------------------------
// Purpose: Fills the mod list
//-----------------------------------------------------------------------------
void CChangeGameDialog::LoadModList() { // look for third party games
char szSearchPath[_MAX_PATH + 5]; Q_strncpy(szSearchPath, "*.*", sizeof( szSearchPath ) );
// use local filesystem since it has to look outside path system, and will never be used under steam
WIN32_FIND_DATA wfd; HANDLE hResult; memset(&wfd, 0, sizeof(WIN32_FIND_DATA)); hResult = FindFirstFile( szSearchPath, &wfd); if (hResult != INVALID_HANDLE_VALUE) { BOOL bMoreFiles; while (1) { if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && (Q_strnicmp(wfd.cFileName, ".", 1))) { // Check for dlls\*.dll
char szDllDirectory[MAX_PATH + 16]; Q_snprintf(szDllDirectory, sizeof( szDllDirectory ), "%s\\gameinfo.txt", wfd.cFileName);
FILE *f = fopen(szDllDirectory, "rb"); if (f) { // find the description
fseek(f, 0, SEEK_END); unsigned int size = ftell(f); fseek(f, 0, SEEK_SET); char *buf = (char *)malloc(size + 1); if (fread(buf, 1, size, f) == size) { buf[size] = 0;
CModInfo modInfo; modInfo.LoadGameInfoFromBuffer(buf);
if (strcmp(modInfo.GetGameName(), ModInfo().GetGameName())) { // Add the game directory.
strlwr(wfd.cFileName); KeyValues *itemData = new KeyValues("Mod"); itemData->SetString("ModName", modInfo.GetGameName()); itemData->SetString("ModDir", wfd.cFileName); m_pModList->AddItem(itemData, 0, false, false); } } free(buf); fclose(f); } } bMoreFiles = FindNextFile(hResult, &wfd); if (!bMoreFiles) break; } FindClose(hResult); } }
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CChangeGameDialog::OnCommand(const char *command) { if (!stricmp(command, "OK")) { if (m_pModList->GetSelectedItemsCount() > 0) { KeyValues *kv = m_pModList->GetItem(m_pModList->GetSelectedItem(0)); if (kv) { // change the game dir and restart the engine
char szCmd[256]; Q_snprintf(szCmd, sizeof( szCmd ), "_setgamedir %s\n", kv->GetString("ModDir")); engine->ClientCmd_Unrestricted(szCmd);
// Force restart of entire engine
engine->ClientCmd_Unrestricted("_restart\n"); } } } else if (!stricmp(command, "Cancel")) { Close(); } else { BaseClass::OnCommand(command); } }
|