using CodeWalker.GameFiles; using CodeWalker.Properties; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace CodeWalker { public partial class ExtractScriptsForm : Form { private volatile bool KeysLoaded = false; private volatile bool InProgress = false; private volatile bool AbortOperation = false; public ExtractScriptsForm() { InitializeComponent(); } private void ExtractForm_Load(object sender, EventArgs e) { DumpTextBox.Text = Settings.Default.GTAExeDumpFile; FolderTextBox.Text = Settings.Default.GTAFolder; OutputFolderTextBox.Text = Settings.Default.CompiledScriptFolder; try { GTA5Keys.LoadFromPath(Settings.Default.GTAFolder, Settings.Default.Key); KeysLoaded = true; UpdateDumpStatus("Ready."); UpdateExtractStatus("Ready to extract."); } catch { UpdateDumpStatus("Keys not found! This shouldn't happen."); } } private void DumpTextBox_TextChanged(object sender, EventArgs e) { Settings.Default.GTAExeDumpFile = DumpTextBox.Text; } private void FolderTextBox_TextChanged(object sender, EventArgs e) { Settings.Default.GTAFolder = FolderTextBox.Text; } private void OutputFolderTextBox_TextChanged(object sender, EventArgs e) { Settings.Default.CompiledScriptFolder = OutputFolderTextBox.Text; } private void FolderBrowseButton_Click(object sender, EventArgs e) { FolderBrowserDialog.SelectedPath = Settings.Default.GTAFolder; DialogResult res = FolderBrowserDialog.ShowDialog(); if (res == DialogResult.OK) { FolderTextBox.Text = FolderBrowserDialog.SelectedPath; } } private void OutputFolderBrowseButton_Click(object sender, EventArgs e) { FolderBrowserDialog.SelectedPath = OutputFolderTextBox.Text; DialogResult res = FolderBrowserDialog.ShowDialog(); if (res == DialogResult.OK) { OutputFolderTextBox.Text = FolderBrowserDialog.SelectedPath; } } private void DumpBrowseButton_Click(object sender, EventArgs e) { DialogResult res = OpenFileDialog.ShowDialog(); if (res == DialogResult.OK) { DumpTextBox.Text = OpenFileDialog.FileName; } } private void FindKeysButton_Click(object sender, EventArgs e) { if (InProgress) return; if (KeysLoaded) { if (MessageBox.Show("Keys are already loaded. Do you wish to scan the exe dump anyway?", "Keys already loaded", MessageBoxButtons.OKCancel) != DialogResult.OK) { return; } } InProgress = true; AbortOperation = false; string dmppath = DumpTextBox.Text; Task.Run(() => { try { if (AbortOperation) { UpdateDumpStatus("Dump scan aborted."); return; } FileInfo dmpfi = new FileInfo(dmppath); UpdateDumpStatus(string.Format("Scanning {0} for keys...", dmpfi.Name)); byte[] exedat = File.ReadAllBytes(dmppath); GTA5Keys.Generate(exedat, UpdateDumpStatus); UpdateDumpStatus("Saving found keys..."); GTA5Keys.SaveToPath(); UpdateDumpStatus("Keys loaded."); UpdateExtractStatus("Keys loaded, ready to extract."); KeysLoaded = true; InProgress = false; } catch (Exception ex) { UpdateDumpStatus("Error - " + ex.ToString()); InProgress = false; } }); } private void ExtractScriptsButton_Click(object sender, EventArgs e) { if (InProgress) return; if (!KeysLoaded) { MessageBox.Show("Please scan a GTA 5 exe dump for keys first, or include key files in this app's folder!"); return; } if (!Directory.Exists(FolderTextBox.Text)) { MessageBox.Show("Folder doesn't exist: " + FolderTextBox.Text); return; } if (!Directory.Exists(OutputFolderTextBox.Text)) { MessageBox.Show("Folder doesn't exist: " + OutputFolderTextBox.Text); return; } if (Directory.GetFiles(OutputFolderTextBox.Text, "*.ysc", SearchOption.AllDirectories).Length > 0) { if (MessageBox.Show("Output folder already contains .ysc files. Are you sure you want to continue?", "Output folder already contains .ysc files", MessageBoxButtons.OKCancel) != DialogResult.OK) { return; } } InProgress = true; AbortOperation = false; string searchpath = FolderTextBox.Text; string outputpath = OutputFolderTextBox.Text; string replpath = searchpath + "\\"; Task.Run(() => { UpdateExtractStatus("Keys loaded."); string[] allfiles = Directory.GetFiles(searchpath, "*.rpf", SearchOption.AllDirectories); foreach (string rpfpath in allfiles) { RpfFile rf = new RpfFile(rpfpath, rpfpath.Replace(replpath, "")); UpdateExtractStatus("Searching " + rf.Name + "..."); rf.ExtractScripts(outputpath, UpdateExtractStatus); } UpdateExtractStatus("Complete."); InProgress = false; }); } private void UpdateDumpStatus(string text) { try { if (InvokeRequired) { Invoke(new Action(() => { UpdateDumpStatus(text); })); } else { DumpStatusLabel.Text = text; } } catch { } } private void UpdateExtractStatus(string text) { try { if (InvokeRequired) { Invoke(new Action(() => { UpdateExtractStatus(text); })); } else { ExtractStatusLabel.Text = text; } } catch { } } } }