public static async Task ApplyChanges(Configuration configuration, CharacterModification[] data) { var tempFolder = FileWriterUtility.CreateTempFolder(); // Start with a blank canvas RemoveAllChanges(configuration); if (data.Length == 0) { return; } try { await ExtractFiles(configuration, tempFolder); var json = GenerateCharacterJson(data); var virtualreaderFile = Path.Combine(tempFolder, "presentation", "virtualreaderpc_data.lua"); var virtualreaderDecompiledFile = Path.Combine(tempFolder, "virtualreaderpc_data_decomp.lua"); var igpLocksFile = Path.Combine(tempFolder, "igp", "locks__lua.chd"); await UnluacUtility.Decompile(virtualreaderFile, virtualreaderDecompiledFile); // Write any data as required to the virtualreader file, make sure to offset by bytesWritten if needed int bytesWritten = 0; FileWriterUtility.WriteToFile(virtualreaderDecompiledFile, json, 0x0000A5C6, true, out bytesWritten); foreach (var character in data.Where(c => !string.IsNullOrEmpty(c.ReplacementCharacter))) { var offset = FindReplacementOffset(igpLocksFile, character.ReplacementCharacter); FileWriterUtility.WriteToFile(igpLocksFile, character.Config.PresentationData.Name, offset, false, out bytesWritten); } } catch (Exception ex) { Directory.Delete(tempFolder, true); return; } CopyFiles(configuration, tempFolder); Directory.Delete(tempFolder, true); }
private async Task <InstallationStatus> ApplyChangesInternal(GameModification[] mods, bool ignoreWarnings, bool reverting) { tempFolder = CreateTempFolder(); reservedFiles = GetReservedFiles(); autoMappings = GetAutoMappings(); fileWriter = new FileWriterUtility(); // Start with a blank canvas RemoveAllChanges(configuration); if (mods.Length == 0) { return(InstallationStatus.Success); } try { modActions = GetModActions(mods); // Write any data as required to the virtualreader file, make sure to offset by bytesWritten if needed foreach (var action in modActions.extractActions) { await QuickBMSExtract(action, tempFolder, action.action.UseAutoMapping); } foreach (var action in modActions.decompileActions) { await UnluacDecompile(action, tempFolder); } var actionStatus = PerformActions(modActions); if (actionStatus != InstallationStatus.Success) { return(actionStatus); } } catch (Exception ex) { Logging.LogMessage(ex.ToString(), Logging.LogSeverity.Error); if (Directory.Exists(tempFolder)) { Directory.Delete(tempFolder, true); } if (reverting) { // If we error out during revert, delete everything (something has gone badly wrong) RemoveAllChanges(configuration); return(InstallationStatus.FatalError); } else { // Revert back to the previous install state await ApplyChangesInternal(mods.Take(mods.Count() - 1).ToArray(), true, true); return(InstallationStatus.RolledBackError); } } finally { if (Directory.Exists(tempFolder)) { Directory.Delete(tempFolder, true); } } return(InstallationStatus.Success); }
public static bool HasEditCollision(GameModification currentMod, string file, IWriteContent content, FileWriterUtility fileWriter, List <FileModification> modifications, out ModCollision collision) { var actions = new ActionCollection(file, currentMod.Config.ModID, modifications); if (actions.moveAction != null) { return(AddModCollision(currentMod, ModInstallActionEnum.Edit, FileModificationType.Moved, actions.moveAction.ModID, ModCollisionSeverity.Clash, out collision)); } if (actions.replaceAction != null) { return(AddModCollision(currentMod, ModInstallActionEnum.Edit, FileModificationType.Replaced, actions.replaceAction.ModID, ModCollisionSeverity.Clash, out collision)); } if (actions.editAction != null && !fileWriter.CanWrite(file, content)) { return(AddModCollision(currentMod, ModInstallActionEnum.Edit, FileModificationType.Edited, actions.editAction.ModID, ModCollisionSeverity.Clash, out collision)); } if (actions.deleteAction != null) { return(AddModCollision(currentMod, ModInstallActionEnum.Edit, FileModificationType.Deleted, actions.deleteAction.ModID, ModCollisionSeverity.Clash, out collision)); } collision = null; return(false); }