diff --git a/CreamInstaller/CreamInstaller.csproj b/CreamInstaller/CreamInstaller.csproj
index 3dd1530..df6d567 100644
--- a/CreamInstaller/CreamInstaller.csproj
+++ b/CreamInstaller/CreamInstaller.csproj
@@ -4,7 +4,7 @@
net6.0-windows10.0.22621.0
True
Resources\ini.ico
- 4.2.2.0
+ 4.2.3.0
2021, pointfeev (https://github.com/pointfeev)
CreamInstaller
Automatic DLC Unlocker Installer & Configuration Generator
diff --git a/CreamInstaller/Forms/InstallForm.cs b/CreamInstaller/Forms/InstallForm.cs
index 3c227a1..5e3b8a3 100644
--- a/CreamInstaller/Forms/InstallForm.cs
+++ b/CreamInstaller/Forms/InstallForm.cs
@@ -64,7 +64,8 @@ internal partial class InstallForm : CustomForm
UpdateUser($"Repairing Paradox Launcher . . . ", LogTextBox.Operation);
_ = await Repair(this, selection);
}
- UpdateUser($"Checking directories for {selection.Name} . . . ", LogTextBox.Operation);
+ UpdateUser($"{(Uninstalling ? "Uninstalling" : "Installing")}" +
+ $" {(Uninstalling ? "from" : "for")} " + selection.Name + $" with root directory \"{selection.RootDirectory}\" . . . ", LogTextBox.Operation);
IEnumerable invalidDirectories = (await selection.RootDirectory.GetExecutables())
?.Where(d => !selection.ExecutableDirectories.Any(s => s.directory == Path.GetDirectoryName(d.path)))
?.Select(d => Path.GetDirectoryName(d.path));
@@ -77,11 +78,11 @@ internal partial class InstallForm : CustomForm
if (Program.Canceled) throw new CustomMessageException("The operation was canceled.");
directory.GetKoaloaderComponents(out List proxies, out string config);
if (proxies.Any(proxy => File.Exists(proxy) && proxy.IsResourceFile(ResourceIdentifier.Koaloader))
- || Koaloader.AutoLoadDlls.Any(pair => File.Exists(directory + @"\" + pair.dll))
+ || directory != selection.RootDirectory && Koaloader.AutoLoadDlls.Any(pair => File.Exists(directory + @"\" + pair.dll))
|| File.Exists(config))
{
UpdateUser("Uninstalling Koaloader from " + selection.Name + $" in incorrect directory \"{directory}\" . . . ", LogTextBox.Operation);
- await Koaloader.Uninstall(directory, this);
+ await Koaloader.Uninstall(directory, rootDirectory: selection.RootDirectory, this);
}
Thread.Sleep(1);
}
@@ -96,7 +97,7 @@ internal partial class InstallForm : CustomForm
|| File.Exists(config))
{
UpdateUser("Uninstalling Koaloader from " + selection.Name + $" in directory \"{directory}\" . . . ", LogTextBox.Operation);
- await Koaloader.Uninstall(directory, this);
+ await Koaloader.Uninstall(directory, rootDirectory: selection.RootDirectory, this);
}
Thread.Sleep(1);
}
@@ -164,7 +165,7 @@ internal partial class InstallForm : CustomForm
{
if (Program.Canceled) throw new CustomMessageException("The operation was canceled.");
UpdateUser("Installing Koaloader to " + selection.Name + $" in directory \"{directory}\" . . . ", LogTextBox.Operation);
- await Koaloader.Install(directory, binaryType, selection, this);
+ await Koaloader.Install(directory, binaryType, selection, rootDirectory: selection.RootDirectory, this);
Thread.Sleep(1);
}
}
diff --git a/CreamInstaller/Forms/SelectForm.cs b/CreamInstaller/Forms/SelectForm.cs
index 8011511..49766e4 100644
--- a/CreamInstaller/Forms/SelectForm.cs
+++ b/CreamInstaller/Forms/SelectForm.cs
@@ -22,7 +22,6 @@ using System.Threading.Tasks;
using System.Windows.Forms;
using static CreamInstaller.Resources.Resources;
-using static System.ComponentModel.Design.ObjectSelectorEditor;
namespace CreamInstaller;
diff --git a/CreamInstaller/Resources/Koaloader.cs b/CreamInstaller/Resources/Koaloader.cs
index 1395bef..42c59b8 100644
--- a/CreamInstaller/Resources/Koaloader.cs
+++ b/CreamInstaller/Resources/Koaloader.cs
@@ -67,8 +67,8 @@ internal static class Koaloader
SortedList modules = new(PlatformIdComparer.String);
if (targets.Any() || modules.Any())
{
- if (installForm is not null)
- installForm.UpdateUser("Generating Koaloader configuration for " + selection.Name + $" in directory \"{directory}\" . . . ", LogTextBox.Operation);
+ /*if (installForm is not null)
+ installForm.UpdateUser("Generating Koaloader configuration for " + selection.Name + $" in directory \"{directory}\" . . . ", LogTextBox.Operation);*/
File.Create(config).Close();
StreamWriter writer = new(config, true, Encoding.UTF8);
WriteConfig(writer, targets, modules, installForm);
@@ -125,10 +125,10 @@ internal static class Koaloader
writer.WriteLine("}");
}
- internal static async Task Uninstall(string directory, InstallForm installForm = null, bool deleteConfig = true) => await Task.Run(async () =>
+ internal static async Task Uninstall(string directory, string rootDirectory = null, InstallForm installForm = null, bool deleteConfig = true) => await Task.Run(async () =>
{
directory.GetKoaloaderComponents(out List proxies, out string config);
- foreach (string proxyPath in proxies.Where(proxyPath => File.Exists(proxyPath) && proxyPath.IsResourceFile(Resources.ResourceIdentifier.Koaloader)))
+ foreach (string proxyPath in proxies.Where(proxyPath => File.Exists(proxyPath) && proxyPath.IsResourceFile(ResourceIdentifier.Koaloader)))
{
File.Delete(proxyPath);
if (installForm is not null)
@@ -152,9 +152,11 @@ internal static class Koaloader
await ScreamAPI.Uninstall(directory, installForm, deleteConfig);
await UplayR1.Uninstall(directory, installForm, deleteConfig);
await UplayR2.Uninstall(directory, installForm, deleteConfig);
+ if (rootDirectory is not null && directory != rootDirectory)
+ await Uninstall(rootDirectory, null, installForm, deleteConfig);
});
- internal static async Task Install(string directory, BinaryType binaryType, ProgramSelection selection, InstallForm installForm = null, bool generateConfig = true) => await Task.Run(() =>
+ internal static async Task Install(string directory, BinaryType binaryType, ProgramSelection selection, string rootDirectory = null, InstallForm installForm = null, bool generateConfig = true) => await Task.Run(() =>
{
directory.GetKoaloaderComponents(out List proxies, out string config);
string proxy = selection.KoaloaderProxy ?? ProgramSelection.DefaultKoaloaderProxy;
@@ -186,69 +188,149 @@ internal static class Koaloader
if (bit32)
{
path = directory + @"\SmokeAPI32.dll";
+ if (rootDirectory is not null && directory != rootDirectory)
+ {
+ if (File.Exists(path))
+ {
+ File.Delete(path);
+ if (installForm is not null)
+ installForm.UpdateUser($"Deleted SmokeAPI from non-root directory: {Path.GetFileName(path)}", LogTextBox.Action, info: false);
+ }
+ path = rootDirectory + @"\SmokeAPI32.dll";
+ }
"SmokeAPI.steam_api.dll".Write(path);
if (installForm is not null)
- installForm.UpdateUser($"Wrote SmokeAPI: {Path.GetFileName(path)}", LogTextBox.Action, info: false);
+ installForm.UpdateUser($"Wrote SmokeAPI{(rootDirectory is not null && directory != rootDirectory ? " to root directory" : "")}: {Path.GetFileName(path)}", LogTextBox.Action, info: false);
}
if (bit64)
{
path = directory + @"\SmokeAPI64.dll";
+ if (rootDirectory is not null && directory != rootDirectory)
+ {
+ if (File.Exists(path))
+ {
+ File.Delete(path);
+ if (installForm is not null)
+ installForm.UpdateUser($"Deleted SmokeAPI from non-root directory: {Path.GetFileName(path)}", LogTextBox.Action, info: false);
+ }
+ path = rootDirectory + @"\SmokeAPI64.dll";
+ }
"SmokeAPI.steam_api64.dll".Write(path);
if (installForm is not null)
- installForm.UpdateUser($"Wrote SmokeAPI: {Path.GetFileName(path)}", LogTextBox.Action, info: false);
+ installForm.UpdateUser($"Wrote SmokeAPI{(rootDirectory is not null && directory != rootDirectory ? " to root directory" : "")}: {Path.GetFileName(path)}", LogTextBox.Action, info: false);
}
- SmokeAPI.CheckConfig(directory, selection, installForm);
+ SmokeAPI.CheckConfig(rootDirectory ?? directory, selection, installForm);
}
if (selection.Platform is Platform.Epic or Platform.Paradox)
{
if (bit32)
{
path = directory + @"\ScreamAPI32.dll";
+ if (rootDirectory is not null && directory != rootDirectory)
+ {
+ if (File.Exists(path))
+ {
+ File.Delete(path);
+ if (installForm is not null)
+ installForm.UpdateUser($"Deleted ScreamAPI from non-root directory: {Path.GetFileName(path)}", LogTextBox.Action, info: false);
+ }
+ path = rootDirectory + @"\ScreamAPI32.dll";
+ }
"ScreamAPI.EOSSDK-Win32-Shipping.dll".Write(path);
if (installForm is not null)
- installForm.UpdateUser($"Wrote ScreamAPI: {Path.GetFileName(path)}", LogTextBox.Action, info: false);
+ installForm.UpdateUser($"Wrote ScreamAPI{(rootDirectory is not null && directory != rootDirectory ? " to root directory" : "")}: {Path.GetFileName(path)}", LogTextBox.Action, info: false);
}
if (bit64)
{
path = directory + @"\ScreamAPI64.dll";
+ if (rootDirectory is not null && directory != rootDirectory)
+ {
+ if (File.Exists(path))
+ {
+ File.Delete(path);
+ if (installForm is not null)
+ installForm.UpdateUser($"Deleted ScreamAPI from non-root directory: {Path.GetFileName(path)}", LogTextBox.Action, info: false);
+ }
+ path = rootDirectory + @"\ScreamAPI64.dll";
+ }
"ScreamAPI.EOSSDK-Win64-Shipping.dll".Write(path);
if (installForm is not null)
- installForm.UpdateUser($"Wrote ScreamAPI: {Path.GetFileName(path)}", LogTextBox.Action, info: false);
+ installForm.UpdateUser($"Wrote ScreamAPI{(rootDirectory is not null && directory != rootDirectory ? " to root directory" : "")}: {Path.GetFileName(path)}", LogTextBox.Action, info: false);
}
- ScreamAPI.CheckConfig(directory, selection, installForm);
+ ScreamAPI.CheckConfig(rootDirectory ?? directory, selection, installForm);
}
if (selection.Platform is Platform.Ubisoft)
{
if (bit32)
{
path = directory + @"\UplayR1Unlocker32.dll";
+ if (rootDirectory is not null && directory != rootDirectory)
+ {
+ if (File.Exists(path))
+ {
+ File.Delete(path);
+ if (installForm is not null)
+ installForm.UpdateUser($"Deleted Uplay R1 Unlocker from non-root directory: {Path.GetFileName(path)}", LogTextBox.Action, info: false);
+ }
+ path = rootDirectory + @"\UplayR1Unlocker32.dll";
+ }
"UplayR1.uplay_r1_loader.dll".Write(path);
if (installForm is not null)
- installForm.UpdateUser($"Wrote Uplay R1 Unlocker: {Path.GetFileName(path)}", LogTextBox.Action, info: false);
+ installForm.UpdateUser($"Wrote Uplay R1 Unlocker{(rootDirectory is not null && directory != rootDirectory ? " to root directory" : "")}: {Path.GetFileName(path)}", LogTextBox.Action, info: false);
}
if (bit64)
{
path = directory + @"\UplayR1Unlocker64.dll";
+ if (rootDirectory is not null && directory != rootDirectory)
+ {
+ if (File.Exists(path))
+ {
+ File.Delete(path);
+ if (installForm is not null)
+ installForm.UpdateUser($"Deleted Uplay R1 Unlocker from non-root directory: {Path.GetFileName(path)}", LogTextBox.Action, info: false);
+ }
+ path = rootDirectory + @"\UplayR1Unlocker64.dll";
+ }
"UplayR1.uplay_r1_loader64.dll".Write(path);
if (installForm is not null)
- installForm.UpdateUser($"Wrote Uplay R1 Unlocker: {Path.GetFileName(path)}", LogTextBox.Action, info: false);
+ installForm.UpdateUser($"Wrote Uplay R1 Unlocker{(rootDirectory is not null && directory != rootDirectory ? " to root directory" : "")}: {Path.GetFileName(path)}", LogTextBox.Action, info: false);
}
- UplayR1.CheckConfig(directory, selection, installForm);
+ UplayR1.CheckConfig(rootDirectory ?? directory, selection, installForm);
if (bit32)
{
path = directory + @"\UplayR2Unlocker32.dll";
+ if (rootDirectory is not null && directory != rootDirectory)
+ {
+ if (File.Exists(path))
+ {
+ File.Delete(path);
+ if (installForm is not null)
+ installForm.UpdateUser($"Deleted Uplay R2 Unlocker from non-root directory: {Path.GetFileName(path)}", LogTextBox.Action, info: false);
+ }
+ path = rootDirectory + @"\UplayR2Unlocker32.dll";
+ }
"UplayR2.upc_r2_loader.dll".Write(path);
if (installForm is not null)
- installForm.UpdateUser($"Wrote Uplay R2 Unlocker: {Path.GetFileName(path)}", LogTextBox.Action, info: false);
+ installForm.UpdateUser($"Wrote Uplay R2 Unlocker{(rootDirectory is not null && directory != rootDirectory ? " to root directory" : "")}: {Path.GetFileName(path)}", LogTextBox.Action, info: false);
}
if (bit64)
{
path = directory + @"\UplayR2Unlocker64.dll";
+ if (rootDirectory is not null && directory != rootDirectory)
+ {
+ if (File.Exists(path))
+ {
+ File.Delete(path);
+ if (installForm is not null)
+ installForm.UpdateUser($"Deleted Uplay R2 Unlocker from non-root directory: {Path.GetFileName(path)}", LogTextBox.Action, info: false);
+ }
+ path = rootDirectory + @"\UplayR2Unlocker64.dll";
+ }
"UplayR2.upc_r2_loader64.dll".Write(path);
if (installForm is not null)
- installForm.UpdateUser($"Wrote Uplay R2 Unlocker: {Path.GetFileName(path)}", LogTextBox.Action, info: false);
+ installForm.UpdateUser($"Wrote Uplay R2 Unlocker{(rootDirectory is not null && directory != rootDirectory ? " to root directory" : "")}: {Path.GetFileName(path)}", LogTextBox.Action, info: false);
}
- UplayR2.CheckConfig(directory, selection, installForm);
+ UplayR2.CheckConfig(rootDirectory ?? directory, selection, installForm);
}
if (generateConfig)
CheckConfig(directory, selection, installForm);
diff --git a/CreamInstaller/Resources/ScreamAPI.cs b/CreamInstaller/Resources/ScreamAPI.cs
index e8f24aa..1094b14 100644
--- a/CreamInstaller/Resources/ScreamAPI.cs
+++ b/CreamInstaller/Resources/ScreamAPI.cs
@@ -36,8 +36,8 @@ internal static class ScreamAPI
entitlements = entitlements.Concat(_dlc.Where(pair => pair.Value.type == DlcType.EpicEntitlement));
if (overrideCatalogItems.Any() || entitlements.Any())
{
- if (installForm is not null)
- installForm.UpdateUser("Generating ScreamAPI configuration for " + selection.Name + $" in directory \"{directory}\" . . . ", LogTextBox.Operation);
+ /*if (installForm is not null)
+ installForm.UpdateUser("Generating ScreamAPI configuration for " + selection.Name + $" in directory \"{directory}\" . . . ", LogTextBox.Operation);*/
File.Create(config).Close();
StreamWriter writer = new(config, true, Encoding.UTF8);
WriteConfig(writer,
diff --git a/CreamInstaller/Resources/SmokeAPI.cs b/CreamInstaller/Resources/SmokeAPI.cs
index 114a538..763b2ea 100644
--- a/CreamInstaller/Resources/SmokeAPI.cs
+++ b/CreamInstaller/Resources/SmokeAPI.cs
@@ -42,8 +42,8 @@ internal static class SmokeAPI
}
if (overrideDlc.Any() || injectDlc.Any())
{
- if (installForm is not null)
- installForm.UpdateUser("Generating SmokeAPI configuration for " + selection.Name + $" in directory \"{directory}\" . . . ", LogTextBox.Operation);
+ /*if (installForm is not null)
+ installForm.UpdateUser("Generating SmokeAPI configuration for " + selection.Name + $" in directory \"{directory}\" . . . ", LogTextBox.Operation);*/
File.Create(config).Close();
StreamWriter writer = new(config, true, Encoding.UTF8);
WriteConfig(writer,
diff --git a/CreamInstaller/Resources/UplayR1.cs b/CreamInstaller/Resources/UplayR1.cs
index f0546b3..736d340 100644
--- a/CreamInstaller/Resources/UplayR1.cs
+++ b/CreamInstaller/Resources/UplayR1.cs
@@ -33,8 +33,8 @@ internal static class UplayR1
blacklistDlc = blacklistDlc.Except(extraDlc);
if (blacklistDlc.Any())
{
- if (installForm is not null)
- installForm.UpdateUser("Generating Uplay R1 Unlocker configuration for " + selection.Name + $" in directory \"{directory}\" . . . ", LogTextBox.Operation);
+ /*if (installForm is not null)
+ installForm.UpdateUser("Generating Uplay R1 Unlocker configuration for " + selection.Name + $" in directory \"{directory}\" . . . ", LogTextBox.Operation);*/
File.Create(config).Close();
StreamWriter writer = new(config, true, Encoding.UTF8);
WriteConfig(writer, new(blacklistDlc.ToDictionary(pair => pair.Key, pair => pair.Value), PlatformIdComparer.String), installForm);
diff --git a/CreamInstaller/Resources/UplayR2.cs b/CreamInstaller/Resources/UplayR2.cs
index cb104bd..1ea3204 100644
--- a/CreamInstaller/Resources/UplayR2.cs
+++ b/CreamInstaller/Resources/UplayR2.cs
@@ -35,8 +35,8 @@ internal static class UplayR2
blacklistDlc = blacklistDlc.Except(extraDlc);
if (blacklistDlc.Any())
{
- if (installForm is not null)
- installForm.UpdateUser("Generating Uplay R2 Unlocker configuration for " + selection.Name + $" in directory \"{directory}\" . . . ", LogTextBox.Operation);
+ /*if (installForm is not null)
+ installForm.UpdateUser("Generating Uplay R2 Unlocker configuration for " + selection.Name + $" in directory \"{directory}\" . . . ", LogTextBox.Operation);*/
File.Create(config).Close();
StreamWriter writer = new(config, true, Encoding.UTF8);
WriteConfig(writer, new(blacklistDlc.ToDictionary(pair => pair.Key, pair => pair.Value), PlatformIdComparer.String), installForm);