Compare commits
No commits in common. "958eb295fb4d4b437da4e5e0a30b64827c395499" and "973d8872b6dd4651d650835112a47795ea9e0026" have entirely different histories.
958eb295fb
...
973d8872b6
22
README.md
22
README.md
@ -1,20 +1,20 @@
|
|||||||
# SPT-AKI Installer made for EFT.
|
# SPT-AKI Installer made for EFT.
|
||||||
|
|
||||||
<img src="https://i.imgur.com/jtlwLsr.png" alt="spt installer 2.59" width="700"/>
|
![Installer Image](https://media.discordapp.net/attachments/875707258074447904/1107352250705268807/image.png?width=1148&height=671)
|
||||||
|
|
||||||
### Pre install checks:
|
### Pre install checks:
|
||||||
- Checks if .net 4.7.2 (or higher) is installed
|
- Checks if .net 4.7.2 (or higher) is installed
|
||||||
- Checks if .net 8 runtime is installed
|
- Checks if .net 6 desktop runtime is installed
|
||||||
- Checks if EFT is installed
|
- Checks if EFT is installed,
|
||||||
- Checks if there is enough space before install
|
- Checks if there is enough space before install,
|
||||||
- Checks installer is not in a problematic path
|
- Checks installer is not in OG game directory,
|
||||||
- Checks install folder does not have game files already in it
|
- Checks install folder does not have game files already in it,
|
||||||
- Checks if gameversion matches aki version, if so skip patcher process
|
- Checks if gameversion matches aki version, if so skip patcher process,
|
||||||
- Checks both zips are there, other than when the above match, patcher isnt checked for
|
- Checks both zips are there, other than when the above match, patcher isnt checked for
|
||||||
- downloads both Zips from the Repo's if needed
|
- downloads both Zips from the Repo's if needed
|
||||||
|
|
||||||
### Installer Processes:
|
### Installer Processes:
|
||||||
- Copies files from registry logged GamePath to new location
|
- Copies files from registry logged GamePath to new location,
|
||||||
- Extracts, runs and deletes patcher with no user input
|
- Extracts, runs and deletes patcher with no user input,
|
||||||
- Extracts Aki
|
- Extracts Aki,
|
||||||
- Deletes both Patcher and AKI zips at the end
|
- Deletes both Patcher and AKI zips at the end.
|
@ -162,49 +162,54 @@ public static class FileHelper
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool CheckPathForProblemLocations(string path, out PathCheck failedCheck)
|
private enum PathCheckType
|
||||||
{
|
{
|
||||||
failedCheck = new();
|
EndsWith = 0,
|
||||||
|
Contains = 1,
|
||||||
|
DriveRoot = 2
|
||||||
|
}
|
||||||
|
|
||||||
var problemPaths = new List<PathCheck>()
|
public static bool CheckPathForProblemLocations(string path, out string detectedName)
|
||||||
|
{
|
||||||
|
detectedName = "";
|
||||||
|
|
||||||
|
var problemNames = new Dictionary<string, PathCheckType>()
|
||||||
{
|
{
|
||||||
new("Documents", PathCheckType.EndsWith, PathCheckAction.Warn),
|
{ "Documents", PathCheckType.EndsWith },
|
||||||
new("Desktop", PathCheckType.EndsWith, PathCheckAction.Deny),
|
{ "Desktop", PathCheckType.Contains },
|
||||||
new("Battlestate Games", PathCheckType.Contains, PathCheckAction.Deny),
|
{ "scoped_dir", PathCheckType.Contains },
|
||||||
new("Desktop", PathCheckType.Contains, PathCheckAction.Warn),
|
{ "Downloads", PathCheckType.Contains },
|
||||||
new("scoped_dir", PathCheckType.Contains, PathCheckAction.Deny),
|
{ "OneDrive", PathCheckType.Contains },
|
||||||
new("Downloads", PathCheckType.Contains, PathCheckAction.Deny),
|
{ "NextCloud", PathCheckType.Contains },
|
||||||
new("OneDrive", PathCheckType.Contains, PathCheckAction.Deny),
|
{ "DropBox", PathCheckType.Contains },
|
||||||
new("NextCloud", PathCheckType.Contains, PathCheckAction.Deny),
|
{ "Google", PathCheckType.Contains },
|
||||||
new("DropBox", PathCheckType.Contains, PathCheckAction.Deny),
|
{ "Program Files", PathCheckType.Contains },
|
||||||
new("Google", PathCheckType.Contains, PathCheckAction.Deny),
|
{ "Program Files (x86)", PathCheckType.Contains },
|
||||||
new("Program Files", PathCheckType.Contains, PathCheckAction.Deny),
|
{ "Drive Root", PathCheckType.DriveRoot }
|
||||||
new("Program Files (x86", PathCheckType.Contains, PathCheckAction.Deny),
|
|
||||||
new("Drive Root", PathCheckType.DriveRoot, PathCheckAction.Deny)
|
|
||||||
};
|
};
|
||||||
|
|
||||||
foreach (var check in problemPaths)
|
foreach (var name in problemNames)
|
||||||
{
|
{
|
||||||
switch (check.CheckType)
|
switch (name.Value)
|
||||||
{
|
{
|
||||||
case PathCheckType.EndsWith:
|
case PathCheckType.EndsWith:
|
||||||
if (path.ToLower().EndsWith(check.Target.ToLower()))
|
if (path.ToLower().EndsWith(name.Key.ToLower()))
|
||||||
{
|
{
|
||||||
failedCheck = check;
|
detectedName = name.Key;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PathCheckType.Contains:
|
case PathCheckType.Contains:
|
||||||
if (path.ToLower().Contains(check.Target.ToLower()))
|
if (path.ToLower().Contains(name.Key.ToLower()))
|
||||||
{
|
{
|
||||||
failedCheck = check;
|
detectedName = name.Key;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PathCheckType.DriveRoot:
|
case PathCheckType.DriveRoot:
|
||||||
if (Regex.Match(path.ToLower(), @"^\w:(\\|\/)$").Success)
|
if (Regex.Match(path.ToLower(), @"^\w:(\\|\/)$").Success)
|
||||||
{
|
{
|
||||||
failedCheck = check;
|
detectedName = name.Key;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -33,8 +33,7 @@ public class Net8PreCheck : PreCheckBase
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var programFiles = Environment.ExpandEnvironmentVariables("%ProgramW6432%");
|
var result = ProcessHelper.RunAndReadProcessOutputs(@"C:\Program Files\dotnet\dotnet.exe", "--list-runtimes");
|
||||||
var result = ProcessHelper.RunAndReadProcessOutputs($@"{programFiles}\dotnet\dotnet.exe", "--list-runtimes");
|
|
||||||
|
|
||||||
if (!result.Succeeded)
|
if (!result.Succeeded)
|
||||||
{
|
{
|
||||||
|
@ -7,7 +7,6 @@ using SPTInstaller.Helpers;
|
|||||||
|
|
||||||
namespace SPTInstaller.Installer_Tasks.PreChecks;
|
namespace SPTInstaller.Installer_Tasks.PreChecks;
|
||||||
|
|
||||||
[Obsolete("No longer needed, but keeping around for now just in case. Can be removed from code after 7/1/2024 if no issues are found")]
|
|
||||||
public class NetCore6PreCheck : PreCheckBase
|
public class NetCore6PreCheck : PreCheckBase
|
||||||
{
|
{
|
||||||
public NetCore6PreCheck() : base(".Net Core 6 Desktop Runtime", true)
|
public NetCore6PreCheck() : base(".Net Core 6 Desktop Runtime", true)
|
||||||
@ -34,8 +33,7 @@ public class NetCore6PreCheck : PreCheckBase
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var programFiles = Environment.ExpandEnvironmentVariables("%ProgramW6432%");
|
var result = ProcessHelper.RunAndReadProcessOutputs(@"C:\Program Files\dotnet\dotnet.exe", "--list-runtimes");
|
||||||
var result = ProcessHelper.RunAndReadProcessOutputs($@"{programFiles}\dotnet\dotnet.exe", "--list-runtimes");
|
|
||||||
|
|
||||||
if (!result.Succeeded)
|
if (!result.Succeeded)
|
||||||
{
|
{
|
||||||
|
@ -60,7 +60,7 @@ public class ReleaseCheckTask : InstallerTaskBase
|
|||||||
|
|
||||||
if (comparePatchToAki == null && patchNeedCheck)
|
if (comparePatchToAki == null && patchNeedCheck)
|
||||||
{
|
{
|
||||||
return Result.FromError("No patcher available for your version.\nA patcher is usually created within 24 hours of an EFT update.");
|
return Result.FromError("No patcher available for your version");
|
||||||
}
|
}
|
||||||
|
|
||||||
_data.PatchNeeded = patchNeedCheck;
|
_data.PatchNeeded = patchNeedCheck;
|
||||||
|
@ -1,32 +0,0 @@
|
|||||||
namespace SPTInstaller.Models;
|
|
||||||
|
|
||||||
public enum PathCheckType
|
|
||||||
{
|
|
||||||
EndsWith = 0,
|
|
||||||
Contains = 1,
|
|
||||||
DriveRoot = 2
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum PathCheckAction
|
|
||||||
{
|
|
||||||
Warn = 0,
|
|
||||||
Deny = 1,
|
|
||||||
}
|
|
||||||
|
|
||||||
public class PathCheck
|
|
||||||
{
|
|
||||||
public string Target { get; private set; }
|
|
||||||
public PathCheckType CheckType { get; private set; }
|
|
||||||
public PathCheckAction CheckAction { get; private set; }
|
|
||||||
|
|
||||||
public PathCheck()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public PathCheck(string target, PathCheckType checkType, PathCheckAction checkAction)
|
|
||||||
{
|
|
||||||
Target = target;
|
|
||||||
CheckType = checkType;
|
|
||||||
CheckAction = checkAction;
|
|
||||||
}
|
|
||||||
}
|
|
@ -45,6 +45,7 @@ internal class Program
|
|||||||
|
|
||||||
#if !TEST
|
#if !TEST
|
||||||
ServiceHelper.Register<PreCheckBase, NetFramework472PreCheck>();
|
ServiceHelper.Register<PreCheckBase, NetFramework472PreCheck>();
|
||||||
|
ServiceHelper.Register<PreCheckBase, NetCore6PreCheck>();
|
||||||
ServiceHelper.Register<PreCheckBase, Net8PreCheck>();
|
ServiceHelper.Register<PreCheckBase, Net8PreCheck>();
|
||||||
ServiceHelper.Register<PreCheckBase, FreeSpacePreCheck>();
|
ServiceHelper.Register<PreCheckBase, FreeSpacePreCheck>();
|
||||||
ServiceHelper.Register<PreCheckBase, EftLauncherPreCheck>();
|
ServiceHelper.Register<PreCheckBase, EftLauncherPreCheck>();
|
||||||
|
@ -9,8 +9,8 @@
|
|||||||
<PackageIcon>icon.ico</PackageIcon>
|
<PackageIcon>icon.ico</PackageIcon>
|
||||||
<ApplicationIcon>Assets\icon.ico</ApplicationIcon>
|
<ApplicationIcon>Assets\icon.ico</ApplicationIcon>
|
||||||
<Configurations>Debug;Release;TEST</Configurations>
|
<Configurations>Debug;Release;TEST</Configurations>
|
||||||
<AssemblyVersion>2.59</AssemblyVersion>
|
<AssemblyVersion>2.55</AssemblyVersion>
|
||||||
<FileVersion>2.59</FileVersion>
|
<FileVersion>2.55</FileVersion>
|
||||||
<Company>SPT-AKI</Company>
|
<Company>SPT-AKI</Company>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
@ -164,38 +164,19 @@ public class PreChecksViewModel : ViewModelBase
|
|||||||
|
|
||||||
Task.Run(async () =>
|
Task.Run(async () =>
|
||||||
{
|
{
|
||||||
if (FileHelper.CheckPathForProblemLocations(InstallPath, out var failedCheck ))
|
if (FileHelper.CheckPathForProblemLocations(InstallPath, out var detectedName))
|
||||||
{
|
{
|
||||||
switch (failedCheck.CheckAction)
|
await Dispatcher.UIThread.InvokeAsync(async () =>
|
||||||
{
|
{
|
||||||
case PathCheckAction.Warn:
|
Log.Warning("Problem folder detected, confirming install path ...");
|
||||||
{
|
var confirmation = await DialogHost.Show(new ConfirmationDialog($"We suspect you may be installing into a problematic folder: {detectedName}.\nYou might want to consider installing somewhere else to avoid issues.\n\nAre you sure you want to install to this path?\n{InstallPath}"));
|
||||||
await Dispatcher.UIThread.InvokeAsync(async () =>
|
|
||||||
{
|
|
||||||
Log.Warning("Problem path detected, confirming install path ...");
|
|
||||||
var confirmation = await DialogHost.Show(new ConfirmationDialog(
|
|
||||||
$"We suspect you may be installing into a problematic folder: {failedCheck.Target}.\nYou might want to consider installing somewhere else to avoid issues.\n\nAre you sure you want to install to this path?\n{InstallPath}"));
|
|
||||||
|
|
||||||
if (confirmation == null || !bool.TryParse(confirmation.ToString(), out var confirm) ||
|
if (confirmation == null || !bool.TryParse(confirmation.ToString(), out var confirm) || !confirm)
|
||||||
!confirm)
|
{
|
||||||
{
|
Log.Information("User declined install path, exiting");
|
||||||
Log.Information("User declined install path, exiting");
|
Environment.Exit(0);
|
||||||
Environment.Exit(0);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case PathCheckAction.Deny:
|
|
||||||
{
|
|
||||||
Log.Error("Problem path detected, install denied");
|
|
||||||
NavigateTo(new MessageViewModel(HostScreen, Result.FromError($"We suspect you may be installing into a problematic folder: {failedCheck.Target}.\nWe won't be letting you install here. Please move the installer to another folder.\nSuggestion: a folder under your drive root, such as 'C:\\spt\\'\nDenied Path: {InstallPath}")));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
throw new ArgumentOutOfRangeException();
|
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
|
||||||
Log.Information("User accepted install path");
|
Log.Information("User accepted install path");
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user