diff --git a/.gitea/workflows/build-trigger.yaml b/.gitea/workflows/build-trigger.yaml
new file mode 100644
index 0000000..6b66d9f
--- /dev/null
+++ b/.gitea/workflows/build-trigger.yaml
@@ -0,0 +1,35 @@
+name: Trigger Main Build Pipeline
+
+on:
+ push:
+ tags:
+ - '*'
+
+jobs:
+ trigger-main-build:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Setup Git Config
+ run: |
+ git config --global user.email "noreply@sp-tarkov.com"
+ git config --global user.name "TriggerBot"
+
+ - name: Clone Build Repository
+ run: |
+ rm -rf ../Build
+ git clone https://${{ secrets.BUILD_USERNAME }}:${{ secrets.BUILD_ACCESS_TOKEN }}@dev.sp-tarkov.com/SPT-AKI/Build.git ../Build
+
+ - name: Trigger Branch
+ working-directory: ../Build
+ run: git checkout -b trigger || git checkout trigger
+
+ - name: Create Trigger File
+ working-directory: ../Build
+ run: |
+ echo "${GITHUB_REF_NAME}" > .gitea/trigger
+ git add .gitea/trigger
+ git commit -m "Launcher triggered build with tag '${GITHUB_REF_NAME}'"
+
+ - name: Force Push
+ working-directory: ../Build
+ run: git push --force origin trigger
diff --git a/README.md b/README.md
index ffa68cb..e69e5e5 100644
--- a/README.md
+++ b/README.md
@@ -19,9 +19,10 @@ git config --local user.email "USERNAME@SOMETHING.com"
## Requirements
-- Escape From Tarkov 26535
+- Escape From Tarkov 29197
- .NET 6 SDK
- Visual Studio Code
+- [PowerShell v7](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows)
### For UI Development
@@ -31,7 +32,7 @@ git config --local user.email "USERNAME@SOMETHING.com"
## Build
1. Run `dotnet tool restore` from command line inside project folder
2. Open Launcher.code-workspace in Visual Studio Code.
-3. Run the build task: (top toolbar) Terminal -> Run Build Task...
+3. Run the build task: (top toolbar) Terminal -> Run Build Task... (requires running twice on first run)
4. Copy-paste all files inside `Build` into `game root directory`, overwrite when prompted.
## Server Endpoints
diff --git a/project/.config/dotnet-tools.json b/project/.config/dotnet-tools.json
deleted file mode 100644
index 31e896e..0000000
--- a/project/.config/dotnet-tools.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "version": 1,
- "isRoot": true,
- "tools": {
- "cake.tool": {
- "version": "2.0.0",
- "commands": [
- "dotnet-cake"
- ]
- }
- }
-}
\ No newline at end of file
diff --git a/project/Aki.Build/Aki.Build.csproj b/project/Aki.Build/Aki.Build.csproj
index 29c7892..f78b6e4 100644
--- a/project/Aki.Build/Aki.Build.csproj
+++ b/project/Aki.Build/Aki.Build.csproj
@@ -1,22 +1,13 @@
-
- net6.0
- win10-x64
-
+
+ net8.0
+ win-x64
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
diff --git a/project/Aki.ByteBanger/Aki.ByteBanger.csproj b/project/Aki.ByteBanger/Aki.ByteBanger.csproj
index fff7812..ae2821e 100644
--- a/project/Aki.ByteBanger/Aki.ByteBanger.csproj
+++ b/project/Aki.ByteBanger/Aki.ByteBanger.csproj
@@ -1,7 +1,7 @@
- net6.0
+ net8.0
diff --git a/project/Aki.ByteBanger/PatchUtil.cs b/project/Aki.ByteBanger/PatchUtil.cs
index f5b67b5..e032cf1 100644
--- a/project/Aki.ByteBanger/PatchUtil.cs
+++ b/project/Aki.ByteBanger/PatchUtil.cs
@@ -24,7 +24,7 @@ namespace Aki.ByteBanger
PatchedLength = patched.Length
};
- using (SHA256CryptoServiceProvider sha256 = new SHA256CryptoServiceProvider())
+ using (SHA256 sha256 = SHA256.Create())
{
pi.OriginalChecksum = sha256.ComputeHash(original);
pi.PatchedChecksum = sha256.ComputeHash(patched);
@@ -97,7 +97,7 @@ namespace Aki.ByteBanger
public static PatchResult Patch(byte[] input, PatchInfo pi)
{
byte[] inputHash;
- using (SHA256CryptoServiceProvider sha256 = new SHA256CryptoServiceProvider())
+ using (SHA256 sha256 = SHA256.Create())
{
inputHash = sha256.ComputeHash(input);
}
@@ -114,7 +114,7 @@ namespace Aki.ByteBanger
Array.Copy(itm.Data, 0, patchedData, itm.Offset, itm.Data.Length);
byte[] patchedHash;
- using (SHA256CryptoServiceProvider sha256 = new SHA256CryptoServiceProvider())
+ using (SHA256 sha256 = SHA256.Create())
{
patchedHash = sha256.ComputeHash(patchedData);
}
diff --git a/project/Aki.Launcher.Base/Aki.Launcher.Base.csproj b/project/Aki.Launcher.Base/Aki.Launcher.Base.csproj
index 7f8cf16..3f9a5fc 100644
--- a/project/Aki.Launcher.Base/Aki.Launcher.Base.csproj
+++ b/project/Aki.Launcher.Base/Aki.Launcher.Base.csproj
@@ -1,7 +1,7 @@
- net6.0
+ net8.0Aki.Launch
diff --git a/project/Aki.Launcher.Base/Controllers/AccountManager.cs b/project/Aki.Launcher.Base/Controllers/AccountManager.cs
index e2ae19f..6e302a4 100644
--- a/project/Aki.Launcher.Base/Controllers/AccountManager.cs
+++ b/project/Aki.Launcher.Base/Controllers/AccountManager.cs
@@ -8,11 +8,13 @@
*/
+using System;
using Aki.Launcher.Helpers;
using Aki.Launcher.MiniCommon;
using Aki.Launcher.Models.Aki;
using Aki.Launcher.Models.Launcher;
using System.Threading.Tasks;
+using Aki.Launcher.Controllers;
namespace Aki.Launcher
{
@@ -135,6 +137,8 @@ namespace Aki.Launcher
{
return AccountStatus.NoConnection;
}
+
+ LogManager.Instance.Info($"Account Registered: {username}");
return Login(username, password);
}
@@ -159,16 +163,20 @@ namespace Aki.Launcher
if(Json.Deserialize(json))
{
SelectedAccount = null;
+
+ LogManager.Instance.Info($"Account Removed: {data.username}");
return AccountStatus.OK;
}
else
{
+ LogManager.Instance.Error($"Failed to remove account: {data.username}");
return AccountStatus.UpdateFailed;
}
}
catch
{
+ LogManager.Instance.Error($"Failed to remove account: {data.username} - NO CONNECTION");
return AccountStatus.NoConnection;
}
}
@@ -271,15 +279,18 @@ namespace Aki.Launcher
if (json != STATUS_OK)
{
+ LogManager.Instance.Error($"Failed to wipe account: {data.username}");
return AccountStatus.UpdateFailed;
}
}
catch
{
+ LogManager.Instance.Error($"Failed to wipe account: {data.username} - NO CONNECTION");
return AccountStatus.NoConnection;
}
SelectedAccount.edition = edition;
+ LogManager.Instance.Info($"Account Wiped: {data.username} -> {edition}");
return AccountStatus.OK;
}
}
diff --git a/project/Aki.Launcher.Base/Controllers/GameStarter.cs b/project/Aki.Launcher.Base/Controllers/GameStarter.cs
index 4131ac3..de50288 100644
--- a/project/Aki.Launcher.Base/Controllers/GameStarter.cs
+++ b/project/Aki.Launcher.Base/Controllers/GameStarter.cs
@@ -57,23 +57,32 @@ namespace Aki.Launcher
public async Task LaunchGame(ServerInfo server, AccountInfo account, string gamePath)
{
+ LogManager.Instance.Info(">>> Launching Game");
+ LogManager.Instance.Info($">>> Account: {account.username}");
+ LogManager.Instance.Info($">>> Server : {server.backendUrl}");
// setup directories
if (IsInstalledInLive())
{
- LogManager.Instance.Warning("Failed installed in live check");
+ LogManager.Instance.Error("[LaunchGame] Installed in Live :: YES");
return GameStarterResult.FromError(-1);
}
-
+
+ LogManager.Instance.Info("[LaunchGame] Installed in Live :: NO");
+
+ LogManager.Instance.Info("[LaunchGame] Setup Game Files ...");
SetupGameFiles(gamePath);
if (!ValidationUtil.Validate())
{
- LogManager.Instance.Warning("Failed validation check");
+ LogManager.Instance.Error("[LaunchGame] Game Validation :: FAILED");
return GameStarterResult.FromError(-2);
}
+
+ LogManager.Instance.Info("[LaunchGame] Game Validation :: OK");
if (account.wipe)
{
+ LogManager.Instance.Info("[LaunchGame] Wipe profile requested");
RemoveRegistryKeys();
CleanTempFiles();
}
@@ -83,9 +92,12 @@ namespace Aki.Launcher
if (!File.Exists(clientExecutable))
{
- LogManager.Instance.Warning($"Could not find {clientExecutable}");
+ LogManager.Instance.Error("[LaunchGame] Valid Game Path :: FAILED");
+ LogManager.Instance.Error($"Could not find {clientExecutable}");
return GameStarterResult.FromError(-6);
}
+
+ LogManager.Instance.Info("[LaunchGame] Valid Game Path :: OK");
// apply patches
ProgressReportingPatchRunner patchRunner = new ProgressReportingPatchRunner(gamePath);
@@ -96,10 +108,12 @@ namespace Aki.Launcher
}
catch (TaskCanceledException)
{
- LogManager.Instance.Warning("Failed to apply assembly patch");
+ LogManager.Instance.Error("[LaunchGame] Applying Patch :: FAILED");
return GameStarterResult.FromError(-4);
}
+ LogManager.Instance.Info("[LaunchGame] Applying Patch :: OK");
+
//start game
var args =
$"-force-gfx-jobs native -token={account.id} -config={Json.Serialize(new ClientConfig(server.backendUrl))}";
@@ -107,6 +121,7 @@ namespace Aki.Launcher
if (_showOnly)
{
Console.WriteLine($"{clientExecutable} {args}");
+ LogManager.Instance.Info("[LaunchGame] NOOP :: show only");
}
else
{
@@ -118,6 +133,7 @@ namespace Aki.Launcher
};
Process.Start(clientProcess);
+ LogManager.Instance.Info("[LaunchGame] Game process started");
}
return GameStarterResult.FromSuccess();
@@ -160,6 +176,7 @@ namespace Aki.Launcher
if (File.Exists(file.FullName))
{
File.Delete(file.FullName);
+ LogManager.Instance.Warning($"File removed :: found in live dir: {file.FullName}");
isInstalledInLive = true;
}
}
@@ -169,6 +186,7 @@ namespace Aki.Launcher
if (Directory.Exists(directory.FullName))
{
RemoveFilesRecurse(directory);
+ LogManager.Instance.Warning($"Directory removed :: found in live dir: {directory.FullName}");
isInstalledInLive = true;
}
}
@@ -237,6 +255,7 @@ namespace Aki.Launcher
foreach (var value in key.GetValueNames())
{
key.DeleteValue(value);
+ LogManager.Instance.Debug($"Removing reg key: {key.Name}");
}
}
catch (Exception ex)
@@ -266,6 +285,8 @@ namespace Aki.Launcher
bool RemoveFilesRecurse(DirectoryInfo basedir)
{
+ LogManager.Instance.Info($"Recursive Removal: {basedir}");
+
if (!basedir.Exists)
{
return true;
@@ -286,6 +307,7 @@ namespace Aki.Launcher
{
file.IsReadOnly = false;
file.Delete();
+ LogManager.Instance.Debug($" -> del file: {file.FullName}");
}
// remove directory
diff --git a/project/Aki.Launcher.Base/Controllers/LogManager.cs b/project/Aki.Launcher.Base/Controllers/LogManager.cs
index 8a2a127..9b9c5e5 100644
--- a/project/Aki.Launcher.Base/Controllers/LogManager.cs
+++ b/project/Aki.Launcher.Base/Controllers/LogManager.cs
@@ -17,35 +17,42 @@ namespace Aki.Launcher.Controllers
///
public class LogManager
{
- //TODO - update this to use reflection to get the calling method, class, etc
private static LogManager _instance;
- public static LogManager Instance => _instance ?? (_instance = new LogManager());
- private string filepath;
+ public static LogManager Instance => _instance ??= new LogManager();
+ private readonly string _filePath;
+ private readonly string _logFile;
- public LogManager()
+ private LogManager()
{
- filepath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "user", "logs");
+ _filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "user", "logs");
+ _logFile = Path.Combine(_filePath, "launcher.log");
+
+ if (File.Exists(_logFile))
+ {
+ File.Delete(_logFile);
+ }
+
+ Write($" ==== Launcher Started ====");
}
- public void Write(string text)
+ private void Write(string text)
{
- if (!Directory.Exists(filepath))
+ if (!Directory.Exists(_filePath))
{
- Directory.CreateDirectory(filepath);
+ Directory.CreateDirectory(_filePath);
}
- string filename = Path.Combine(filepath, "launcher.log");
- File.AppendAllLines(filename, new[] { $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}]{text}" });
+ File.AppendAllLines(_logFile, new[] { $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}]{text}" });
}
- public void Debug(string text) => Write($"[Debug]{text}");
+ public void Debug(string text) => Write($"[Debug] {text}");
- public void Info(string text) => Write($"[Info]{text}");
+ public void Info(string text) => Write($"[Info] {text}");
- public void Warning(string text) => Write($"[Warning]{text}");
+ public void Warning(string text) => Write($"[Warning] {text}");
- public void Error(string text) => Write($"[Error]{text}");
+ public void Error(string text) => Write($"[Error] {text}");
- public void Exception(Exception ex) => Write($"[Exception]{ex.Message}\nStacktrace:\n{ex.StackTrace}");
+ public void Exception(Exception ex) => Write($"[Exception] {ex.Message}\nStacktrace:\n{ex.StackTrace}");
}
}
diff --git a/project/Aki.Launcher.Base/Helpers/LauncherSettingsProvider.cs b/project/Aki.Launcher.Base/Helpers/LauncherSettingsProvider.cs
index aa2d571..771b513 100644
--- a/project/Aki.Launcher.Base/Helpers/LauncherSettingsProvider.cs
+++ b/project/Aki.Launcher.Base/Helpers/LauncherSettingsProvider.cs
@@ -14,6 +14,7 @@ using Newtonsoft.Json;
using System;
using System.ComponentModel;
using System.IO;
+using Aki.Launcher.Controllers;
namespace Aki.Launcher.Helpers
{
@@ -142,6 +143,8 @@ namespace Aki.Launcher.Helpers
{
if (!File.Exists(LauncherSettingsProvider.DefaultSettingsFileLocation))
{
+ LogManager.Instance.Warning("Launcher config not found");
+ LogManager.Instance.Info($"Creating launcher config: {LauncherSettingsProvider.DefaultSettingsFileLocation}");
LauncherStartGameAction = LauncherAction.MinimizeAction;
UseAutoLogin = true;
GamePath = Environment.CurrentDirectory;
@@ -149,6 +152,8 @@ namespace Aki.Launcher.Helpers
Server = new ServerSetting { Name = "SPT-AKI", Url = "http://127.0.0.1:6969" };
SaveSettings();
}
+
+ LogManager.Instance.Info($"Using launcher config at: {LauncherSettingsProvider.DefaultSettingsFileLocation}");
}
public event PropertyChangedEventHandler PropertyChanged;
diff --git a/project/Aki.Launcher.Base/Helpers/LocalizationProvider.cs b/project/Aki.Launcher.Base/Helpers/LocalizationProvider.cs
index 39a5df3..f469137 100644
--- a/project/Aki.Launcher.Base/Helpers/LocalizationProvider.cs
+++ b/project/Aki.Launcher.Base/Helpers/LocalizationProvider.cs
@@ -16,6 +16,7 @@ using System.ComponentModel;
using System.Globalization;
using System.IO;
using System.Linq;
+using Aki.Launcher.Controllers;
namespace Aki.Launcher.Helpers
{
@@ -41,7 +42,8 @@ namespace Aki.Launcher.Helpers
public static void LoadLocaleFromFile(string localeRomanName)
{
- LocaleData newLocale = Json.LoadClassWithoutSaving(Path.Join(DefaultLocaleFolderPath, $"{localeRomanName}.json"));
+ var localePath = Path.Join(DefaultLocaleFolderPath, $"{localeRomanName}.json");
+ LocaleData newLocale = Json.LoadClassWithoutSaving(localePath);
if (newLocale != null)
{
@@ -54,9 +56,11 @@ namespace Aki.Launcher.Helpers
LauncherSettingsProvider.Instance.SaveSettings();
LocaleChanged(null, EventArgs.Empty);
+
+ return;
}
- //could possibly raise an event here to say why the local wasn't changed.
+ LogManager.Instance.Error($"Could not load locale: {localePath}");
}
public static void TryAutoSetLocale()
@@ -172,12 +176,17 @@ namespace Aki.Launcher.Helpers
englishLocale.i_understand = "I Understand";
englishLocale.game_version_mismatch_format_2 = "SPT is unable to run, this is because SPT expected to find EFT version '{1}',\nbut instead found version '{0}'\n\nEnsure you've downgraded your EFT as described in the install guide\non the page you downloaded SPT from";
englishLocale.description = "Description";
- englishLocale.server_mods = "Server Mods";
- englishLocale.profile_mods = "Profile Mods";
englishLocale.author = "Author";
englishLocale.wipe_on_start = "Wipe profile on game start";
englishLocale.copy_live_settings_question = "Would you like to copy your live game settings to spt";
englishLocale.mod_not_in_server_warning = "This mod was found in your profile, but is not loaded on the server";
+ englishLocale.active_server_mods = "Active Server Mods";
+ englishLocale.active_server_mods_info_text = "These mods are currently running on the server";
+ englishLocale.inactive_server_mods = "Inactive Server Mods";
+ englishLocale.inactive_server_mods_info_text =
+ "These mods have not been loaded by the server, but your profile has used them in the past";
+ englishLocale.open_link_question_format_1 = "Are you sure you want to open the following link: \n{0}";
+ englishLocale.open_link = "Open Link";
#endregion
Directory.CreateDirectory(LocalizationProvider.DefaultLocaleFolderPath);
@@ -1576,38 +1585,6 @@ namespace Aki.Launcher.Helpers
}
#endregion
- #region server_mods
- private string _server_mods;
- public string server_mods
- {
- get => _server_mods;
- set
- {
- if (_server_mods != value)
- {
- _server_mods = value;
- RaisePropertyChanged(nameof(server_mods));
- }
- }
- }
- #endregion
-
- #region profile_mods
- private string _profile_mods;
- public string profile_mods
- {
- get => _profile_mods;
- set
- {
- if (_profile_mods != value)
- {
- _profile_mods = value;
- RaisePropertyChanged(nameof(profile_mods));
- }
- }
- }
- #endregion
-
#region author
private string _author;
public string author
@@ -1672,6 +1649,111 @@ namespace Aki.Launcher.Helpers
}
}
#endregion
+
+ #region active_server_mods
+ private string _active_server_mods;
+ public string active_server_mods
+ {
+ get => _active_server_mods;
+ set
+ {
+ if (_active_server_mods != value)
+ {
+ _active_server_mods = value;
+ RaisePropertyChanged(nameof(active_server_mods));
+ }
+ }
+ }
+ #endregion
+
+ #region active_server_mods_info_text
+
+ private string _active_server_mods_info_text;
+
+ public string active_server_mods_info_text
+ {
+ get => _active_server_mods_info_text;
+ set
+ {
+ if (_active_server_mods_info_text != value)
+ {
+ _active_server_mods_info_text = value;
+ RaisePropertyChanged(nameof(active_server_mods_info_text));
+ }
+ }
+ }
+ #endregion
+
+ #region inactive_server_mods
+ private string _inactive_server_mods;
+ public string inactive_server_mods
+ {
+ get => _inactive_server_mods;
+ set
+ {
+ if (_inactive_server_mods != value)
+ {
+ _inactive_server_mods = value;
+ RaisePropertyChanged(nameof(inactive_server_mods));
+ }
+ }
+ }
+ #endregion
+
+ #region inactive_server_mods_info_text
+
+ private string _inactive_server_mods_info_text;
+
+ public string inactive_server_mods_info_text
+ {
+ get => _inactive_server_mods_info_text;
+ set
+ {
+ if (_inactive_server_mods_info_text != value)
+ {
+ _inactive_server_mods_info_text = value;
+ RaisePropertyChanged(nameof(inactive_server_mods_info_text));
+ }
+ }
+ }
+ #endregion
+
+ #region open_link_question_format_1
+
+ private string _open_link_question_format_1;
+
+ public string open_link_question_format_1
+ {
+ get => _open_link_question_format_1;
+ set
+ {
+ if (_open_link_question_format_1 != value)
+ {
+ _open_link_question_format_1 = value;
+ RaisePropertyChanged(nameof(open_link_question_format_1));
+ }
+ }
+ }
+ #endregion
+
+ #region open_link
+
+ private string _open_link;
+
+ public string open_link
+ {
+ get => _open_link;
+ set
+ {
+ if (_open_link != value)
+ {
+ _open_link = value;
+ RaisePropertyChanged(nameof(open_link));
+ }
+ }
+ }
+ #endregion
+
#endregion
public event PropertyChangedEventHandler PropertyChanged;
diff --git a/project/Aki.Launcher.Base/Models/Aki/AkiMod.cs b/project/Aki.Launcher.Base/Models/Aki/AkiMod.cs
index 7bd2dc8..4f0b81d 100644
--- a/project/Aki.Launcher.Base/Models/Aki/AkiMod.cs
+++ b/project/Aki.Launcher.Base/Models/Aki/AkiMod.cs
@@ -7,5 +7,6 @@
public string Author { get; set; }
public string Name { get; set; }
public string Version { get; set; }
+ public string Url { get; set; }
}
}
diff --git a/project/Aki.Launcher.Base/Models/Aki/AkiVersion.cs b/project/Aki.Launcher.Base/Models/Aki/AkiVersion.cs
index b4c2d1e..68ba98e 100644
--- a/project/Aki.Launcher.Base/Models/Aki/AkiVersion.cs
+++ b/project/Aki.Launcher.Base/Models/Aki/AkiVersion.cs
@@ -59,5 +59,10 @@ namespace Aki.Launcher.Models.Aki
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
+
+ public override string ToString()
+ {
+ return HasTag ? $"{Major}.{Minor}.{Build}-{Tag}" : $"{Major}.{Minor}.{Build}";
+ }
}
}
diff --git a/project/Aki.Launcher.Base/Models/Launcher/ModInfoCollection.cs b/project/Aki.Launcher.Base/Models/Launcher/ModInfoCollection.cs
index 7a80a7f..aa6b4c3 100644
--- a/project/Aki.Launcher.Base/Models/Launcher/ModInfoCollection.cs
+++ b/project/Aki.Launcher.Base/Models/Launcher/ModInfoCollection.cs
@@ -20,7 +20,7 @@ namespace Aki.Launcher.Models.Launcher
}
}
}
-
+
private int _profileModsCount;
public int ProfileModsCount
{
@@ -35,20 +35,6 @@ namespace Aki.Launcher.Models.Launcher
}
}
- private bool _hasProfileOnlyMods;
- public bool HasProfileOnlyMods
- {
- get => _hasProfileOnlyMods;
- set
- {
- if (_hasProfileOnlyMods != value)
- {
- _hasProfileOnlyMods = value;
- RaisePropertyChanged(nameof(HasProfileOnlyMods));
- }
- }
- }
-
private bool _hasMods;
public bool HasMods
{
@@ -63,7 +49,8 @@ namespace Aki.Launcher.Models.Launcher
}
}
- public ObservableCollection Mods { get; private set; } = new ObservableCollection();
+ public ObservableCollection ActiveMods { get; private set; } = new ObservableCollection();
+ public ObservableCollection InactiveMods { get; private set; } = new ObservableCollection();
public ModInfoCollection()
{
@@ -73,15 +60,15 @@ namespace Aki.Launcher.Models.Launcher
ServerModsCount = serverMods?.Count() ?? 0;
ProfileModsCount = profileMods?.Count() ?? 0;
- foreach (var serverMod in serverMods)
+ foreach (var activeMod in serverMods)
{
- serverMod.InServer = true;
- Mods.Add(serverMod);
+ activeMod.InServer = true;
+ ActiveMods.Add(activeMod);
}
- foreach (var profileMod in profileMods)
+ foreach (var inactiveMod in profileMods)
{
- var existingMod = Mods.Where(x => x.Name == profileMod.Name && x.Version == profileMod.Version && x.Author == profileMod.Author).FirstOrDefault();
+ var existingMod = ActiveMods.Where(x => x.Name == inactiveMod.Name && x.Version == inactiveMod.Version && x.Author == inactiveMod.Author).FirstOrDefault();
if (existingMod != null)
{
@@ -89,12 +76,11 @@ namespace Aki.Launcher.Models.Launcher
continue;
}
- profileMod.InProfile = true;
- Mods.Add(profileMod);
+ inactiveMod.InProfile = true;
+ InactiveMods.Add(inactiveMod);
}
- HasMods = Mods.Count() > 0;
- HasProfileOnlyMods = Mods.Where(x => x.InProfile && !x.InServer).Count() > 0;
+ HasMods = ActiveMods.Count > 0 || InactiveMods.Count > 0;
}
public event PropertyChangedEventHandler PropertyChanged;
diff --git a/project/Aki.Launcher/Aki.Launcher.csproj b/project/Aki.Launcher/Aki.Launcher.csproj
index 29ff631..357388d 100644
--- a/project/Aki.Launcher/Aki.Launcher.csproj
+++ b/project/Aki.Launcher/Aki.Launcher.csproj
@@ -1,8 +1,8 @@
WinExe
- net6.0
- win10-x64
+ net8.0
+ win-x64trueenableAssets\icon.ico
diff --git a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Chinese (Simplified).json b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Chinese (Simplified).json
index 9ddeb28..99f6f19 100644
--- a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Chinese (Simplified).json
+++ b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Chinese (Simplified).json
@@ -81,13 +81,17 @@
"i_understand": "我了解",
"game_version_mismatch_format_2": "SPT无法运行,这是由于SPT需要EFT版本 '{1}',\n但现有版本是 '{0}'\n\n确保你已经按照你下载SPT的页面上的\n安装指导的描述降级你的EFT",
"description": "描述",
- "server_mods": "Server Mods",
- "profile_mods": "Profile Mods",
"author": "Author",
"load_live_settings": "Load Live Settings",
"load_live_settings_succeeded": "Game settings copied from live",
"load_live_settings_failed": "Failed to copy live settings",
"wipe_on_start": "Wipe profile on game start",
"copy_live_settings_question": "Would you like to copy your live game settings to spt",
- "mod_not_in_server_warning":"This mod was found in your profile, but is not loaded on the server"
+ "mod_not_in_server_warning":"This mod was found in your profile, but is not loaded on the server",
+ "active_server_mods": "Active Server Mods",
+ "active_server_mods_info_text": "These mods are currently running on the server",
+ "inactive_server_mods": "Inactive Server Mods",
+ "inactive_server_mods_info_text": "These mods have not been loaded by the server, but your profile has used them in the past",
+ "open_link_question_format_1": "Are you sure you want to open the following link: \n{0}",
+ "open_link": "Open Link"
}
diff --git a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Chinese (Traditional).json b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Chinese (Traditional).json
index 59cad68..ecafdf6 100644
--- a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Chinese (Traditional).json
+++ b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Chinese (Traditional).json
@@ -81,13 +81,17 @@
"i_understand": "I Understand",
"game_version_mismatch_format_2": "SPT is unable to run, this is because SPT expected to find EFT version '{1}',\nbut instead found version '{0}'\n\nEnsure you've downgraded your EFT as described in the install guide\non the page you downloaded SPT from",
"description": "Description",
- "server_mods": "Server Mods",
- "profile_mods": "Profile Mods",
"author": "Author",
"load_live_settings": "Load Live Settings",
"load_live_settings_succeeded": "Game settings copied from live",
"load_live_settings_failed": "Failed to copy live settings",
"wipe_on_start": "Wipe profile on game start",
"copy_live_settings_question": "Would you like to copy your live game settings to spt",
- "mod_not_in_server_warning":"This mod was found in your profile, but is not loaded on the server"
+ "mod_not_in_server_warning":"This mod was found in your profile, but is not loaded on the server",
+ "active_server_mods": "Active Server Mods",
+ "active_server_mods_info_text": "These mods are currently running on the server",
+ "inactive_server_mods": "Inactive Server Mods",
+ "inactive_server_mods_info_text": "These mods have not been loaded by the server, but your profile has used them in the past",
+ "open_link_question_format_1": "Are you sure you want to open the following link: \n{0}",
+ "open_link": "Open Link"
}
\ No newline at end of file
diff --git a/project/Aki.Launcher/Aki_Data/Launcher/Locales/English.json b/project/Aki.Launcher/Aki_Data/Launcher/Locales/English.json
index f84bd3f..64b4ab0 100644
--- a/project/Aki.Launcher/Aki_Data/Launcher/Locales/English.json
+++ b/project/Aki.Launcher/Aki_Data/Launcher/Locales/English.json
@@ -81,13 +81,17 @@
"i_understand": "I Understand",
"game_version_mismatch_format_2": "SPT is unable to run, this is because SPT expected to find EFT version '{1}',\nbut instead found version '{0}'\n\nEnsure you've downgraded your EFT as described in the install guide\non the page you downloaded SPT from",
"description": "Description",
- "server_mods": "Server Mods",
- "profile_mods": "Profile Mods",
"author": "Author",
"load_live_settings": "Load Live Settings",
"load_live_settings_succeeded": "Game settings copied from live",
"load_live_settings_failed": "Failed to copy live settings",
"wipe_on_start": "Wipe profile on game start",
"copy_live_settings_question": "Would you like to copy your live game settings to spt",
- "mod_not_in_server_warning":"This mod was found in your profile, but is not loaded on the server"
+ "mod_not_in_server_warning":"This mod was found in your profile, but is not loaded on the server",
+ "active_server_mods": "Active Server Mods",
+ "active_server_mods_info_text": "These mods are currently running on the server",
+ "inactive_server_mods": "Inactive Server Mods",
+ "inactive_server_mods_info_text": "These mods have not been loaded by the server, but your profile has used them in the past",
+ "open_link_question_format_1": "Are you sure you want to open the following link: \n{0}",
+ "open_link": "Open Link"
}
\ No newline at end of file
diff --git a/project/Aki.Launcher/Aki_Data/Launcher/Locales/French.json b/project/Aki.Launcher/Aki_Data/Launcher/Locales/French.json
index acda7fb..a1c4d11 100644
--- a/project/Aki.Launcher/Aki_Data/Launcher/Locales/French.json
+++ b/project/Aki.Launcher/Aki_Data/Launcher/Locales/French.json
@@ -81,13 +81,17 @@
"i_understand": "I Understand",
"game_version_mismatch_format_2": "SPT is unable to run, this is because SPT expected to find EFT version '{1}',\nbut instead found version '{0}'\n\nEnsure you've downgraded your EFT as described in the install guide\non the page you downloaded SPT from",
"description": "Description",
- "server_mods": "Server Mods",
- "profile_mods": "Profile Mods",
"author": "Author",
"load_live_settings": "Load Live Settings",
"load_live_settings_succeeded": "Game settings copied from live",
"load_live_settings_failed": "Failed to copy live settings",
"wipe_on_start": "Wipe profile on game start",
"copy_live_settings_question": "Would you like to copy your live game settings to spt",
- "mod_not_in_server_warning":"This mod was found in your profile, but is not loaded on the server"
+ "mod_not_in_server_warning":"This mod was found in your profile, but is not loaded on the server",
+ "active_server_mods": "Active Server Mods",
+ "active_server_mods_info_text": "These mods are currently running on the server",
+ "inactive_server_mods": "Inactive Server Mods",
+ "inactive_server_mods_info_text": "These mods have not been loaded by the server, but your profile has used them in the past",
+ "open_link_question_format_1": "Are you sure you want to open the following link: \n{0}",
+ "open_link": "Open Link"
}
\ No newline at end of file
diff --git a/project/Aki.Launcher/Aki_Data/Launcher/Locales/German.json b/project/Aki.Launcher/Aki_Data/Launcher/Locales/German.json
index 26108c2..b87e533 100644
--- a/project/Aki.Launcher/Aki_Data/Launcher/Locales/German.json
+++ b/project/Aki.Launcher/Aki_Data/Launcher/Locales/German.json
@@ -81,13 +81,17 @@
"i_understand": "I Understand",
"game_version_mismatch_format_2": "SPT is unable to run, this is because SPT expected to find EFT version '{1}',\nbut instead found version '{0}'\n\nEnsure you've downgraded your EFT as described in the install guide\non the page you downloaded SPT from",
"description": "Description",
- "server_mods": "Server Mods",
- "profile_mods": "Profile Mods",
"author": "Author",
"load_live_settings": "Load Live Settings",
"load_live_settings_succeeded": "Game settings copied from live",
"load_live_settings_failed": "Failed to copy live settings",
"wipe_on_start": "Wipe profile on game start",
"copy_live_settings_question": "Would you like to copy your live game settings to spt",
- "mod_not_in_server_warning":"This mod was found in your profile, but is not loaded on the server"
+ "mod_not_in_server_warning":"This mod was found in your profile, but is not loaded on the server",
+ "active_server_mods": "Active Server Mods",
+ "active_server_mods_info_text": "These mods are currently running on the server",
+ "inactive_server_mods": "Inactive Server Mods",
+ "inactive_server_mods_info_text": "These mods have not been loaded by the server, but your profile has used them in the past",
+ "open_link_question_format_1": "Are you sure you want to open the following link: \n{0}",
+ "open_link": "Open Link"
}
\ No newline at end of file
diff --git a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Italian.json b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Italian.json
index 6b838c9..cee5e8c 100644
--- a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Italian.json
+++ b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Italian.json
@@ -81,13 +81,17 @@
"i_understand": "Accetto",
"game_version_mismatch_format_2": "SPT non riesce ad avviarsi, questo è perché SPT si aspettava la versione di EFT '{1}',\nmentre invece tu hai la versione '{0}'\n\nAssicurati di aver downgradato correttamente EFT come descritto nella guida all'installazione\nche hai trovato sulla pagina web da cui hai scaricato SPT",
"description": "Descrizione",
- "server_mods": "Server Mods",
- "profile_mods": "Profile Mods",
"author": "Author",
"load_live_settings": "Load Live Settings",
"load_live_settings_succeeded": "Game settings copied from live",
"load_live_settings_failed": "Failed to copy live settings",
"wipe_on_start": "Wipe profile on game start",
"copy_live_settings_question": "Would you like to copy your live game settings to spt",
- "mod_not_in_server_warning":"This mod was found in your profile, but is not loaded on the server"
+ "mod_not_in_server_warning":"This mod was found in your profile, but is not loaded on the server",
+ "active_server_mods": "Active Server Mods",
+ "active_server_mods_info_text": "These mods are currently running on the server",
+ "inactive_server_mods": "Inactive Server Mods",
+ "inactive_server_mods_info_text": "These mods have not been loaded by the server, but your profile has used them in the past",
+ "open_link_question_format_1": "Are you sure you want to open the following link: \n{0}",
+ "open_link": "Open Link"
}
\ No newline at end of file
diff --git a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Japanese.json b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Japanese.json
index 4cd3b99..56a3321 100644
--- a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Japanese.json
+++ b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Japanese.json
@@ -81,13 +81,17 @@
"i_understand": "了解",
"game_version_mismatch_format_2": "SPT を実行できません。これは、SPT が EFT バージョン '{1}' を検出することを期待していたためです\n代わりにバージョン '{0}' を検出しました\n\nインストール ガイドの説明に従って EFT をダウングレードしたことを確認してください\n SPT をダウンロードしたページ",
"description": "Description",
- "server_mods": "Server Mods",
- "profile_mods": "Profile Mods",
"author": "Author",
"load_live_settings": "Load Live Settings",
"load_live_settings_succeeded": "Game settings copied from live",
"load_live_settings_failed": "Failed to copy live settings",
"wipe_on_start": "Wipe profile on game start",
"copy_live_settings_question": "Would you like to copy your live game settings to spt",
- "mod_not_in_server_warning":"This mod was found in your profile, but is not loaded on the server"
+ "mod_not_in_server_warning":"This mod was found in your profile, but is not loaded on the server",
+ "active_server_mods": "Active Server Mods",
+ "active_server_mods_info_text": "These mods are currently running on the server",
+ "inactive_server_mods": "Inactive Server Mods",
+ "inactive_server_mods_info_text": "These mods have not been loaded by the server, but your profile has used them in the past",
+ "open_link_question_format_1": "Are you sure you want to open the following link: \n{0}",
+ "open_link": "Open Link"
}
\ No newline at end of file
diff --git a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Korean.json b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Korean.json
index f7af75b..01a7e48 100644
--- a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Korean.json
+++ b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Korean.json
@@ -81,13 +81,17 @@
"i_understand": "이해하였습니다",
"game_version_mismatch_format_2": "당신의 게임 버전은 '{0}'이며 호환되는 버전은 '{1}' 입니다.\n\n게임 실행에 문제가 발생하거나 되지 않을 수 있습니다.",
"description": "설명",
- "server_mods": "서버 모드",
- "profile_mods": "프로필 모드",
"author": "개발자",
"load_live_settings": "공식(Live) 서버의 설정 불러오기",
"load_live_settings_succeeded": "공식(Live) 서버 설정을 불러왔습니다",
"load_live_settings_failed": "공식(Live) 서버 설정 불러오기에 실패하였습니다",
"wipe_on_start": "게임 시작 시 프로필 초기화",
"copy_live_settings_question": "공식(Live) 서버에서 사용하던 설정 파일을 SPT에 복사하시겠습니까?",
- "mod_not_in_server_warning":"SPT 서버에 없는 모드가 플레이어 프로필에서 발견되었습니다"
+ "mod_not_in_server_warning":"SPT 서버에 없는 모드가 플레이어 프로필에서 발견되었습니다",
+ "active_server_mods": "Active Server Mods",
+ "active_server_mods_info_text": "These mods are currently running on the server",
+ "inactive_server_mods": "Inactive Server Mods",
+ "inactive_server_mods_info_text": "These mods have not been loaded by the server, but your profile has used them in the past",
+ "open_link_question_format_1": "Are you sure you want to open the following link: \n{0}",
+ "open_link": "Open Link"
}
\ No newline at end of file
diff --git a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Polish.json b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Polish.json
index 9c2d2dc..3542d09 100644
--- a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Polish.json
+++ b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Polish.json
@@ -81,13 +81,17 @@
"i_understand": "Rozumiem",
"game_version_mismatch_format_2": "SPT nie może zostać uruchomiony, ponieważ SPT oczekiwał wersji EFT '{1}',\nale zamiast tego znalazł wersję '{0}'\n\nUpewnij się, że zainstalowałeś starszą wersję EFT, zgodnie z instrukcją instalacji\nna stronie, z której pobrałeś SPT",
"description": "Opis",
- "server_mods": "Mody serwera",
- "profile_mods": "Mody profilu",
"author": "Autor",
"load_live_settings": "Wczytaj ustawienia EFT",
"load_live_settings_succeeded": "Ustawienia gry skopiowane z EFT",
"load_live_settings_failed": "Nie udało się skopiować ustawień EFT",
"wipe_on_start": "Wipe profile on game start",
"copy_live_settings_question": "Would you like to copy your live game settings to spt",
- "mod_not_in_server_warning":"This mod was found in your profile, but is not loaded on the server"
+ "mod_not_in_server_warning":"This mod was found in your profile, but is not loaded on the server",
+ "active_server_mods": "Active Server Mods",
+ "active_server_mods_info_text": "These mods are currently running on the server",
+ "inactive_server_mods": "Inactive Server Mods",
+ "inactive_server_mods_info_text": "These mods have not been loaded by the server, but your profile has used them in the past",
+ "open_link_question_format_1": "Are you sure you want to open the following link: \n{0}",
+ "open_link": "Open Link"
}
\ No newline at end of file
diff --git a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Russian.json b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Russian.json
index 5bd6d44..158bb8c 100644
--- a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Russian.json
+++ b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Russian.json
@@ -81,13 +81,17 @@
"i_understand": "Я понимаю",
"game_version_mismatch_format_2": "Ваша версия игры: '{0}' и совместимая версия: '{1}'.\n\nИгра может работать некорректно или не работать вообще.",
"description": "Описание",
- "server_mods": "Серверные моды",
- "profile_mods": "Моды профиля",
"author": "Автор",
"load_live_settings": "Загрузить настройкий онлайн-версии",
"load_live_settings_succeeded": "Настройки игры скопированы из онлайн-версии",
"load_live_settings_failed": "Не удалось скопировать настройки онлайн-версии",
- "wipe_on_start": "Wipe profile on game start",
- "copy_live_settings_question": "Would you like to copy your live game settings to spt",
- "mod_not_in_server_warning":"This mod was found in your profile, but is not loaded on the server"
+ "wipe_on_start": "Очистить профиль при старте игры",
+ "copy_live_settings_question": "Хотите скопировать настройки онлайн-версии в spt?",
+ "mod_not_in_server_warning":"Этот мод был найден в вашем профиле, но не загружен на сервер",
+ "active_server_mods": "Активные серверные моды",
+ "active_server_mods_info_text": "На данный момент эти моды работают на сервере",
+ "inactive_server_mods": "Неактивные серверные моды",
+ "inactive_server_mods_info_text": "Эти моды не были загружены сервером, но ваш профиль использовал их раньше",
+ "open_link_question_format_1": "Вы уверены, что хотите открыть следующую ссылку? \n{0}",
+ "open_link": "Открыть ссылку"
}
\ No newline at end of file
diff --git a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Spanish.json b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Spanish.json
index 1423db8..b5fd961 100644
--- a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Spanish.json
+++ b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Spanish.json
@@ -81,13 +81,17 @@
"i_understand": "Lo entiendo",
"game_version_mismatch_format_2": "SPT no puede iniciar, esto es debido a que la versión de EFT esperada es '{1}',\npero la versión encontrada es '{0}'\n\nAsegurate de haber realizado el downgrade de tu versión de EFT, tal como se indica en la guía de instalación\nen la página en la que has descargado SPT",
"description": "Descripción",
- "server_mods": "Server Mods",
- "profile_mods": "Profile Mods",
"author": "Author",
"load_live_settings": "Load Live Settings",
"load_live_settings_succeeded": "Game settings copied from live",
"load_live_settings_failed": "Failed to copy live settings",
"wipe_on_start": "Wipe profile on game start",
"copy_live_settings_question": "Would you like to copy your live game settings to spt",
- "mod_not_in_server_warning":"This mod was found in your profile, but is not loaded on the server"
+ "mod_not_in_server_warning":"This mod was found in your profile, but is not loaded on the server",
+ "active_server_mods": "Active Server Mods",
+ "active_server_mods_info_text": "These mods are currently running on the server",
+ "inactive_server_mods": "Inactive Server Mods",
+ "inactive_server_mods_info_text": "These mods have not been loaded by the server, but your profile has used them in the past",
+ "open_link_question_format_1": "Are you sure you want to open the following link: \n{0}",
+ "open_link": "Open Link"
}
\ No newline at end of file
diff --git a/project/Aki.Launcher/Aki_Data/Launcher/Locales/Turkish.json b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Turkish.json
new file mode 100644
index 0000000..938095b
--- /dev/null
+++ b/project/Aki.Launcher/Aki_Data/Launcher/Locales/Turkish.json
@@ -0,0 +1,97 @@
+{
+ "ietf_tag": "tr",
+ "native_name": "Turkish",
+ "retry": "Yeniden Dene",
+ "server_connecting": "Bağlanıyor",
+ "server_unavailable_format_1": "Varsayılan sunucu '{0}' mevcut değil.",
+ "no_servers_available": "Sunucu bulunamadı. Ayarlardaki sunucu listesini kontrol edin.",
+ "settings_menu": "Ayarlar",
+ "back": "Geri dön",
+ "wipe_profile": "Profili Wipela",
+ "username": "Kullanıcı Adı",
+ "password": "Şifre",
+ "update": "Güncelleme",
+ "edit_account_update_error": "Profilinizi güncellerken bir sorun oluştu.",
+ "register": "Kayıt Ol",
+ "go_to_register": "Kayıt Ol'a git",
+ "login_or_register": "Giriş Yap / Kaydol",
+ "go_to_login": "Giriş Yap'a git",
+ "login_automatically": "Otomatik Oturum Açma",
+ "incorrect_login": "Kullanıcı adı veya şifre yanlış.",
+ "login_failed": "Oturum Açma Başarısız",
+ "edition": "Sürüm",
+ "id": "ID",
+ "logout": "Oturumu Kapat",
+ "account": "Profil",
+ "edit_account": "Profil Düzenle",
+ "start_game": "Oyunu Başlat",
+ "installed_in_live_game_warning": "Aki canlı oyun dizinine yüklenmemelidir. Lütfen Aki'yi bilgisayarınızın başka bir yerindeki oyun dizininin bir kopyasına yükleyin.",
+ "no_official_game_warning": "Escape From Tarkov oyunu bilgisayarınızda yüklü değil. Lütfen oyunun bir kopyasını satın alın ve geliştiricileri destekleyin!",
+ "eft_exe_not_found_warning": "EscapeFromTarkov.exe oyun yolunda bulunamadı. Lütfen dizinin doğru olup olmadığını kontrol edin.",
+ "account_exist": "Profil zaten mevcut",
+ "url": "URL",
+ "default_language": "Varsayılan Dil",
+ "game_path": "SPT Oyun Klasörü",
+ "clear_game_settings": "Oyun Ayarlarını Temizle",
+ "clear_game_settings_succeeded": "Oyun ayarları temizlendi.",
+ "clear_game_settings_failed": "Oyun ayarları temizlenirken bir sorun oluştu.",
+ "remove_registry_keys": "Kayıt Defteri Anahtarlarını Kaldır",
+ "remove_registry_keys_succeeded": "Kayıt defteri anahtarları kaldırıldı.",
+ "remove_registry_keys_failed": "Kayıt defteri anahtarları kaldırılırken bir sorun oluştu.",
+ "clean_temp_files": "Temp Dosyalarını Temizleme",
+ "clean_temp_files_succeeded": "Temp dosyaları temizlendi.",
+ "clean_temp_files_failed": "Temp dosyalar temizlenirken bir sorun oluştu.",
+ "select_folder": "Klasör Seçin",
+ "registration_failed": "Kayıt başarısız oldu.",
+ "minimize_action": "Küçült",
+ "do_nothing_action": "Hiçbir şey yapma",
+ "exit_action": "Başlatıcıyı Kapat",
+ "on_game_start": "Oyun Başlayınca başlatıcıya ne yapılsın",
+ "game": "Oyun",
+ "new_password": "Yeni Parola",
+ "cancel": "İptal",
+ "need_an_account": "Henüz bir profiliniz yok mu?",
+ "have_an_account": "Zaten bir profiliniz var mı?",
+ "reapply_patch": "Yamayı Yeniden Uygula",
+ "failed_to_receive_patches": "Yamalar alınamadı",
+ "failed_core_patch": "Core yaması başarısız",
+ "failed_mod_patch": "Mod yaması başarısız oldu",
+ "ok": "TAMAM.",
+ "account_page_denied": "Profil sayfası reddedildi. Ya giriş yapmadınız ya da oyun çalışıyor.",
+ "account_updated": "Profiliniz güncellendi",
+ "nickname": "Kullanıcı adı",
+ "side": "Taraf",
+ "level": "Level",
+ "patching": "Yama",
+ "file_mismatch_dialog_message": "Girdi dosyası hash'i beklenen hash ile eşleşmiyor. İstemci dosyalarınız için AKI'nin yanlış sürümünü kullanıyor olabilirsiniz.\n\nDevam etmek istiyor musunuz?",
+ "yes": "Evet",
+ "no": "Hayır",
+ "open_folder": "Klasörü Aç",
+ "select_edition": "Versiyon Seçin",
+ "profile_created": "Profil Oluşturuldu",
+ "registration_question_format_1": "Profil '{0}' mevcut değil.\n\nBunu oluşturmak ister misiniz?",
+ "next_level_in": "Bir sonraki seviye",
+ "wipe_warning": "Hesap sürümünüzü değiştirmek için profil silmeniz gerekir. Bu, oyun ilerlemenizi sıfırlayacaktır.",
+ "copied": "Kopyalandı",
+ "no_profile_data": "Profil verisi yok",
+ "profile_version_mismath": "Profiliniz farklı bir aki sürümü kullanılarak oluşturulmuştur ve sorunları olabilir",
+ "profile_removed": "Profil kaldırıldı",
+ "profile_removal_failed": "Profil kaldırılamadı",
+ "profile_remove_question_format_1": "'{0}' profilini kalıcı olarak kaldıralım mı?",
+ "i_understand": "Anlıyorum.",
+ "game_version_mismatch_format_2": "SPT çalıştırılamıyor, bunun nedeni SPT'nin '{1}' EFT sürümünü bulmayı beklemesi, ancak bunun yerine '{0}' sürümünü bulmasıdır\n\nEFT'nizi SPT'yi indirdiğiniz sayfada değil\nkurulum kılavuzunda açıklandığı şekilde düşürdüğünüzden emin olun",
+ "description": "Açıklama",
+ "author": "Yazar",
+ "load_live_settings": "Canlı Ayarları Yükle",
+ "load_live_settings_succeeded": "Oyun ayarları canlıdan kopyalandı",
+ "load_live_settings_failed": "Canlı ayarlar kopyalanamadı",
+ "wipe_on_start": "Oyun başladığında profili wipela",
+ "copy_live_settings_question": "Canlı oyun ayarlarınızı spt'ye kopyalamak ister misiniz",
+ "mod_not_in_server_warning":"Bu mod profilinizde bulundu, ancak sunucuda yüklü değil",
+ "active_server_mods": "Aktif Sunucu Modları",
+ "active_server_mods_info_text": "Bu modlar şu anda sunucuda çalışmaktadır",
+ "inactive_server_mods": "Aktif Olmayan Sunucu Modları",
+ "inactive_server_mods_info_text": "Bu modlar sunucu tarafından yüklenmedi, ancak profiliniz geçmişte bunları kullandı",
+ "open_link_question_format_1": "Aşağıdaki bağlantıyı açmak istediğinizden emin misiniz? \n{0}",
+ "open_link": "Bağlantıyı Aç"
+}
\ No newline at end of file
diff --git a/project/Aki.Launcher/Aki_Data/Launcher/Patches/aki-core/EscapeFromTarkov_Data/Managed/Assembly-CSharp.dll.bpf b/project/Aki.Launcher/Aki_Data/Launcher/Patches/aki-core/EscapeFromTarkov_Data/Managed/Assembly-CSharp.dll.bpf
index 9c8fb94..f640201 100644
Binary files a/project/Aki.Launcher/Aki_Data/Launcher/Patches/aki-core/EscapeFromTarkov_Data/Managed/Assembly-CSharp.dll.bpf and b/project/Aki.Launcher/Aki_Data/Launcher/Patches/aki-core/EscapeFromTarkov_Data/Managed/Assembly-CSharp.dll.bpf differ
diff --git a/project/Aki.Launcher/App.axaml b/project/Aki.Launcher/App.axaml
index ec353f3..4ecaa8a 100644
--- a/project/Aki.Launcher/App.axaml
+++ b/project/Aki.Launcher/App.axaml
@@ -31,34 +31,37 @@
-
+
-
-
-
-
-
-
-
+
+
-
-
+
+
+
diff --git a/project/Aki.Launcher/CustomControls/ModInfoCard.axaml b/project/Aki.Launcher/CustomControls/ModInfoCard.axaml
index 8982a1d..c1321f1 100644
--- a/project/Aki.Launcher/CustomControls/ModInfoCard.axaml
+++ b/project/Aki.Launcher/CustomControls/ModInfoCard.axaml
@@ -13,21 +13,26 @@
Background="{StaticResource AKI_Background_Dark}"
>
+
+ VerticalAlignment="Center"
+ Orientation="Horizontal" Spacing="5"
+ >
+
+ IsVisible="{Binding IsInServer, RelativeSource={RelativeSource AncestorType=UserControl}}"
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/project/Aki.Launcher/CustomControls/ModInfoCard.axaml.cs b/project/Aki.Launcher/CustomControls/ModInfoCard.axaml.cs
index 175ec14..1395ccc 100644
--- a/project/Aki.Launcher/CustomControls/ModInfoCard.axaml.cs
+++ b/project/Aki.Launcher/CustomControls/ModInfoCard.axaml.cs
@@ -1,3 +1,5 @@
+using System.Diagnostics;
+using System.Windows.Input;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
@@ -55,5 +57,21 @@ namespace Aki.Launcher.CustomControls
}
public static readonly StyledProperty IsInProfileProperty =
AvaloniaProperty.Register(nameof(IsInProfile));
+
+ public string ModUrl
+ {
+ get => GetValue(ModUrlProperty);
+ set => SetValue(ModUrlProperty, value);
+ }
+ public static readonly StyledProperty ModUrlProperty =
+ AvaloniaProperty.Register(nameof(ModUrl));
+
+ public ICommand OpenUrlCommand
+ {
+ get => GetValue(OpenUrlCommandProperty);
+ set => SetValue(OpenUrlCommandProperty, value);
+ }
+ public static readonly StyledProperty OpenUrlCommandProperty =
+ AvaloniaProperty.Register(nameof(OpenUrlCommand));
}
}
diff --git a/project/Aki.Launcher/ViewModels/ConnectServerViewModel.cs b/project/Aki.Launcher/ViewModels/ConnectServerViewModel.cs
index 017ed5c..ca5d1a6 100644
--- a/project/Aki.Launcher/ViewModels/ConnectServerViewModel.cs
+++ b/project/Aki.Launcher/ViewModels/ConnectServerViewModel.cs
@@ -5,6 +5,7 @@ using ReactiveUI;
using Splat;
using System.Reactive.Disposables;
using System.Threading.Tasks;
+using Aki.Launcher.Controllers;
namespace Aki.Launcher.ViewModels
{
@@ -51,6 +52,8 @@ namespace Aki.Launcher.ViewModels
AkiVersion version = Locator.Current.GetService("akiversion");
version.ParseVersionInfo(ServerManager.GetVersion());
+
+ LogManager.Instance.Info($"Connected to server: {ServerManager.SelectedServer.backendUrl} - Aki Version: {version}");
NavigateTo(new LoginViewModel(HostScreen, noAutoLogin));
}
diff --git a/project/Aki.Launcher/ViewModels/ModInfoViewModel.cs b/project/Aki.Launcher/ViewModels/ModInfoViewModel.cs
new file mode 100644
index 0000000..206cbbd
--- /dev/null
+++ b/project/Aki.Launcher/ViewModels/ModInfoViewModel.cs
@@ -0,0 +1,45 @@
+using System;
+using System.Diagnostics;
+using System.Threading.Tasks;
+using Aki.Launcher.Controllers;
+using Aki.Launcher.Helpers;
+using Aki.Launcher.Models.Launcher;
+using Aki.Launcher.ViewModels.Dialogs;
+using ReactiveUI;
+
+namespace Aki.Launcher.ViewModels;
+
+public class ModInfoViewModel : ViewModelBase
+{
+ public ModInfoCollection ModsCollection { get; set; }
+ public ModInfoViewModel(IScreen Host, ModInfoCollection mods) : base(Host)
+ {
+ ModsCollection = mods;
+ }
+
+ public async Task OpenUrlCommand(string url)
+ {
+ if (!url.StartsWith("https://") && !url.StartsWith("https://"))
+ {
+ LogManager.Instance.Warning($"url does not start with http/s \n -URL-> '{url}'");
+ return;
+ }
+
+ var question = String.Format(LocalizationProvider.Instance.open_link_question_format_1, url);
+ var confirmText = LocalizationProvider.Instance.open_link;
+ var cancelText = LocalizationProvider.Instance.cancel;
+
+ var confirm = await ShowDialog(new ConfirmationDialogViewModel(HostScreen, question, confirmText, cancelText));
+
+ if (confirm is not (bool and true))
+ return;
+
+ Process.Start(new ProcessStartInfo
+ {
+ FileName = "cmd.exe",
+ UseShellExecute = true,
+ WindowStyle = ProcessWindowStyle.Hidden,
+ ArgumentList = { "/C", "start", url }
+ });
+ }
+}
\ No newline at end of file
diff --git a/project/Aki.Launcher/ViewModels/ProfileViewModel.cs b/project/Aki.Launcher/ViewModels/ProfileViewModel.cs
index 03d1cbe..134b8c4 100644
--- a/project/Aki.Launcher/ViewModels/ProfileViewModel.cs
+++ b/project/Aki.Launcher/ViewModels/ProfileViewModel.cs
@@ -26,13 +26,6 @@ namespace Aki.Launcher.ViewModels
set => this.RaiseAndSetIfChanged(ref _CurrentEdition, value);
}
- private bool _ModsListIsVisible;
- public bool ModsListIsVisible
- {
- get => _ModsListIsVisible;
- set => this.RaiseAndSetIfChanged(ref _ModsListIsVisible, value);
- }
-
private bool _WipeProfileOnStart;
public bool WipeProfileOnStart
{
@@ -76,8 +69,6 @@ namespace Aki.Launcher.ViewModels
CurrentEdition = AccountManager.SelectedAccount.edition;
CurrentID = AccountManager.SelectedAccount.id;
-
- ModsListIsVisible = false;
}
private async Task GameVersionCheck()
@@ -104,7 +95,8 @@ namespace Aki.Launcher.ViewModels
}
}
- public void ToggleModsListCommand() => ModsListIsVisible = !ModsListIsVisible;
+ public void OpenModsInfoCommand() =>
+ NavigateTo(new ModInfoViewModel(HostScreen, ModInfoCollection));
public void LogoutCommand()
{
diff --git a/project/Aki.Launcher/Views/ModInfoView.axaml b/project/Aki.Launcher/Views/ModInfoView.axaml
new file mode 100644
index 0000000..f4155aa
--- /dev/null
+++ b/project/Aki.Launcher/Views/ModInfoView.axaml
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/project/Aki.Launcher/Views/ModInfoView.axaml.cs b/project/Aki.Launcher/Views/ModInfoView.axaml.cs
new file mode 100644
index 0000000..be36404
--- /dev/null
+++ b/project/Aki.Launcher/Views/ModInfoView.axaml.cs
@@ -0,0 +1,20 @@
+using Aki.Launcher.ViewModels;
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Markup.Xaml;
+using Avalonia.ReactiveUI;
+
+namespace Aki.Launcher.Views;
+
+public partial class ModInfoView : ReactiveUserControl
+{
+ public ModInfoView()
+ {
+ InitializeComponent();
+ }
+
+ private void InitializeComponent()
+ {
+ AvaloniaXamlLoader.Load(this);
+ }
+}
\ No newline at end of file
diff --git a/project/Aki.Launcher/Views/ProfileView.axaml b/project/Aki.Launcher/Views/ProfileView.axaml
index a37723b..97f3d6e 100644
--- a/project/Aki.Launcher/Views/ProfileView.axaml
+++ b/project/Aki.Launcher/Views/ProfileView.axaml
@@ -4,183 +4,146 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:helpers="using:Aki.Launcher.Helpers"
xmlns:cvt="using:Aki.Launcher.Converters"
- xmlns:cc="using:Aki.Launcher.CustomControls"
- xmlns:launcher="using:Aki.Launcher.Models.Aki"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="Aki.Launcher.Views.ProfileView">
-
-
-
-
-
+
+
+
-
-
-
-
-
+
-
-
-
+
+
+
+
+
-
-
+
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/project/Launcher.code-workspace b/project/Launcher.code-workspace
index a6ead35..a041b0c 100644
--- a/project/Launcher.code-workspace
+++ b/project/Launcher.code-workspace
@@ -18,7 +18,7 @@
{
"label": "build",
"type": "shell",
- "command": "dotnet cake",
+ "command": "dotnet build --configuration Release",
"group": {
"kind": "build",
"isDefault": true
diff --git a/project/Launcher.sln b/project/Launcher.sln
index 930a5d0..e0aca11 100644
--- a/project/Launcher.sln
+++ b/project/Launcher.sln
@@ -13,7 +13,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Aki.Launcher", "Aki.Launche
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
diff --git a/project/build.cake b/project/build.cake
deleted file mode 100644
index 5961304..0000000
--- a/project/build.cake
+++ /dev/null
@@ -1,82 +0,0 @@
-string target = Argument("target", "ExecuteBuild");
-string config = Argument("config", "Release");
-bool VSBuilt = Argument("vsbuilt", false);
-
-// Cake API Reference: https://cakebuild.net/dsl/
-// setup variables
-var buildDir = "./Build";
-var csprojPaths = GetFiles("./**/Aki.*(Launcher).csproj");
-var delPaths = GetDirectories("./**/*(obj|bin)");
-var akiData = "./Aki.Launcher/Aki_Data";
-var licenseFile = "../LICENSE.md";
-var publishRuntime = "win10-x64";
-var launcherDebugFolder = "./Aki.Launcher/bin/Debug/net6.0/win10-x64";
-
-// Clean build directory and remove obj / bin folder from projects
-Task("Clean")
- .WithCriteria(!VSBuilt) //building from VS will lock the files and fail to clean the project directories. Post-Build event on Aki.Build sets this switch to true to avoid this.
- .Does(() =>
- {
- CleanDirectory(buildDir);
- })
- .DoesForEach(delPaths, (directoryPath) =>
- {
- DeleteDirectory(directoryPath, new DeleteDirectorySettings
- {
- Recursive = true,
- Force = true
- });
- });
-
-// Restore, build, and publish selected csproj files
-Task("Publish")
- .IsDependentOn("Clean")
- .DoesForEach(csprojPaths, (csprojFile) =>
- {
- DotNetPublish(csprojFile.FullPath, new DotNetPublishSettings
- {
- NoLogo = true,
- Configuration = config,
- Runtime = publishRuntime,
- PublishSingleFile = true,
- SelfContained = false,
- OutputDirectory = buildDir
- });
- });
-
-// Copy Aki_Data folder and license to build directory
-Task("CopyBuildData")
- .IsDependentOn("Publish")
- .Does(() =>
- {
- CopyDirectory(akiData, $"{buildDir}/Aki_Data");
- CopyFile(licenseFile, $"{buildDir}/LICENSE-Launcher.txt");
- });
-
-// Copy Aki_Data to the launcher's debug directory so you can run the launcher with debugging from VS
-Task("CopyDebugData")
- .WithCriteria(config == "Debug")
- .Does(() =>
- {
- EnsureDirectoryDoesNotExist($"{launcherDebugFolder}/Aki_Data");
-
- CopyDirectory(akiData, $"{launcherDebugFolder}/Aki_Data");
- });
-
-// Remove pdb files from build if running in release configuration
-Task("RemovePDBs")
- .WithCriteria(config == "Release")
- .IsDependentOn("CopyBuildData")
- .Does(() =>
- {
- DeleteFiles($"{buildDir}/*.pdb");
- });
-
-// Runs all build tasks based on dependency and configuration
-Task("ExecuteBuild")
- .IsDependentOn("CopyBuildData")
- .IsDependentOn("RemovePDBs")
- .IsDependentOn("CopyDebugData");
-
-// Runs target task
-RunTarget(target);
\ No newline at end of file
diff --git a/project/build.ps1 b/project/build.ps1
new file mode 100644
index 0000000..b49dfbc
--- /dev/null
+++ b/project/build.ps1
@@ -0,0 +1,22 @@
+$buildFolder = "..\Build"
+$akiDataFolder = "..\Build\Aki_Data"
+$launcherExeFolder = "..\Aki.Launcher\bin\Release\net8.0\win-x64\publish"
+$launcherAssetFolder = "..\Aki.Launcher\Aki_Data"
+$licenseFile = "..\..\LICENSE.md"
+
+# Delete build folder and contents to ensure it's clean
+if (Test-Path "$buildFolder") { Remove-Item -Path "$buildFolder" -Recurse -Force }
+
+# Create build folder and subfolders
+$foldersToCreate = @("$buildFolder", "$akiDataFolder")
+foreach ($folder in $foldersToCreate) {
+ if (-not (Test-Path "$folder")) { New-Item -Path "$folder" -ItemType Directory }
+}
+
+# Move built files to the build folder
+Copy-Item -Path "$launcherExeFolder\Aki.Launcher.exe" -Destination "$buildFolder" -Force
+Copy-Item -Path "$launcherAssetFolder" -Destination "$buildFolder" -Recurse -Force
+# If any new DLLs need to be copied, add here
+
+# Write the contents of the license file to a txt in the build folder
+Get-Content "$licenseFile" | Out-File "$buildFolder\LICENSE-Launcher.txt" -Encoding UTF8