You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
162 lines
4.2 KiB
162 lines
4.2 KiB
5 years ago
|
//========= 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);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|