From 7225de1bd4f60aea7f4655eaee11ab7b5909eb6a Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Mon, 23 May 2022 19:14:12 +0200 Subject: [PATCH] Finished designer code Work in progress gui launcher --- r5dev/sdklauncher/basepanel.cpp | 454 +++++++++++++++++++++++ r5dev/sdklauncher/basepanel.h | 78 ++++ r5dev/sdklauncher/sdklauncher.cpp | 467 ++++++++++++++---------- r5dev/sdklauncher/sdklauncher.h | 19 + r5dev/vproj/sdklauncher.vcxproj | 2 + r5dev/vproj/sdklauncher.vcxproj.filters | 6 + 6 files changed, 836 insertions(+), 190 deletions(-) create mode 100644 r5dev/sdklauncher/basepanel.cpp create mode 100644 r5dev/sdklauncher/basepanel.h diff --git a/r5dev/sdklauncher/basepanel.cpp b/r5dev/sdklauncher/basepanel.cpp new file mode 100644 index 00000000..650ef680 --- /dev/null +++ b/r5dev/sdklauncher/basepanel.cpp @@ -0,0 +1,454 @@ + +#include "core/stdafx.h" +#include "basepanel.h" +#include +#include "gdiplus.h" +#include "shellapi.h" + +void CUIBasePanel::Init() +{ + const INT WindowX = 800; + const INT WindowY = 350; + + this->SuspendLayout(); + this->SetAutoScaleDimensions({ 6, 13 }); + this->SetAutoScaleMode(Forms::AutoScaleMode::Font); + this->SetText("SDK Launcher"); + this->SetClientSize({ WindowX, WindowY }); + this->SetFormBorderStyle(Forms::FormBorderStyle::FixedSingle); + this->SetStartPosition(Forms::FormStartPosition::CenterParent); + this->SetMinimizeBox(false); + this->SetMaximizeBox(false); + + // ################################################################################################# + // + // ################################################################################################# + this->m_GameGroup = new UIX::UIXGroupBox(); + this->m_GameGroup->SetSize({ 458, 84 }); + this->m_GameGroup->SetLocation({ 12, 10 }); + this->m_GameGroup->SetTabIndex(0); + this->m_GameGroup->SetText("Game"); + this->m_GameGroup->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->AddControl(this->m_GameGroup); + + this->m_GameGroupExt = new UIX::UIXGroupBox(); + this->m_GameGroupExt->SetSize({ 458, 55 }); + this->m_GameGroupExt->SetLocation({ 12, 93 }); + this->m_GameGroupExt->SetTabIndex(0); + this->m_GameGroupExt->SetText(""); + this->m_GameGroupExt->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->AddControl(this->m_GameGroupExt); + + this->m_MapLabel = new UIX::UIXLabel(); + this->m_MapLabel->SetSize({ 50, 25 }); + this->m_MapLabel->SetLocation({ 365, 28 }); + this->m_MapLabel->SetTabIndex(0); + this->m_MapLabel->SetText("Map"); + this->m_MapLabel->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_MapLabel->SetTextAlign(Drawing::ContentAlignment::TopLeft); + this->m_GameGroup->AddControl(this->m_MapLabel); + + this->m_MapCombo = new UIX::UIXComboBox(); + this->m_MapCombo->SetSize({ 347, 25 }); + this->m_MapCombo->SetLocation({ 15, 25 }); + this->m_MapCombo->SetTabIndex(0); + this->m_MapCombo->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_MapCombo->SetDropDownStyle(Forms::ComboBoxStyle::DropDownList); + std::regex rgArchiveRegex{ R"([^_]*_(.*)(.bsp.pak000_dir).*)" }; + std::smatch smRegexMatches; + + for (const auto& dEntry : fs::directory_iterator("vpk")) + { + std::string svFileName = dEntry.path().string(); + std::regex_search(svFileName, smRegexMatches, rgArchiveRegex); + + if (smRegexMatches.size() > 0) + { + if (strcmp(smRegexMatches[1].str().c_str(), "frontend") == 0) + { + continue; + } + else if (strcmp(smRegexMatches[1].str().c_str(), "mp_common") == 0) + { + this->m_MapCombo->Items.Add("mp_lobby"); + continue; + } + + this->m_MapCombo->Items.Add(smRegexMatches[1].str().c_str()); + } + } + this->m_GameGroup->AddControl(this->m_MapCombo); + + this->m_PlaylistLabel = new UIX::UIXLabel(); + this->m_PlaylistLabel->SetSize({ 50, 25 }); + this->m_PlaylistLabel->SetLocation({ 365, 53 }); + this->m_PlaylistLabel->SetTabIndex(0); + this->m_PlaylistLabel->SetText("Playlist"); + this->m_PlaylistLabel->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_PlaylistLabel->SetTextAlign(Drawing::ContentAlignment::TopLeft); + this->m_GameGroup->AddControl(this->m_PlaylistLabel); + + this->m_PlaylistCombo = new UIX::UIXComboBox(); + this->m_PlaylistCombo->SetSize({ 347, 25 }); + this->m_PlaylistCombo->SetLocation({ 15, 50 }); + this->m_PlaylistCombo->SetTabIndex(0); + this->m_PlaylistCombo->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_PlaylistCombo->SetDropDownStyle(Forms::ComboBoxStyle::DropDownList); + this->m_GameGroup->AddControl(this->m_PlaylistCombo); + + this->m_CheatsToggle = new UIX::UIXCheckBox(); + this->m_CheatsToggle->SetSize({ 110, 18 }); + this->m_CheatsToggle->SetLocation({ 15, 7 }); + this->m_CheatsToggle->SetTabIndex(0); + this->m_CheatsToggle->SetText("Enable cheats"); + this->m_CheatsToggle->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_GameGroupExt->AddControl(this->m_CheatsToggle); + + this->m_DevelopmentToggle = new UIX::UIXCheckBox(); + this->m_DevelopmentToggle->SetSize({ 150, 18 }); + this->m_DevelopmentToggle->SetLocation({ 130, 7 }); + this->m_DevelopmentToggle->SetTabIndex(0); + this->m_DevelopmentToggle->SetText("Enable development"); + this->m_DevelopmentToggle->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_GameGroupExt->AddControl(this->m_DevelopmentToggle); + + this->m_ConsoleToggle = new UIX::UIXCheckBox(); + this->m_ConsoleToggle->SetSize({ 150, 18 }); + this->m_ConsoleToggle->SetLocation({ 290, 7 }); + this->m_ConsoleToggle->SetTabIndex(0); + this->m_ConsoleToggle->SetText("Show console"); + this->m_ConsoleToggle->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_GameGroupExt->AddControl(this->m_ConsoleToggle); + + this->m_ColorConsoleToggle = new UIX::UIXCheckBox(); + this->m_ColorConsoleToggle->SetSize({ 105, 18 }); + this->m_ColorConsoleToggle->SetLocation({ 15, 30 }); + this->m_ColorConsoleToggle->SetTabIndex(0); + this->m_ColorConsoleToggle->SetChecked(true); + this->m_ColorConsoleToggle->SetText("Color console"); + this->m_ColorConsoleToggle->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_GameGroupExt->AddControl(this->m_ColorConsoleToggle); + + this->m_PlaylistFileTextBox = new UIX::UIXTextBox(); + this->m_PlaylistFileTextBox->SetSize({ 178, 18 }); + this->m_PlaylistFileTextBox->SetLocation({ 130, 30 }); + 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_GameGroupExt->AddControl(this->m_PlaylistFileTextBox); + + this->m_PlaylistFileLabel = new UIX::UIXLabel(); + this->m_PlaylistFileLabel->SetSize({ 50, 18 }); + this->m_PlaylistFileLabel->SetLocation({ 311, 32 }); + this->m_PlaylistFileLabel->SetTabIndex(0); + this->m_PlaylistFileLabel->SetText("Playlist file"); + this->m_PlaylistFileLabel->SetAnchor(Forms::AnchorStyles::Bottom | Forms::AnchorStyles::Left); + this->m_GameGroupExt->AddControl(this->m_PlaylistFileLabel); + + // ################################################################################################# + // + // ################################################################################################# + this->m_MainGroup = new UIX::UIXGroupBox(); + this->m_MainGroup->SetSize({ 308, 84 }); + this->m_MainGroup->SetLocation({ 480, 10 }); + this->m_MainGroup->SetTabIndex(0); + this->m_MainGroup->SetText("Main"); + this->m_MainGroup->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->AddControl(this->m_MainGroup); + + this->m_MainGroupExt = new UIX::UIXGroupBox(); + this->m_MainGroupExt->SetSize({ 308, 55 }); + this->m_MainGroupExt->SetLocation({ 480, 93 }); + this->m_MainGroupExt->SetTabIndex(0); + this->m_MainGroupExt->SetText(""); + this->m_MainGroupExt->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->AddControl(this->m_MainGroupExt); + + this->m_ModeCombo = new UIX::UIXComboBox(); + this->m_ModeCombo->SetSize({ 82, 25 }); + this->m_ModeCombo->SetLocation({ 15, 25 }); + this->m_ModeCombo->SetTabIndex(0); + this->m_ModeCombo->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_ModeCombo->SetDropDownStyle(Forms::ComboBoxStyle::DropDownList); + this->m_ModeCombo->Items.Add("Host"); + this->m_ModeCombo->Items.Add("Server"); + this->m_ModeCombo->Items.Add("Client"); + this->m_MainGroup->AddControl(this->m_ModeCombo); + + this->m_ModeLabel = new UIX::UIXLabel(); + this->m_ModeLabel->SetSize({ 50, 25 }); + this->m_ModeLabel->SetLocation({ 100, 28 }); + this->m_ModeLabel->SetTabIndex(0); + this->m_ModeLabel->SetText("Mode"); + this->m_ModeLabel->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_ModeLabel->SetTextAlign(Drawing::ContentAlignment::TopLeft); + this->m_MainGroup->AddControl(this->m_ModeLabel); + + this->m_CustomDllTextBox = new UIX::UIXTextBox(); + this->m_CustomDllTextBox->SetSize({ 80, 21 }); + this->m_CustomDllTextBox->SetLocation({ 150, 25 }); + this->m_CustomDllTextBox->SetTabIndex(0); + this->m_CustomDllTextBox->SetText(""); + this->m_CustomDllTextBox->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_MainGroup->AddControl(this->m_CustomDllTextBox); + + this->m_CustomDllLabel = new UIX::UIXLabel(); + this->m_CustomDllLabel->SetSize({ 70, 21 }); + this->m_CustomDllLabel->SetLocation({ 233, 28 }); + this->m_CustomDllLabel->SetTabIndex(0); + this->m_CustomDllLabel->SetText("Additional dll's"); + this->m_CustomDllLabel->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_MainGroup->AddControl(this->m_CustomDllLabel); + + this->m_LaunchArgsTextBox = new UIX::UIXTextBox(); + this->m_LaunchArgsTextBox->SetSize({ 215, 21 }); + this->m_LaunchArgsTextBox->SetLocation({ 15, 50 }); + this->m_LaunchArgsTextBox->SetTabIndex(0); + this->m_LaunchArgsTextBox->SetText(""); + this->m_LaunchArgsTextBox->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_MainGroup->AddControl(this->m_LaunchArgsTextBox); + + this->m_LaunchArgsLabel = new UIX::UIXLabel(); + this->m_LaunchArgsLabel->SetSize({ 70, 21 }); + this->m_LaunchArgsLabel->SetLocation({ 233, 53 }); + this->m_LaunchArgsLabel->SetTabIndex(0); + this->m_LaunchArgsLabel->SetText("Launch flags"); + this->m_LaunchArgsLabel->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_MainGroup->AddControl(this->m_LaunchArgsLabel); + + this->m_CleanSDK = new UIX::UIXButton(); + this->m_CleanSDK->SetSize({ 110, 18 }); + this->m_CleanSDK->SetLocation({ 15, 7 }); + this->m_CleanSDK->SetTabIndex(0); + this->m_CleanSDK->SetText("Clean SDK"); + this->m_CleanSDK->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_MainGroupExt->AddControl(this->m_CleanSDK); + + this->m_UpdateSDK = new UIX::UIXButton(); + this->m_UpdateSDK->SetSize({ 110, 18 }); + this->m_UpdateSDK->SetLocation({ 15, 30 }); + this->m_UpdateSDK->SetTabIndex(0); + this->m_UpdateSDK->SetText("Update SDK"); + this->m_UpdateSDK->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_MainGroupExt->AddControl(this->m_UpdateSDK); + + this->m_LaunchSDK = new UIX::UIXButton(); + this->m_LaunchSDK->SetSize({ 170, 41 }); + this->m_LaunchSDK->SetLocation({ 130, 7 }); + this->m_LaunchSDK->SetTabIndex(0); + this->m_LaunchSDK->SetText("Launch game"); + this->m_LaunchSDK->SetBackColor(Drawing::Color(3, 102, 214)); + this->m_LaunchSDK->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_MainGroupExt->AddControl(this->m_LaunchSDK); + + // ################################################################################################# + // + // ################################################################################################# + this->m_EngineBaseGroup = new UIX::UIXGroupBox(); + this->m_EngineBaseGroup->SetSize({ 337, 73 }); + this->m_EngineBaseGroup->SetLocation({ 12, 158 }); + this->m_EngineBaseGroup->SetTabIndex(0); + this->m_EngineBaseGroup->SetText("Engine"); + this->m_EngineBaseGroup->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->AddControl(this->m_EngineBaseGroup); + + this->m_EngineNetworkGroup = new UIX::UIXGroupBox(); + this->m_EngineNetworkGroup->SetSize({ 337, 55 }); + this->m_EngineNetworkGroup->SetLocation({ 12, 230 }); + this->m_EngineNetworkGroup->SetTabIndex(0); + this->m_EngineNetworkGroup->SetText(""); + this->m_EngineNetworkGroup->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->AddControl(this->m_EngineNetworkGroup); + + this->m_EngineVideoGroup = new UIX::UIXGroupBox(); + this->m_EngineVideoGroup->SetSize({ 337, 55 }); + this->m_EngineVideoGroup->SetLocation({ 12, 284 }); + this->m_EngineVideoGroup->SetTabIndex(0); + this->m_EngineVideoGroup->SetText(""); + this->m_EngineVideoGroup->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->AddControl(this->m_EngineVideoGroup); + + this->m_ReservedCoresTextBox = new UIX::UIXTextBox(); + this->m_ReservedCoresTextBox->SetSize({ 18, 18 }); + this->m_ReservedCoresTextBox->SetLocation({ 15, 25 }); + this->m_ReservedCoresTextBox->SetTabIndex(0); + this->m_ReservedCoresTextBox->SetReadOnly(false); + this->m_ReservedCoresTextBox->SetText("0"); + this->m_ReservedCoresTextBox->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_EngineBaseGroup->AddControl(this->m_ReservedCoresTextBox); + + this->m_ReservedCoresLabel = new UIX::UIXLabel(); + this->m_ReservedCoresLabel->SetSize({ 125, 18 }); + this->m_ReservedCoresLabel->SetLocation({ 36, 27 }); + this->m_ReservedCoresLabel->SetTabIndex(0); + this->m_ReservedCoresLabel->SetText("Reserved cores"); + this->m_ReservedCoresLabel->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_ReservedCoresLabel->SetTextAlign(Drawing::ContentAlignment::TopLeft); + this->m_EngineBaseGroup->AddControl(this->m_ReservedCoresLabel); + + this->m_WorkerThreadsTextBox = new UIX::UIXTextBox(); + this->m_WorkerThreadsTextBox->SetSize({ 18, 18 }); + this->m_WorkerThreadsTextBox->SetLocation({ 155, 25 }); + this->m_WorkerThreadsTextBox->SetTabIndex(0); + this->m_WorkerThreadsTextBox->SetReadOnly(false); + this->m_WorkerThreadsTextBox->SetText("28"); + this->m_WorkerThreadsTextBox->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_EngineBaseGroup->AddControl(this->m_WorkerThreadsTextBox); + + this->m_WorkerThreadsLabel = new UIX::UIXLabel(); + this->m_WorkerThreadsLabel->SetSize({ 125, 18 }); + this->m_WorkerThreadsLabel->SetLocation({ 176, 27 }); + this->m_WorkerThreadsLabel->SetTabIndex(0); + this->m_WorkerThreadsLabel->SetText("Worker threads"); + this->m_WorkerThreadsLabel->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_WorkerThreadsLabel->SetTextAlign(Drawing::ContentAlignment::TopLeft); + this->m_EngineBaseGroup->AddControl(this->m_WorkerThreadsLabel); + + this->m_SingleCoreDediToggle = new UIX::UIXCheckBox(); + this->m_SingleCoreDediToggle->SetSize({ 125, 18 }); + this->m_SingleCoreDediToggle->SetLocation({ 15, 48 }); + this->m_SingleCoreDediToggle->SetTabIndex(0); + this->m_SingleCoreDediToggle->SetText("Single-core server"); + this->m_SingleCoreDediToggle->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_EngineBaseGroup->AddControl(this->m_SingleCoreDediToggle); + + this->m_NoAsyncJobsToggle = new UIX::UIXCheckBox(); + this->m_NoAsyncJobsToggle->SetSize({ 125, 18 }); + this->m_NoAsyncJobsToggle->SetLocation({ 155, 48 }); + this->m_NoAsyncJobsToggle->SetTabIndex(2); + this->m_NoAsyncJobsToggle->SetText("Synchronize jobs"); + this->m_NoAsyncJobsToggle->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_EngineBaseGroup->AddControl(this->m_NoAsyncJobsToggle); + + this->m_NetEncryptionToggle = new UIX::UIXCheckBox(); + this->m_NetEncryptionToggle->SetSize({ 125, 18 }); + this->m_NetEncryptionToggle->SetLocation({ 15, 7 }); + this->m_NetEncryptionToggle->SetTabIndex(0); + this->m_NetEncryptionToggle->SetChecked(true); + this->m_NetEncryptionToggle->SetText("Net encryption"); + this->m_NetEncryptionToggle->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_EngineNetworkGroup->AddControl(this->m_NetEncryptionToggle); + + this->m_NetRandomKeyToggle = new UIX::UIXCheckBox(); + this->m_NetRandomKeyToggle->SetSize({ 125, 18 }); + this->m_NetRandomKeyToggle->SetLocation({ 155, 7 }); + this->m_NetRandomKeyToggle->SetTabIndex(0); + this->m_NetRandomKeyToggle->SetChecked(true); + this->m_NetRandomKeyToggle->SetText("Net random key"); + this->m_NetRandomKeyToggle->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_EngineNetworkGroup->AddControl(this->m_NetRandomKeyToggle); + + + this->m_QueuedPacketThread = new UIX::UIXCheckBox(); + this->m_QueuedPacketThread->SetSize({ 125, 18 }); + this->m_QueuedPacketThread->SetLocation({ 15, 30 }); + this->m_QueuedPacketThread->SetTabIndex(2); + this->m_QueuedPacketThread->SetText("No queued packets"); + this->m_QueuedPacketThread->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_EngineNetworkGroup->AddControl(this->m_QueuedPacketThread); + + this->m_NoTimeOut = new UIX::UIXCheckBox(); + this->m_NoTimeOut->SetSize({ 125, 18 }); + this->m_NoTimeOut->SetLocation({ 155, 30 }); + this->m_NoTimeOut->SetTabIndex(0); + this->m_NoTimeOut->SetText("No time out"); + this->m_NoTimeOut->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_EngineNetworkGroup->AddControl(this->m_NoTimeOut); + + + this->m_WindowedToggle = new UIX::UIXCheckBox(); + this->m_WindowedToggle->SetSize({ 105, 18 }); + this->m_WindowedToggle->SetLocation({ 15, 7 }); + this->m_WindowedToggle->SetTabIndex(0); + this->m_WindowedToggle->SetChecked(true); + this->m_WindowedToggle->SetText("Windowed"); + this->m_WindowedToggle->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_EngineVideoGroup->AddControl(this->m_WindowedToggle); + + this->m_BorderlessToggle = new UIX::UIXCheckBox(); + this->m_BorderlessToggle->SetSize({ 150, 18 }); + this->m_BorderlessToggle->SetLocation({ 155, 7 }); + this->m_BorderlessToggle->SetTabIndex(0); + this->m_BorderlessToggle->SetText("No border"); + this->m_BorderlessToggle->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_EngineVideoGroup->AddControl(this->m_BorderlessToggle); + + this->m_FpsTextBox = new UIX::UIXTextBox(); + this->m_FpsTextBox->SetSize({ 25, 18 }); + this->m_FpsTextBox->SetLocation({ 15, 30 }); + this->m_FpsTextBox->SetTabIndex(0); + this->m_FpsTextBox->SetReadOnly(false); + this->m_FpsTextBox->SetText("-1"); + this->m_FpsTextBox->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_EngineVideoGroup->AddControl(this->m_FpsTextBox); + + this->m_FpsLabel = new UIX::UIXLabel(); + this->m_FpsLabel->SetSize({ 125, 18 }); + this->m_FpsLabel->SetLocation({ 43, 32 }); + this->m_FpsLabel->SetTabIndex(0); + this->m_FpsLabel->SetText("Max FPS"); + this->m_FpsLabel->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_FpsLabel->SetTextAlign(Drawing::ContentAlignment::TopLeft); + this->m_EngineVideoGroup->AddControl(this->m_FpsLabel); + + + this->m_WidthTextBox = new UIX::UIXTextBox(); + this->m_WidthTextBox->SetSize({ 50, 18 }); + this->m_WidthTextBox->SetLocation({ 100, 30 }); + this->m_WidthTextBox->SetTabIndex(0); + this->m_WidthTextBox->SetReadOnly(false); + this->m_WidthTextBox->SetText(""); + this->m_WidthTextBox->SetAnchor(Forms::AnchorStyles::Bottom | Forms::AnchorStyles::Right); + this->m_EngineVideoGroup->AddControl(this->m_WidthTextBox); + + this->m_HeightTextBox = new UIX::UIXTextBox(); + this->m_HeightTextBox->SetSize({ 50, 18 }); + this->m_HeightTextBox->SetLocation({ 149, 30 }); + this->m_HeightTextBox->SetTabIndex(0); + this->m_HeightTextBox->SetReadOnly(false); + this->m_HeightTextBox->SetText(""); + this->m_HeightTextBox->SetAnchor(Forms::AnchorStyles::Bottom | Forms::AnchorStyles::Right); + this->m_EngineVideoGroup->AddControl(this->m_HeightTextBox); + + this->m_ResolutionLabel = new UIX::UIXLabel(); + this->m_ResolutionLabel->SetSize({ 125, 18 }); + this->m_ResolutionLabel->SetLocation({ 202, 32 }); + this->m_ResolutionLabel->SetTabIndex(0); + this->m_ResolutionLabel->SetText("Resolution (width | height)"); + this->m_ResolutionLabel->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_ResolutionLabel->SetTextAlign(Drawing::ContentAlignment::TopLeft); + this->m_EngineVideoGroup->AddControl(this->m_ResolutionLabel); + + // ################################################################################################# + // + // ################################################################################################# + this->m_ConsoleGroup = new UIX::UIXGroupBox(); + this->m_ConsoleGroup->SetSize({ 429, 181 }); + this->m_ConsoleGroup->SetLocation({ 359, 158 }); + this->m_ConsoleGroup->SetTabIndex(0); + this->m_ConsoleGroup->SetText("Console"); + this->m_ConsoleGroup->SetAnchor(Forms::AnchorStyles::Bottom | Forms::AnchorStyles::Left | Forms::AnchorStyles::Right); + this->AddControl(this->m_ConsoleGroup); + + this->m_ConsoleListView = new UIX::UIXListView(); + this->m_ConsoleListView->SetSize({ 427, 165 }); + this->m_ConsoleListView->SetLocation({ 1, 15 }); + this->m_ConsoleListView->SetTabIndex(0); + this->m_ConsoleListView->SetText("0"); + this->m_ConsoleListView->SetBackColor(Drawing::Color(29, 33, 37)); + this->m_ConsoleListView->SetAnchor(Forms::AnchorStyles::Top | Forms::AnchorStyles::Left); + this->m_ConsoleGroup->AddControl(this->m_ConsoleListView); + + this->ResumeLayout(false); + this->PerformLayout(); + // END DESIGNER CODE + + this->SetBackColor({ 47, 54, 61 }); +} + +CUIBasePanel::CUIBasePanel() : Forms::Form() +{ + g_pMainUI = this; + this->Init(); +} +CUIBasePanel* g_pMainUI; \ No newline at end of file diff --git a/r5dev/sdklauncher/basepanel.h b/r5dev/sdklauncher/basepanel.h new file mode 100644 index 00000000..284e55c4 --- /dev/null +++ b/r5dev/sdklauncher/basepanel.h @@ -0,0 +1,78 @@ +#pragma once + +#include "thirdparty/cppnet/cppkore/Kore.h" +#include "thirdparty/cppnet/cppkore/UIXTheme.h" +#include "thirdparty/cppnet/cppkore/UIXLabel.h" +#include "thirdparty/cppnet/cppkore/UIXListView.h" +#include "thirdparty/cppnet/cppkore/UIXCheckBox.h" +#include "thirdparty/cppnet/cppkore/UIXComboBox.h" +#include "thirdparty/cppnet/cppkore/UIXTextBox.h" +#include "thirdparty/cppnet/cppkore/UIXGroupBox.h" +#include "thirdparty/cppnet/cppkore/UIXButton.h" +#include "thirdparty/cppnet/cppkore/UIXRadioButton.h" +#include "thirdparty/cppnet/cppkore/KoreTheme.h" + +class CUIBasePanel : public Forms::Form +{ +public: + CUIBasePanel(); + virtual ~CUIBasePanel() = default; + +private: + void Init(); + + UIX::UIXTextBox* m_HeightTextBox; + UIX::UIXTextBox* m_WidthTextBox; + UIX::UIXTextBox* m_WorkerThreadsTextBox; + UIX::UIXTextBox* m_ReservedCoresTextBox; + UIX::UIXTextBox* m_FpsTextBox; + UIX::UIXTextBox* m_PlaylistFileTextBox; + UIX::UIXTextBox* m_CustomDllTextBox; + UIX::UIXTextBox* m_LaunchArgsTextBox; + // Labels + UIX::UIXLabel* m_WorkerThreadsLabel; + UIX::UIXLabel* m_ReservedCoresLabel; + UIX::UIXLabel* m_MapLabel; + UIX::UIXLabel* m_PlaylistLabel; + UIX::UIXLabel* m_ModeLabel; + UIX::UIXLabel* m_FpsLabel; + UIX::UIXLabel* m_ResolutionLabel; + UIX::UIXLabel* m_PlaylistFileLabel; + UIX::UIXLabel* m_CustomDllLabel; + UIX::UIXLabel* m_LaunchArgsLabel; + // Boxes + UIX::UIXGroupBox* m_GameGroup; + UIX::UIXGroupBox* m_MainGroup; + UIX::UIXGroupBox* m_GameGroupExt; + UIX::UIXGroupBox* m_MainGroupExt; + UIX::UIXGroupBox* m_ConsoleGroup; + UIX::UIXGroupBox* m_EngineBaseGroup; + UIX::UIXGroupBox* m_EngineNetworkGroup; + UIX::UIXGroupBox* m_EngineVideoGroup; + // Toggles + UIX::UIXCheckBox* m_CheatsToggle; + UIX::UIXCheckBox* m_DevelopmentToggle; + UIX::UIXCheckBox* m_ConsoleToggle; + UIX::UIXCheckBox* m_WindowedToggle; + UIX::UIXCheckBox* m_BorderlessToggle; + UIX::UIXCheckBox* m_SingleCoreDediToggle; + UIX::UIXCheckBox* m_NoAsyncJobsToggle; + UIX::UIXCheckBox* m_NetEncryptionToggle; + UIX::UIXCheckBox* m_NetRandomKeyToggle; + UIX::UIXCheckBox* m_QueuedPacketThread; + UIX::UIXCheckBox* m_NoTimeOut; + UIX::UIXCheckBox* m_ColorConsoleToggle; + // Combo + UIX::UIXComboBox* m_MapCombo; + UIX::UIXComboBox* m_PlaylistCombo; + UIX::UIXComboBox* m_ModeCombo; + // Buttons + UIX::UIXButton* m_LaunchGame; + UIX::UIXButton* m_CleanSDK; + UIX::UIXButton* m_UpdateSDK; + UIX::UIXButton* m_LaunchSDK; + + UIX::UIXListView* m_ConsoleListView; +}; + +extern CUIBasePanel* g_pMainUI; diff --git a/r5dev/sdklauncher/sdklauncher.cpp b/r5dev/sdklauncher/sdklauncher.cpp index 032cb3d5..1626720f 100644 --- a/r5dev/sdklauncher/sdklauncher.cpp +++ b/r5dev/sdklauncher/sdklauncher.cpp @@ -1,5 +1,16 @@ #include "core/stdafx.h" #include "sdklauncher.h" +#include "basepanel.h" +#include +#include "gdiplus.h" +#include "shellapi.h" + +using namespace Gdiplus; + +#pragma comment (lib,"Shell32.lib") +#pragma comment (lib,"Gdi32.lib") +#pragma comment (lib,"Gdiplus.lib") +#pragma comment (lib,"Advapi32.lib") //----------------------------------------------------------------------------- // Purpose switch case: @@ -7,141 +18,140 @@ // * Load specified command line arguments from a file on the disk. // * Format the file paths for the game exe and specified hook dll. //----------------------------------------------------------------------------- -bool LaunchR5Apex(eLaunchMode lMode, eLaunchState lState) +bool CLauncher::Setup(eLaunchMode lMode, eLaunchState lState) { /////////////////////////////////////////////////////////////////////////// - // Initialize strings. - std::string svWorkerDll = std::string(); - std::string svGameDir = std::string(); std::string svCmdLineArgs = std::string(); - std::string svStartCmdLine = std::string(); - std::string svCurrentDir = std::filesystem::current_path().u8string(); /////////////////////////////////////////////////////////////////////////// - // Determine launch mode. switch (lMode) { - case eLaunchMode::LM_DEBUG_GAME: + case eLaunchMode::LM_DEBUG_GAME: + { + fs::path cfgPath = fs::current_path() /= "platform\\cfg\\startup_debug.cfg"; + std::ifstream cfgFile(cfgPath); + if (cfgFile.good() && cfgFile) { - fs::path cfgPath = fs::current_path() /= "platform\\cfg\\startup_debug.cfg"; // Get cfg path for debug startup. - std::ifstream cfgFile(cfgPath); // Read the cfg file. - if (cfgFile.good() && cfgFile) // Does the cfg file exist? - { - std::stringstream ss; - ss << cfgFile.rdbuf(); // Read ifstream buffer into stringstream. - svCmdLineArgs = ss.str() + "-launcher"; // Get all the contents of the cfg file. - } - else - { - spdlog::error("File 'platform\\cfg\\startup_debug.cfg' does not exist!\n"); - cfgFile.close(); - return false; - } - cfgFile.close(); // Close cfg file. - - svWorkerDll = svCurrentDir + "\\gamesdk.dll"; // Get path to worker dll. - svGameDir = svCurrentDir + "\\r5apex.exe"; // Get path to game executeable. - svStartCmdLine = svCurrentDir + "\\r5apex.exe " + svCmdLineArgs; // Setup startup command line string. - - spdlog::info("*** LAUNCHING GAME [DEBUG] ***\n"); - break; + std::stringstream ss; + ss << cfgFile.rdbuf(); + svCmdLineArgs = ss.str() + "-launcher"; } - case eLaunchMode::LM_RELEASE_GAME: + else { - fs::path cfgPath = fs::current_path() /= "platform\\cfg\\startup_retail.cfg"; // Get cfg path for release startup. - std::ifstream cfgFile(cfgPath); // Read the cfg file. - if (cfgFile.good() && cfgFile) // Does the cfg file exist? - { - std::stringstream ss; - ss << cfgFile.rdbuf(); // Read ifstream buffer into stringstream. - svCmdLineArgs = ss.str() + "-launcher"; // Get all the contents of the cfg file. - } - else - { - spdlog::error("File 'platform\\cfg\\startup_retail.cfg' does not exist!\n"); - cfgFile.close(); - return false; - } - cfgFile.close(); // Close cfg file. - - svWorkerDll = svCurrentDir + "\\gamesdk.dll"; // Get path to worker dll. - svGameDir = svCurrentDir + "\\r5apex.exe"; // Get path to game executeable. - svStartCmdLine = svCurrentDir + "\\r5apex.exe " + svCmdLineArgs; // Setup startup command line string. - - spdlog::info("*** LAUNCHING GAME [RELEASE] ***\n"); - break; - } - case eLaunchMode::LM_DEBUG_DEDI: - { - fs::path cfgPath = fs::current_path() /= "platform\\cfg\\startup_dedi_debug.cfg"; // Get cfg path for dedicated startup. - std::ifstream cfgFile(cfgPath); // Read the cfg file. - if (cfgFile.good() && cfgFile) // Does the cfg file exist? - { - std::stringstream ss; - ss << cfgFile.rdbuf(); // Read ifstream buffer into stringstream. - svCmdLineArgs = ss.str() + "-launcher"; // Get all the contents of the cfg file. - } - else - { - spdlog::error("File 'platform\\cfg\\startup_dedi_debug.cfg' does not exist!\n"); - cfgFile.close(); - return false; - } - cfgFile.close(); // Close cfg file. - - svWorkerDll = svCurrentDir + "\\dedicated.dll"; // Get path to worker dll. - svGameDir = svCurrentDir + "\\r5apex_ds.exe"; // Get path to game executeable. - svStartCmdLine = svCurrentDir + "\\r5apex_ds.exe " + svCmdLineArgs; // Setup startup command line string. - - spdlog::info("*** LAUNCHING DEDICATED [DEBUG] ***\n"); - break; - } - case eLaunchMode::LM_RELEASE_DEDI: - { - fs::path cfgPath = fs::current_path() /= "platform\\cfg\\startup_dedi_retail.cfg"; // Get cfg path for dedicated startup. - std::ifstream cfgFile(cfgPath); // Read the cfg file. - if (cfgFile.good() && cfgFile) // Does the cfg file exist? - { - std::stringstream ss; - ss << cfgFile.rdbuf(); // Read ifstream buffer into stringstream. - svCmdLineArgs = ss.str(); // Get all the contents of the cfg file. - } - else - { - spdlog::error("File 'platform\\cfg\\startup_dedi_retail.cfg' does not exist!\n"); - cfgFile.close(); - return false; - } - cfgFile.close(); // Close cfg file. - - svWorkerDll = svCurrentDir + "\\dedicated.dll"; // Get path to worker dll. - svGameDir = svCurrentDir + "\\r5apex_ds.exe"; // Get path to game executeable. - svStartCmdLine = svCurrentDir + "\\r5apex_ds.exe " + svCmdLineArgs; // Setup startup command line string. - - spdlog::info("*** LAUNCHING DEDICATED [RELEASE] ***\n"); - break; - } - default: - { - spdlog::error("*** NO LAUNCH MODE SPECIFIED ***\n"); + spdlog::error("File 'platform\\cfg\\startup_debug.cfg' does not exist!\n"); + cfgFile.close(); return false; } + cfgFile.close(); // Close cfg file. + + m_svWorkerDll = m_svCurrentDir + "\\gamesdk.dll"; + m_svGameExe = m_svCurrentDir + "\\r5apex.exe"; + m_svCmdLine = m_svCurrentDir + "\\r5apex.exe " + svCmdLineArgs; + + spdlog::info("*** LAUNCHING GAME [DEBUG] ***\n"); + break; + } + case eLaunchMode::LM_RELEASE_GAME: + { + fs::path cfgPath = fs::current_path() /= "platform\\cfg\\startup_retail.cfg"; + std::ifstream cfgFile(cfgPath); + if (cfgFile.good() && cfgFile) + { + std::stringstream ss; + ss << cfgFile.rdbuf(); + svCmdLineArgs = ss.str() + "-launcher"; + } + else + { + spdlog::error("File 'platform\\cfg\\startup_retail.cfg' does not exist!\n"); + cfgFile.close(); + return false; + } + cfgFile.close(); // Close cfg file. + + m_svWorkerDll = m_svCurrentDir + "\\gamesdk.dll"; + m_svGameExe = m_svCurrentDir + "\\r5apex.exe"; + m_svCmdLine = m_svCurrentDir + "\\r5apex.exe " + svCmdLineArgs; + + spdlog::info("*** LAUNCHING GAME [RELEASE] ***\n"); + break; + } + case eLaunchMode::LM_DEBUG_DEDI: + { + fs::path cfgPath = fs::current_path() /= "platform\\cfg\\startup_dedi_debug.cfg"; + std::ifstream cfgFile(cfgPath); + if (cfgFile.good() && cfgFile) + { + std::stringstream ss; + ss << cfgFile.rdbuf(); + svCmdLineArgs = ss.str() + "-launcher"; + } + else + { + spdlog::error("File 'platform\\cfg\\startup_dedi_debug.cfg' does not exist!\n"); + cfgFile.close(); + return false; + } + cfgFile.close(); // Close cfg file. + + m_svWorkerDll = m_svCurrentDir + "\\dedicated.dll"; + m_svGameExe = m_svCurrentDir + "\\r5apex_ds.exe"; + m_svCmdLine = m_svCurrentDir + "\\r5apex_ds.exe " + svCmdLineArgs; + + spdlog::info("*** LAUNCHING DEDICATED [DEBUG] ***\n"); + break; + } + case eLaunchMode::LM_RELEASE_DEDI: + { + fs::path cfgPath = fs::current_path() /= "platform\\cfg\\startup_dedi_retail.cfg"; + std::ifstream cfgFile(cfgPath); + if (cfgFile.good() && cfgFile) + { + std::stringstream ss; + ss << cfgFile.rdbuf(); + svCmdLineArgs = ss.str(); +"-launcher"; + } + else + { + spdlog::error("File 'platform\\cfg\\startup_dedi_retail.cfg' does not exist!\n"); + cfgFile.close(); + return false; + } + cfgFile.close(); // Close cfg file. + + m_svWorkerDll = m_svCurrentDir + "\\dedicated.dll"; + m_svGameExe = m_svCurrentDir + "\\r5apex_ds.exe"; + m_svCmdLine = m_svCurrentDir + "\\r5apex_ds.exe " + svCmdLineArgs; + + spdlog::info("*** LAUNCHING DEDICATED [RELEASE] ***\n"); + break; + } + default: + { + spdlog::error("*** NO LAUNCH MODE SPECIFIED ***\n"); + return false; + } } /////////////////////////////////////////////////////////////////////////// - // Print the file paths and arguments. +// Print the file paths and arguments. std::cout << "----------------------------------------------------------------------------------------------------------------------" << std::endl; - spdlog::debug("- CWD: {}\n", svCurrentDir); - spdlog::debug("- EXE: {}\n", svGameDir); - spdlog::debug("- DLL: {}\n", svWorkerDll); + spdlog::debug("- CWD: {}\n", m_svCurrentDir); + spdlog::debug("- EXE: {}\n", m_svGameExe); + spdlog::debug("- DLL: {}\n", m_svWorkerDll); spdlog::debug("- CLI: {}\n", svCmdLineArgs); std::cout << "----------------------------------------------------------------------------------------------------------------------" << std::endl; + return true; +} + +bool CLauncher::Launch() +{ /////////////////////////////////////////////////////////////////////////// // Build our list of dlls to inject. LPCSTR DllsToInject[1] = { - svWorkerDll.c_str() + m_svWorkerDll.c_str() }; STARTUPINFOA StartupInfo = { 0 }; @@ -154,14 +164,14 @@ bool LaunchR5Apex(eLaunchMode lMode, eLaunchState lState) // Create the game process in a suspended state with our dll. BOOL result = DetourCreateProcessWithDllsA ( - svGameDir.c_str(), // lpApplicationName - (LPSTR)svStartCmdLine.c_str(), // lpCommandLine + m_svGameExe.c_str(), // lpApplicationName + (LPSTR)m_svCmdLine.c_str(), // lpCommandLine NULL, // lpProcessAttributes NULL, // lpThreadAttributes FALSE, // bInheritHandles CREATE_SUSPENDED, // dwCreationFlags NULL, // lpEnvironment - svCurrentDir.c_str(), // lpCurrentDirectory + m_svCurrentDir.c_str(), // lpCurrentDirectory &StartupInfo, // lpStartupInfo &ProcInfo, // lpProcessInformation sizeof(DllsToInject) / sizeof(LPCSTR), // nDlls @@ -197,101 +207,178 @@ int main(int argc, char* argv[], char* envp[]) spdlog::set_pattern("[%^%l%$] %v"); spdlog::set_level(spdlog::level::trace); - for (int i = 1; i < argc; ++i) + if (argc < 2) { - std::string arg = argv[i]; - if ((arg == "-debug") || (arg == "-dbg")) - { - LaunchR5Apex(eLaunchMode::LM_DEBUG_GAME, eLaunchState::LS_CHEATS); - Sleep(2000); - return EXIT_SUCCESS; - } - if ((arg == "-release") || (arg == "-rel")) - { - LaunchR5Apex(eLaunchMode::LM_RELEASE_GAME, eLaunchState::LS_CHEATS); - Sleep(2000); - return EXIT_SUCCESS; - } - if ((arg == "-dedicated_dev") || (arg == "-dedid")) - { - LaunchR5Apex(eLaunchMode::LM_DEBUG_DEDI, eLaunchState::LS_CHEATS); - Sleep(2000); - return EXIT_SUCCESS; - } - if ((arg == "-dedicated") || (arg == "-dedi")) - { - LaunchR5Apex(eLaunchMode::LM_RELEASE_DEDI, eLaunchState::LS_CHEATS); - Sleep(2000); - return EXIT_SUCCESS; - } + Forms::Application::EnableVisualStyles(); + UIX::UIXTheme::InitializeRenderer(new Themes::KoreTheme()); + + CUIBasePanel* mainUI = new CUIBasePanel(); + Forms::Application::Run(mainUI); + UIX::UIXTheme::ShutdownRenderer(); } - - std::cout << "----------------------------------------------------------------------------------------------------------------------" << std::endl; - spdlog::warn("If a DEBUG option has been choosen as launch parameter, do not broadcast servers to the Server Browser!\n"); - spdlog::warn("All FCVAR_CHEAT | FCVAR_DEVELOPMENTONLY ConVar's/ConCommand's will be enabled.\n"); - spdlog::warn("Connected clients will be able to set and execute anything flagged FCVAR_CHEAT | FCVAR_DEVELOPMENTONLY.\n"); - std::cout << "----------------------------------------------------------------------------------------------------------------------" << std::endl; - spdlog::warn("Use DEBUG GAME [1] for research and development purposes.\n"); - spdlog::warn("Use RELEASE GAME [2] for playing the game and creating servers.\n"); - spdlog::warn("Use DEBUG DEDICATED [3] for research and development purposes.\n"); - spdlog::warn("Use RELEASE DEDICATED [4] for running and hosting dedicated servers.\n"); - std::cout << "----------------------------------------------------------------------------------------------------------------------" << std::endl; - spdlog::info("Enter '1' for 'DEBUG GAME'.\n"); - spdlog::info("Enter '2' for 'RELEASE GAME'.\n"); - spdlog::info("Enter '3' for 'DEBUG DEDICATED'.\n"); - spdlog::info("Enter '4' for 'RELEASE DEDICATED'.\n"); - std::cout << "----------------------------------------------------------------------------------------------------------------------" << std::endl; - std::cout << "User input: "; - - std::string input = std::string(); - if (std::cin >> input) + else { - try + for (int i = 1; i < argc; ++i) { - eLaunchMode mode = (eLaunchMode)std::stoi(input); - switch (mode) + std::string arg = argv[i]; + if ((arg == "-debug") || (arg == "-dbg")) { - case eLaunchMode::LM_DEBUG_GAME: - { - LaunchR5Apex(eLaunchMode::LM_DEBUG_GAME, eLaunchState::LS_CHEATS); + if (g_pLauncher->Setup(eLaunchMode::LM_DEBUG_GAME, eLaunchState::LS_CHEATS)) + { + if (g_pLauncher->Launch()) + { + Sleep(2000); + return EXIT_SUCCESS; + } + } + Sleep(2000); - return EXIT_SUCCESS; + return EXIT_FAILURE; } - case eLaunchMode::LM_RELEASE_GAME: + if ((arg == "-release") || (arg == "-rel")) { - LaunchR5Apex(eLaunchMode::LM_RELEASE_GAME, eLaunchState::LS_CHEATS); + if (g_pLauncher->Setup(eLaunchMode::LM_RELEASE_GAME, eLaunchState::LS_CHEATS)) + { + if (g_pLauncher->Launch()) + { + Sleep(2000); + return EXIT_SUCCESS; + } + } + Sleep(2000); - return EXIT_SUCCESS; + return EXIT_FAILURE; } - case eLaunchMode::LM_DEBUG_DEDI: + if ((arg == "-dedicated_dev") || (arg == "-dedid")) { - LaunchR5Apex(eLaunchMode::LM_DEBUG_DEDI, eLaunchState::LS_CHEATS); + if (g_pLauncher->Setup(eLaunchMode::LM_DEBUG_DEDI, eLaunchState::LS_CHEATS)) + { + if (g_pLauncher->Launch()) + { + Sleep(2000); + return EXIT_SUCCESS; + } + } + Sleep(2000); - return EXIT_SUCCESS; + return EXIT_FAILURE; } - case eLaunchMode::LM_RELEASE_DEDI: + if ((arg == "-dedicated") || (arg == "-dedi")) { - LaunchR5Apex(eLaunchMode::LM_RELEASE_DEDI, eLaunchState::LS_CHEATS); + if (g_pLauncher->Setup(eLaunchMode::LM_RELEASE_DEDI, eLaunchState::LS_CHEATS)) + { + if (g_pLauncher->Launch()) + { + Sleep(2000); + return EXIT_SUCCESS; + } + } + Sleep(2000); - return EXIT_SUCCESS; + return EXIT_FAILURE; } - default: + } + + std::cout << "----------------------------------------------------------------------------------------------------------------------" << std::endl; + spdlog::warn("If a DEBUG option has been choosen as launch parameter, do not broadcast servers to the Server Browser!\n"); + spdlog::warn("All FCVAR_CHEAT | FCVAR_DEVELOPMENTONLY ConVar's/ConCommand's will be enabled.\n"); + spdlog::warn("Connected clients will be able to set and execute anything flagged FCVAR_CHEAT | FCVAR_DEVELOPMENTONLY.\n"); + std::cout << "----------------------------------------------------------------------------------------------------------------------" << std::endl; + spdlog::warn("Use DEBUG GAME [1] for research and development purposes.\n"); + spdlog::warn("Use RELEASE GAME [2] for playing the game and creating servers.\n"); + spdlog::warn("Use DEBUG DEDICATED [3] for research and development purposes.\n"); + spdlog::warn("Use RELEASE DEDICATED [4] for running and hosting dedicated servers.\n"); + std::cout << "----------------------------------------------------------------------------------------------------------------------" << std::endl; + spdlog::info("Enter '1' for 'DEBUG GAME'.\n"); + spdlog::info("Enter '2' for 'RELEASE GAME'.\n"); + spdlog::info("Enter '3' for 'DEBUG DEDICATED'.\n"); + spdlog::info("Enter '4' for 'RELEASE DEDICATED'.\n"); + std::cout << "----------------------------------------------------------------------------------------------------------------------" << std::endl; + std::cout << "User input: "; + + std::string input = std::string(); + if (std::cin >> input) + { + try { - spdlog::error("R5Reloaded requires '1' for DEBUG GAME mode, '2' for RELEASE GAME mode, '3' for DEBUG DEDICATED mode, '4' for RELEASE DEDICATED mode.\n"); + eLaunchMode mode = (eLaunchMode)std::stoi(input); + switch (mode) + { + case eLaunchMode::LM_DEBUG_GAME: + { + if (g_pLauncher->Setup(eLaunchMode::LM_DEBUG_GAME, eLaunchState::LS_CHEATS)) + { + if (g_pLauncher->Launch()) + { + Sleep(2000); + return EXIT_SUCCESS; + } + } + + Sleep(2000); + return EXIT_FAILURE; + } + case eLaunchMode::LM_RELEASE_GAME: + { + if (g_pLauncher->Setup(eLaunchMode::LM_RELEASE_GAME, eLaunchState::LS_CHEATS)) + { + if (g_pLauncher->Launch()) + { + Sleep(2000); + return EXIT_SUCCESS; + } + } + + Sleep(2000); + return EXIT_FAILURE; + } + case eLaunchMode::LM_DEBUG_DEDI: + { + if (g_pLauncher->Setup(eLaunchMode::LM_DEBUG_DEDI, eLaunchState::LS_CHEATS)) + { + if (g_pLauncher->Launch()) + { + Sleep(2000); + return EXIT_SUCCESS; + } + } + + Sleep(2000); + return EXIT_FAILURE; + } + case eLaunchMode::LM_RELEASE_DEDI: + { + if (g_pLauncher->Setup(eLaunchMode::LM_RELEASE_DEDI, eLaunchState::LS_CHEATS)) + { + if (g_pLauncher->Launch()) + { + Sleep(2000); + return EXIT_SUCCESS; + } + } + + Sleep(2000); + return EXIT_FAILURE; + } + default: + { + spdlog::error("R5Reloaded requires '1' for DEBUG GAME mode, '2' for RELEASE GAME mode, '3' for DEBUG DEDICATED mode, '4' for RELEASE DEDICATED mode.\n"); + Sleep(5000); + return EXIT_FAILURE; + } + } + } + catch (std::exception& e) + { + spdlog::error("R5Reloaded only takes numerical input to launch. Error: {}.\n", e.what()); Sleep(5000); return EXIT_FAILURE; } - } } - catch (std::exception& e) - { - spdlog::error("R5Reloaded only takes numerical input to launch. Error: {}.\n", e.what()); - Sleep(5000); - return EXIT_FAILURE; - } - } - spdlog::error("R5Reloaded requires numerical input to launch.\n"); + spdlog::error("R5Reloaded requires numerical input to launch.\n"); - Sleep(5000); - return EXIT_FAILURE; + Sleep(5000); + return EXIT_FAILURE; + } + return EXIT_SUCCESS; } diff --git a/r5dev/sdklauncher/sdklauncher.h b/r5dev/sdklauncher/sdklauncher.h index eac677c5..4cd8d994 100644 --- a/r5dev/sdklauncher/sdklauncher.h +++ b/r5dev/sdklauncher/sdklauncher.h @@ -22,3 +22,22 @@ enum class eLaunchState : int LS_CHEATS, // Enable cheats LS_DEBUG // Enable debug }; + +class CLauncher +{ +public: + CLauncher() + { + m_svCurrentDir = fs::current_path().u8string(); + } + + bool Setup(eLaunchMode lMode, eLaunchState lState); + bool Launch(); + +private: + string m_svWorkerDll; + string m_svGameExe; + string m_svCmdLine; + string m_svCurrentDir; +}; +inline CLauncher* g_pLauncher = new CLauncher(); \ No newline at end of file diff --git a/r5dev/vproj/sdklauncher.vcxproj b/r5dev/vproj/sdklauncher.vcxproj index 7bf45d2f..7a05433b 100644 --- a/r5dev/vproj/sdklauncher.vcxproj +++ b/r5dev/vproj/sdklauncher.vcxproj @@ -127,6 +127,7 @@ Create + @@ -139,6 +140,7 @@ + diff --git a/r5dev/vproj/sdklauncher.vcxproj.filters b/r5dev/vproj/sdklauncher.vcxproj.filters index 2f5576c5..677fe4b3 100644 --- a/r5dev/vproj/sdklauncher.vcxproj.filters +++ b/r5dev/vproj/sdklauncher.vcxproj.filters @@ -30,6 +30,9 @@ Source Files + + Source Files + @@ -58,6 +61,9 @@ Header Files + + Header Files +