From bdc7929286d4c84200b980032cf46993054b362f Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Tue, 23 Apr 2024 00:06:11 +0200 Subject: [PATCH] Launcher: several fixes and improvements - Reload map list each time the combo box is opened (needs to refresh if user installed a new map while launcher is still open). - Reload playlists each time the combo box is opened (makes sure that the list is up-to-date if user modified it in any way). - Use global VPK dir regex to parse out map names. --- r5dev/sdklauncher/basepanel.cpp | 54 ++++++++++++++++++++++++--------- r5dev/sdklauncher/basepanel.h | 3 ++ 2 files changed, 42 insertions(+), 15 deletions(-) diff --git a/r5dev/sdklauncher/basepanel.cpp b/r5dev/sdklauncher/basepanel.cpp index 73e0daf0..31d6ac8b 100644 --- a/r5dev/sdklauncher/basepanel.cpp +++ b/r5dev/sdklauncher/basepanel.cpp @@ -6,8 +6,10 @@ #include "basepanel.h" #include "sdklauncher.h" #include "mathlib/bits.h" +#include "vpklib/packedstore.h" #include "vstdlib/keyvaluessystem.h" #include "filesystem/filesystem_std.h" +#include "tier2/fileutils.h" extern CFileSystem_Stdio* FileSystem(); @@ -93,6 +95,7 @@ void CSurface::Init() this->m_MapCombo->SetLocation({ 15, 25 }); this->m_MapCombo->SetTabIndex(0); this->m_MapCombo->SetSelectedIndex(0); + this->m_MapCombo->DropDownOpened += ReloadMaplists; this->m_MapCombo->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); this->m_MapCombo->SetDropDownStyle(Forms::ComboBoxStyle::DropDownList); this->m_GameGroup->AddControl(this->m_MapCombo); @@ -111,6 +114,7 @@ void CSurface::Init() this->m_PlaylistCombo->SetLocation({ 15, 50 }); this->m_PlaylistCombo->SetTabIndex(0); this->m_PlaylistCombo->SetSelectedIndex(0); + this->m_PlaylistCombo->DropDownOpened += ReloadPlaylists; this->m_PlaylistCombo->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); this->m_PlaylistCombo->SetDropDownStyle(Forms::ComboBoxStyle::DropDownList); this->m_GameGroup->AddControl(this->m_PlaylistCombo); @@ -159,7 +163,6 @@ void CSurface::Init() this->m_PlaylistFileTextBox->SetTabIndex(0); this->m_PlaylistFileTextBox->SetText("playlists_r5_patch.txt"); this->m_PlaylistFileTextBox->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); - this->m_PlaylistFileTextBox->LostFocus += &ReloadPlaylists; this->m_GameGroupExt->AddControl(this->m_PlaylistFileTextBox); this->m_PlaylistFileLabel = new UIX::UIXLabel(); @@ -536,9 +539,6 @@ void CSurface::Init() //----------------------------------------------------------------------------- void CSurface::Setup() { - this->ParseMaps(); - this->ParsePlaylists(); - this->m_ModeCombo->Items.Add("Host"); this->m_ModeCombo->Items.Add("Server"); this->m_ModeCombo->Items.Add("Client"); @@ -744,29 +744,33 @@ void CSurface::LaunchGame(Forms::Control* pSender) //----------------------------------------------------------------------------- void CSurface::ParseMaps() { + if (!m_MapCombo->Items.Contains("")) + m_MapCombo->Items.Add(""); + const fs::path vpkPath("vpk"); + if (!fs::exists(vpkPath)) { return; } fs::directory_iterator directoryIterator(vpkPath); - std::regex archiveRegex{ R"([^_]*_(.*)(.bsp.pak000_dir).*)" }; - std::smatch regexMatches; + std::cmatch regexMatches; - m_MapCombo->Items.Add(""); for (const fs::directory_entry& directoryEntry : directoryIterator) { std::string fileName = directoryEntry.path().u8string(); - std::regex_search(fileName, regexMatches, archiveRegex); + std::regex_search(fileName.c_str(), regexMatches, g_VpkDirFileRegex); if (!regexMatches.empty()) { - if (regexMatches[1].str().compare("frontend") == 0) + const std::sub_match& match = regexMatches[2]; + + if (match.compare("frontend") == 0) { continue; } - else if (regexMatches[1].str().compare("mp_common") == 0) + else if (match.compare("mp_common") == 0) { if (!this->m_MapCombo->Items.Contains("mp_lobby")) { @@ -774,9 +778,14 @@ void CSurface::ParseMaps() } continue; } - else if (!this->m_MapCombo->Items.Contains(regexMatches[1].str().c_str())) + else { - this->m_MapCombo->Items.Add(regexMatches[1].str().c_str()); + const string mapName = match.str(); + + if (!this->m_MapCombo->Items.Contains(match.str().c_str())) + { + this->m_MapCombo->Items.Add(match.str().c_str()); + } } } } @@ -787,14 +796,14 @@ void CSurface::ParseMaps() //----------------------------------------------------------------------------- void CSurface::ParsePlaylists() { + if (!m_PlaylistCombo->Items.Contains("")) + m_PlaylistCombo->Items.Add(""); + CUtlString playlistPath; playlistPath.Format("platform\\%s", this->m_PlaylistFileTextBox->Text().ToCString()); const char* pPlaylistPath = playlistPath.String(); - if (!m_PlaylistCombo->Items.Contains("")) - m_PlaylistCombo->Items.Add(""); - if (!FileSystem()->FileExists(pPlaylistPath)) return; @@ -822,6 +831,20 @@ void CSurface::ParsePlaylists() } } +//----------------------------------------------------------------------------- +// Purpose: clears the form and reloads the map list +// Input : *pSender - +//----------------------------------------------------------------------------- +void CSurface::ReloadMaplists(Forms::Control* pSender) +{ + CSurface* pSurface = reinterpret_cast(pSender->FindForm()); + + pSurface->m_MapCombo->Items.Clear(); + pSurface->m_MapCombo->OnSizeChanged(); + + pSurface->ParseMaps(); +} + //----------------------------------------------------------------------------- // Purpose: clears the form and reloads the playlist // Input : *pSender - @@ -832,6 +855,7 @@ void CSurface::ReloadPlaylists(Forms::Control* pSender) pSurface->m_PlaylistCombo->Items.Clear(); pSurface->m_PlaylistCombo->OnSizeChanged(); + pSurface->ParsePlaylists(); } diff --git a/r5dev/sdklauncher/basepanel.h b/r5dev/sdklauncher/basepanel.h index 2a6da82b..2c21ffaf 100644 --- a/r5dev/sdklauncher/basepanel.h +++ b/r5dev/sdklauncher/basepanel.h @@ -40,7 +40,10 @@ private: static void LaunchGame(Forms::Control* pSender); static void CleanSDK(Forms::Control* pSender); static void UpdateSDK(Forms::Control* pSender); + + static void ReloadMaplists(Forms::Control* pSender); static void ReloadPlaylists(Forms::Control* pSender); + static void VirtualItemToClipboard(const std::unique_ptr& pEventArgs, Forms::Control* pSender); static void GetVirtualItem(const std::unique_ptr& pEventArgs, Forms::Control* pSender); static void ForwardCommandToGame(Forms::Control* pSender);