mirror of
https://github.com/BeamMP/BeamMP-Launcher.git
synced 2025-07-01 23:46:59 +00:00
The way it was done was so horrid, it was not only impossible to debug, with TODO comments saying it sucks, and other shit like that, but it was also just full of data races. You can rest easy however - I left most of the data races in there <3 For nostalgia (totally not because it's a massive pain to fix that). We now do single-threaded download, which can not only saturate my 100 Mbit/s line without any hickups, it can also go up to ~600000 Mbit/s for localhost transfers :) So I think it's fine.
124 lines
3.7 KiB
C++
124 lines
3.7 KiB
C++
// Copyright (c) 2019-present Anonymous275.
|
|
// BeamMP Launcher code is not in the public domain and is not free software.
|
|
// One must be granted explicit permission by the copyright holder in order to modify or distribute any part of the source or binaries.
|
|
// Anything else is prohibited. Modified works may not be published and have be upstreamed to the official repository.
|
|
///
|
|
/// Created by Anonymous275 on 7/19/2020
|
|
///
|
|
|
|
#if defined(_WIN32)
|
|
#include <windows.h>
|
|
#elif defined(__linux__)
|
|
#include "vdf_parser.hpp"
|
|
#include <pwd.h>
|
|
#include <spawn.h>
|
|
#include <sys/types.h>
|
|
#include <sys/wait.h>
|
|
#include <unistd.h>
|
|
#endif
|
|
|
|
#include "Logger.h"
|
|
#include "Startup.h"
|
|
#include <Security/Init.h>
|
|
#include <filesystem>
|
|
#include <thread>
|
|
|
|
unsigned long GamePID = 0;
|
|
#if defined(_WIN32)
|
|
std::string QueryKey(HKEY hKey, int ID);
|
|
std::string GetGamePath() {
|
|
static std::string Path;
|
|
if (!Path.empty())
|
|
return Path;
|
|
|
|
HKEY hKey;
|
|
LPCTSTR sk = "Software\\BeamNG\\BeamNG.drive";
|
|
LONG openRes = RegOpenKeyEx(HKEY_CURRENT_USER, sk, 0, KEY_ALL_ACCESS, &hKey);
|
|
if (openRes != ERROR_SUCCESS) {
|
|
fatal("Please launch the game at least once!");
|
|
}
|
|
Path = QueryKey(hKey, 4);
|
|
|
|
if (Path.empty()) {
|
|
sk = R"(SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders)";
|
|
openRes = RegOpenKeyEx(HKEY_CURRENT_USER, sk, 0, KEY_ALL_ACCESS, &hKey);
|
|
if (openRes != ERROR_SUCCESS) {
|
|
sk = R"(SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders)";
|
|
openRes = RegOpenKeyEx(HKEY_CURRENT_USER, sk, 0, KEY_ALL_ACCESS, &hKey);
|
|
}
|
|
if (openRes != ERROR_SUCCESS) {
|
|
fatal("Cannot get Local Appdata directory");
|
|
}
|
|
|
|
Path = QueryKey(hKey, 5);
|
|
Path += "\\BeamNG.drive\\";
|
|
}
|
|
|
|
std::string Ver = CheckVer(GetGameDir());
|
|
Ver = Ver.substr(0, Ver.find('.', Ver.find('.') + 1));
|
|
Path += Ver + "\\";
|
|
return Path;
|
|
}
|
|
#elif defined(__linux__)
|
|
std::string GetGamePath() {
|
|
// Right now only steam is supported
|
|
struct passwd* pw = getpwuid(getuid());
|
|
std::string homeDir = pw->pw_dir;
|
|
|
|
std::string Path = homeDir + "/.local/share/BeamNG.drive/";
|
|
std::string Ver = CheckVer(GetGameDir());
|
|
Ver = Ver.substr(0, Ver.find('.', Ver.find('.') + 1));
|
|
Path += Ver + "/";
|
|
return Path;
|
|
}
|
|
#endif
|
|
|
|
#if defined(_WIN32)
|
|
void StartGame(std::string Dir) {
|
|
BOOL bSuccess = FALSE;
|
|
PROCESS_INFORMATION pi;
|
|
STARTUPINFO si = { 0 };
|
|
si.cb = sizeof(si);
|
|
std::string BaseDir = Dir; //+"\\Bin64";
|
|
// Dir += R"(\Bin64\BeamNG.drive.x64.exe)";
|
|
Dir += "\\BeamNG.drive.exe";
|
|
bSuccess = CreateProcessA(Dir.c_str(), nullptr, nullptr, nullptr, TRUE, 0, nullptr, BaseDir.c_str(), &si, &pi);
|
|
if (bSuccess) {
|
|
info("Game Launched!");
|
|
GamePID = pi.dwProcessId;
|
|
WaitForSingleObject(pi.hProcess, INFINITE);
|
|
error("Game Closed! launcher closing soon");
|
|
} else {
|
|
error("Failed to Launch the game! launcher closing soon");
|
|
}
|
|
std::this_thread::sleep_for(std::chrono::seconds(5));
|
|
exit(2);
|
|
}
|
|
#elif defined(__linux__)
|
|
void StartGame(std::string Dir) {
|
|
int status;
|
|
std::string filename = (Dir + "/BinLinux/BeamNG.drive.x64");
|
|
char* argv[] = { filename.data(), NULL };
|
|
pid_t pid;
|
|
int result = posix_spawn(&pid, filename.c_str(), NULL, NULL, argv, environ);
|
|
|
|
if (result != 0) {
|
|
error("Failed to Launch the game! launcher closing soon");
|
|
return;
|
|
} else {
|
|
waitpid(pid, &status, 0);
|
|
error("Game Closed! launcher closing soon");
|
|
}
|
|
|
|
std::this_thread::sleep_for(std::chrono::seconds(5));
|
|
exit(2);
|
|
}
|
|
#endif
|
|
|
|
void InitGame(const std::string& Dir) {
|
|
if (!Dev) {
|
|
std::thread Game(StartGame, Dir);
|
|
Game.detach();
|
|
}
|
|
}
|