Skip to content

Commit

Permalink
Merge pull request #309 from BryanAldrich/main
Browse files Browse the repository at this point in the history
[Fix]: Clear folder if the -o folder if needed
  • Loading branch information
Monitor221hz authored Oct 18, 2024
2 parents 5d2585c + 106de67 commit ffa8444
Show file tree
Hide file tree
Showing 6 changed files with 84 additions and 51 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -360,4 +360,5 @@ MigrationBackup/
.ionide/

# Fody - auto-generated XML schema
FodyWeavers.xsd
FodyWeavers.xsd
/Pandora Behaviour Engine/Properties/launchSettings.json
45 changes: 42 additions & 3 deletions Pandora Behaviour Engine/Models/Patch/Engine/BehaviourEngine.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,19 @@ namespace Pandora.Core
{
public class BehaviourEngine
{
public static readonly DirectoryInfo AssemblyDirectory = new FileInfo(System.Reflection.Assembly.GetEntryAssembly()!.Location).Directory!;
public static readonly DirectoryInfo AssemblyDirectory = new FileInfo(System.Reflection.Assembly.GetEntryAssembly()!.Location).Directory!;
public IEngineConfiguration Configuration { get; private set; } = new SkyrimConfiguration();

private bool ClearOutputPath = false;
private DirectoryInfo CurrentPath { get; } = new DirectoryInfo(Directory.GetCurrentDirectory());
public DirectoryInfo OutputPath { get; private set; } = new DirectoryInfo(Directory.GetCurrentDirectory());
public void SetOutputPath(DirectoryInfo outputPath)
{
ClearOutputPath = (outputPath != CurrentPath);
OutputPath = outputPath!;
Configuration.Patcher.SetOutputPath(outputPath);
}

public BehaviourEngine()
{

Expand All @@ -33,12 +43,41 @@ public async Task<bool> LaunchAsync(List<IModInfo> mods)
{
Configuration.Patcher.SetTarget(mods);

if (!await Configuration.Patcher.UpdateAsync()) { return false; }
if (!OutputPath.Exists) OutputPath.Create();

if (ClearOutputPath)
{
ClearFolder(OutputPath);
}

var fnisESP = new FileInfo(Path.Combine(AssemblyDirectory.FullName, "FNIS.esp"));
if (fnisESP.Exists)
fnisESP.CopyTo(Path.Combine(OutputPath.FullName, "FNIS.esp"), true);

if (!await Configuration.Patcher.UpdateAsync()) { return false; }

return await Configuration.Patcher.RunAsync();
}

public async Task PreloadAsync()
private void ClearFolder(DirectoryInfo dir)
{
foreach (var item in dir.GetFiles())
{
if (item.Name.Equals("ActiveMods.txt", StringComparison.InvariantCultureIgnoreCase))
continue;
else
item.Delete();
}
foreach (var item in dir.GetDirectories())
{
if (item.Name.Equals("Pandora_Engine", StringComparison.InvariantCultureIgnoreCase))
ClearFolder(item);
else
item.Delete(true);
}
}

public async Task PreloadAsync()
{
await Configuration.Patcher.PreloadAsync();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ public static MotionData ReadProject(StreamReader reader, int lineLimit)

whiteSpace = reader.ReadLine();
i++;

}
return project;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public static ProjectAnimData ReadProject(StreamReader reader, int lineLimit, An
project.Header = ProjectAnimDataHeader.ReadBlock(reader);

int i = project.Header.GetLineCount() + 1; //+1 to account for 1 empty line
string whiteSpace = "";
string? whiteSpace = "";

while (whiteSpace != null && i < lineLimit)
{
Expand All @@ -59,7 +59,6 @@ public static ProjectAnimData ReadProject(StreamReader reader, int lineLimit, An

whiteSpace = reader.ReadLine();
i++;

}
return project;
}
Expand All @@ -68,37 +67,30 @@ public static ProjectAnimData ReadProject(StreamReader reader, AnimDataManager m
ProjectAnimData project = new ProjectAnimData(manager);
project.Header = ProjectAnimDataHeader.ReadBlock(reader);


string whiteSpace = "";
string? whiteSpace = "";
while (whiteSpace != null)
{
ClipDataBlock block = ClipDataBlock.ReadBlock(reader);
project.Blocks.Add(block);

whiteSpace = reader.ReadLine();

}
return project;
}
public static ProjectAnimData ExtractProject(StreamReader reader, string openString, string closeString, AnimDataManager manager)
{
string s;
while (!(s = reader.ReadLine()).Contains(openString))
{
while (reader.ReadLine()?.Contains(openString) == false) ;

}
ProjectAnimData project = new ProjectAnimData(manager);
project.Header = ProjectAnimDataHeader.ReadBlock(reader);


string whiteSpace = "";
string? whiteSpace = "";
while (whiteSpace != null && !whiteSpace.Contains(closeString))
{
ClipDataBlock block = ClipDataBlock.ReadBlock(reader);
project.Blocks.Add(block);

whiteSpace = reader.ReadLineSafe();

}
return project;
}
Expand Down
8 changes: 0 additions & 8 deletions Pandora Behaviour Engine/Properties/launchSettings.json

This file was deleted.

62 changes: 36 additions & 26 deletions Pandora Behaviour Engine/ViewModels/EngineViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
using System.Linq;
using System.IO;
using System.Collections.Generic;
using System.Globalization;
using System.Globalization;
using System.Threading;
using Pandora.Core.Engine.Configs;
using System.Security.Policy;
Expand Down Expand Up @@ -86,6 +86,7 @@ public bool EngineRunning
private Dictionary<string, IModInfo> modsByCode = new Dictionary<string, IModInfo>();

private bool modInfoCache = false;
private static DirectoryInfo WorkingDirectory { get; } = new DirectoryInfo(Directory.GetCurrentDirectory());

private static DirectoryInfo currentDirectory = new DirectoryInfo(Directory.GetCurrentDirectory());

Expand Down Expand Up @@ -230,39 +231,48 @@ public async Task LoadAsync()
ModViewModels.Clear();
Mods.Clear();

List<IModInfo> modInfos = new();

modInfos.AddRange(await nemesisModInfoProvider?.GetInstalledMods(launchDirectory + "\\Nemesis_Engine\\mod")!);
modInfos.AddRange(await pandoraModInfoProvider?.GetInstalledMods(launchDirectory + "\\Pandora_Engine\\mod")!);
modInfos.AddRange(await nemesisModInfoProvider?.GetInstalledMods(currentDirectory + "\\Nemesis_Engine\\mod")!);
modInfos.AddRange(await pandoraModInfoProvider?.GetInstalledMods(currentDirectory + "\\Pandora_Engine\\mod")!);
modInfos = modInfos.Distinct().ToList();
for (int i = 0; i < modInfos.Count; i++)
List<IModInfo> modInfoList;
{
IModInfo? modInfo = modInfos[i];
//Mods.Add(modInfo);
IModInfo? existingModInfo;
if (modsByCode.TryGetValue(modInfo.Code, out existingModInfo))
{
logger.Warn($"Engine > Folder {modInfo.Folder.Parent?.Name} > Parse Info > {modInfo.Code} Already Exists > SKIPPED");
modInfos.RemoveAt(i);
continue;
}
modsByCode.Add(modInfo.Code, modInfo);
HashSet<IModInfo> modInfos = new();

//Program folder
LoadModFolder(modInfos, await nemesisModInfoProvider?.GetInstalledMods(launchDirectory + "\\Nemesis_Engine\\mod")!);
LoadModFolder(modInfos, await pandoraModInfoProvider?.GetInstalledMods(launchDirectory + "\\Pandora_Engine\\mod")!);
//Working folder, or Skyrim\Data folder
LoadModFolder(modInfos, await nemesisModInfoProvider?.GetInstalledMods(WorkingDirectory + "\\Nemesis_Engine\\mod")!);
LoadModFolder(modInfos, await pandoraModInfoProvider?.GetInstalledMods(WorkingDirectory + "\\Pandora_Engine\\mod")!);
//Current (defaults to Working folder) or Output (set via -o) folder
LoadModFolder(modInfos, await nemesisModInfoProvider?.GetInstalledMods(currentDirectory + "\\Nemesis_Engine\\mod")!);
LoadModFolder(modInfos, await pandoraModInfoProvider?.GetInstalledMods(currentDirectory + "\\Pandora_Engine\\mod")!);

modInfoList = [.. modInfos];
}
modInfoList.ForEach(a => modsByCode.Add(a.Code, a));

modInfoCache = LoadActiveMods(modInfos);
modInfoCache = LoadActiveMods(modInfoList);

modInfos = modInfos.OrderBy(m => m.Code == "pandora").OrderBy(m => m.Priority == 0).ThenBy(m => m.Priority).ThenBy(m => m.Name).ToList();
modInfoList = modInfoList.OrderBy(m => m.Code == "pandora").OrderBy(m => m.Priority == 0).ThenBy(m => m.Priority).ThenBy(m => m.Name).ToList();

foreach (var modInfo in modInfos)
foreach (var modInfo in modInfoList)
{
Mods.Add(modInfo);
ModViewModels.Add(new(modInfo));
}
await WriteLogBoxLine("Mods loaded.");
}

private static void LoadModFolder(HashSet<IModInfo> modInfos, IList<IModInfo> mods) {
if (mods == null) { return; }

foreach (var mod in mods)
{
if (!modInfos.Add(mod))
{
logger.Warn($"Engine > Folder {mod.Folder.Parent?.Name} > Parse Info > {mod.Code} Already Exists > SKIPPED");
}
}
}

public void Exit(object? p)
{
//App.Current.MainWindow.Close();
Expand Down Expand Up @@ -299,8 +309,8 @@ private void ReadStartupArguments()
var argArr = arg.AsSpan();
var pathArr = argArr.Slice(3);
var path = pathArr.Trim().ToString();
currentDirectory = new DirectoryInfo(path);
Engine.Configuration.Patcher.SetOutputPath(path);
currentDirectory = new DirectoryInfo(path);
Engine.SetOutputPath(currentDirectory);
continue;
}
}
Expand Down Expand Up @@ -382,7 +392,7 @@ private async void SetEngineConfiguration(object? config)
await preloadTask;
var newConfig = engineConfigurationFactory.Config;
Engine = newConfig != null ? new BehaviourEngine(newConfig) : Engine;
Engine.Configuration.Patcher.SetOutputPath(currentDirectory);
Engine.SetOutputPath(currentDirectory);
preloadTask = Engine.PreloadAsync();
}
private async void ToggleSelectAll(object? isChecked)
Expand Down Expand Up @@ -434,7 +444,7 @@ private async void LaunchEngine(object? parameter)
bool success = false;
await Task.Run(async() => { success = await Engine.LaunchAsync(activeMods); });


timer.Stop();

logger.Info(configInfoMessage);
Expand Down

0 comments on commit ffa8444

Please sign in to comment.