using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Drawing.Text; using System.Globalization; using System.IO; using System.Linq; using System.Net; using System.Runtime.InteropServices; using System.Security.AccessControl; using System.Security.Principal; using System.Threading.Tasks; using System.Windows.Forms; using AutoUpdaterDotNET; using csharp_wick; using FModel.Converter; using FModel.Forms; using FModel.Parser.Banners; using FModel.Parser.Challenges; using FModel.Parser.Featured; using FModel.Parser.Items; using FModel.Parser.Quests; using FModel.Parser.RenderMat; using FModel.Properties; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using ScintillaNET; using ScintillaNET_FindReplaceDialog; using Image = System.Drawing.Image; using Settings = FModel.Properties.Settings; namespace FModel { public partial class MainWindow : Form { #region EVERYTHING WE NEED FindReplace _myFindReplace; public Stopwatch StopWatch; public static PakAsset MyAsset; public static PakExtractor MyExtractor; private static string[] _paksArray; public static string[] PakAsTxt; public static Dictionary AllpaksDictionary; private static Dictionary _questStageDict; private static Dictionary _diffToExtract; private static Dictionary _paksMountPoint; private static string _backupFileName; private static string _backupDynamicKeys; private static List _itemsToDisplay; public static string DefaultOutputPath; public static string CurrentUsedPak; public static string CurrentUsedPakGuid; public static string CurrentUsedItem; public static string ExtractedFilePath; public static string[] SelectedItemsArray; public static string[] SelectedChallengesArray; public static bool WasFeatured; public static string ItemIconPath; public static int YAfterLoop; public static bool UmWorking; #endregion #region FONTS PrivateFontCollection _pfc = new PrivateFontCollection(); StringFormat _centeredString = new StringFormat(); StringFormat _rightString = new StringFormat(); StringFormat _centeredStringLine = new StringFormat(); private int _fontLength; private byte[] _fontdata; private int _fontLength2; private byte[] _fontdata2; #endregion #region DLLIMPORT [DllImport("wininet.dll")] private extern static bool InternetGetConnectedState(out int description, int reservedValue); public static bool IsInternetAvailable() { return InternetGetConnectedState(description: out _, reservedValue: 0); } [DllImport("uxtheme.dll", ExactSpelling = true, CharSet = CharSet.Unicode)] private static extern int SetWindowTheme(IntPtr hwnd, string pszSubAppName, string pszSubIdList); public static void SetTreeViewTheme(IntPtr treeHandle) { SetWindowTheme(treeHandle, "explorer", null); } #endregion public MainWindow() { InitializeComponent(); toolStripStatusLabel1.Text += @" " + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString().Substring(0, 5); treeView1.Sort(); //REMOVE SPACE CAUSED BY SIZING GRIP statusStrip1.Padding = new Padding(statusStrip1.Padding.Left, statusStrip1.Padding.Top, statusStrip1.Padding.Left, statusStrip1.Padding.Bottom); // Create instance of FindReplace with reference to a ScintillaNET control. _myFindReplace = new FindReplace(scintilla1); // For WinForms _myFindReplace.Window.StartPosition = FormStartPosition.CenterScreen; // Tie in FindReplace event _myFindReplace.KeyPressed += MyFindReplace_KeyPressed; // Tie in Scintilla event scintilla1.KeyDown += scintilla1_KeyDown; } #region USEFUL METHODS private void UpdateConsole(string textToDisplay, Color seColor, string seText) { if (InvokeRequired) { BeginInvoke(new Action(UpdateConsole), textToDisplay, seColor, seText); return; } toolStripStatusLabel2.Text = textToDisplay; toolStripStatusLabel3.BackColor = seColor; toolStripStatusLabel3.Text = seText; } private void AppendText(string text, Color color, bool addNewLine = false, HorizontalAlignment align = HorizontalAlignment.Left) { if (InvokeRequired) { BeginInvoke(new Action(AppendText), text, color, addNewLine, align); return; } richTextBox1.SuspendLayout(); richTextBox1.SelectionColor = color; richTextBox1.SelectionAlignment = align; richTextBox1.AppendText(addNewLine ? $"{text}{Environment.NewLine}" : text); richTextBox1.ScrollToCaret(); richTextBox1.ResumeLayout(); } private void OpenWithDefaultProgramAndNoFocus(string path) { Process fileopener = new Process(); fileopener.StartInfo.FileName = "explorer"; fileopener.StartInfo.Arguments = "\"" + path + "\""; fileopener.Start(); } public Image SetImageOpacity(Image image, float opacity) { try { //create a Bitmap the size of the image provided Bitmap bmp = new Bitmap(image.Width, image.Height); //create a graphics object from the image using (Graphics gfx = Graphics.FromImage(bmp)) { //create a color matrix object ColorMatrix matrix = new ColorMatrix(); //set the opacity matrix.Matrix33 = opacity; //create image attributes ImageAttributes attributes = new ImageAttributes(); //set the color(opacity) of the image attributes.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); //now draw the image gfx.DrawImage(image, new Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, attributes); } return bmp; } catch (Exception ex) { MessageBox.Show(ex.Message); return null; } } private void CreateDir() { if (!Directory.Exists(DefaultOutputPath + "\\Backup\\")) Directory.CreateDirectory(DefaultOutputPath + "\\Backup\\"); if (!Directory.Exists(DefaultOutputPath + "\\Extracted\\")) Directory.CreateDirectory(DefaultOutputPath + "\\Extracted\\"); if (!Directory.Exists(DefaultOutputPath + "\\Icons\\")) Directory.CreateDirectory(DefaultOutputPath + "\\Icons\\"); if (!Directory.Exists(DefaultOutputPath + "\\Sounds\\")) Directory.CreateDirectory(DefaultOutputPath + "\\Sounds\\"); } public static void SetFolderPermission(string folderPath) { var directoryInfo = new DirectoryInfo(folderPath); var directorySecurity = directoryInfo.GetAccessControl(); var currentUserIdentity = WindowsIdentity.GetCurrent(); var fileSystemRule = new FileSystemAccessRule(currentUserIdentity.Name, FileSystemRights.Read, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow); directorySecurity.AddAccessRule(fileSystemRule); directoryInfo.SetAccessControl(directorySecurity); } #endregion #region LOAD & LEAVE //METHODS private void AddPaKs(IEnumerable thePaks, int index) { if (InvokeRequired) { BeginInvoke(new Action, int>(AddPaKs), thePaks, index); return; } loadOneToolStripMenuItem.DropDownItems.Add(Path.GetFileName(thePaks.ElementAt(index))); } private void FillWithPaKs() { if (!Directory.Exists(Settings.Default.PAKsPath)) { loadOneToolStripMenuItem.Enabled = false; loadAllToolStripMenuItem.Enabled = false; backupPAKsToolStripMenuItem.Enabled = false; UpdateConsole(".PAK Files Path is missing", Color.FromArgb(255, 244, 66, 66), "Error"); } else { IEnumerable yourPaKs = Directory.GetFiles(Settings.Default.PAKsPath).Where(x => x.EndsWith(".pak")); int count = 0; var thePaks = yourPaKs as string[] ?? yourPaKs.ToArray(); foreach (var dummy in thePaks) count++; _paksArray = new string[count]; for (int i = 0; i < thePaks.Count(); i++) { AddPaKs(thePaks, i); _paksArray[i] = Path.GetFileName(thePaks.ElementAt(i)); } } } private void SetOutput() { DefaultOutputPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\FModel"; //DOCUMENTS FOLDER BY DEFAULT if (string.IsNullOrEmpty(Settings.Default.ExtractOutput)) { Settings.Default.ExtractOutput = DefaultOutputPath; Settings.Default.Save(); } else { DefaultOutputPath = Settings.Default.ExtractOutput; } if (!Directory.Exists(DefaultOutputPath)) Directory.CreateDirectory(DefaultOutputPath); } private void JohnWickCheck() { if (File.Exists(DefaultOutputPath + "\\john-wick-parse-modded.exe")) { File.Delete(DefaultOutputPath + "\\john-wick-parse-modded.exe"); } if (File.Exists(DefaultOutputPath + "\\john-wick-parse_custom.exe")) { File.Delete(DefaultOutputPath + "\\john-wick-parse_custom.exe"); } } private void KeyCheck() { if (InvokeRequired) { BeginInvoke(new Action(KeyCheck)); return; } AESKeyTextBox.Text = @"0x" + Settings.Default.AESKey; } private void SetScintillaStyle() { if (InvokeRequired) { BeginInvoke(new Action(SetScintillaStyle)); return; } scintilla1.Styles[Style.Json.Default].ForeColor = Color.Silver; scintilla1.Styles[Style.Json.BlockComment].ForeColor = Color.FromArgb(0, 128, 0); scintilla1.Styles[Style.Json.LineComment].ForeColor = Color.FromArgb(0, 128, 0); scintilla1.Styles[Style.Json.Number].ForeColor = Color.Green; scintilla1.Styles[Style.Json.PropertyName].ForeColor = Color.SteelBlue; scintilla1.Styles[Style.Json.String].ForeColor = Color.OrangeRed; scintilla1.Styles[Style.Json.StringEol].BackColor = Color.OrangeRed; scintilla1.Styles[Style.Json.Operator].ForeColor = Color.Black; scintilla1.Styles[Style.LineNumber].ForeColor = Color.DarkGray; var nums = scintilla1.Margins[1]; nums.Width = 30; nums.Type = MarginType.Number; nums.Sensitive = true; nums.Mask = 0; scintilla1.ClearCmdKey(Keys.Control | Keys.F); scintilla1.ClearCmdKey(Keys.Control | Keys.Z); scintilla1.Lexer = Lexer.Json; } private void SetFont() { _fontLength = Resources.BurbankBigCondensed_Bold.Length; _fontdata = Resources.BurbankBigCondensed_Bold; IntPtr weirdData = Marshal.AllocCoTaskMem(_fontLength); Marshal.Copy(_fontdata, 0, weirdData, _fontLength); _pfc.AddMemoryFont(weirdData, _fontLength); _fontLength2 = Resources.BurbankBigCondensed_Black.Length; _fontdata2 = Resources.BurbankBigCondensed_Black; IntPtr weirdData2 = Marshal.AllocCoTaskMem(_fontLength2); Marshal.Copy(_fontdata2, 0, weirdData2, _fontLength2); _pfc.AddMemoryFont(weirdData2, _fontLength2); _centeredString.Alignment = StringAlignment.Center; _rightString.Alignment = StringAlignment.Far; _centeredStringLine.LineAlignment = StringAlignment.Center; _centeredStringLine.Alignment = StringAlignment.Center; } //EVENTS private async void MainWindow_Load(object sender, EventArgs e) { AutoUpdater.Start("https://dl.dropbox.com/s/3kv2pukqu6tj1r0/FModel.xml?dl=0"); SetTreeViewTheme(treeView1.Handle); _backupFileName = "\\FortniteGame_" + DateTime.Now.ToString("MMddyyyy") + ".txt"; // Copy user settings from previous application version if necessary if (Settings.Default.UpdateSettings) { Settings.Default.Upgrade(); Settings.Default.UpdateSettings = false; Settings.Default.Save(); } await Task.Run(() => { FillWithPaKs(); KeyCheck(); SetOutput(); SetFolderPermission(DefaultOutputPath); JohnWickCheck(); CreateDir(); SetScintillaStyle(); SetFont(); }); } private void MainWindow_FormClosing(object sender, FormClosingEventArgs e) { Environment.Exit(Environment.ExitCode); } private void differenceModeToolStripMenuItem_CheckedChanged(object sender, EventArgs e) { if (differenceModeToolStripMenuItem.Checked) { loadAllToolStripMenuItem.Text = @"Load Difference"; loadOneToolStripMenuItem.Enabled = false; updateModeToolStripMenuItem.Enabled = true; } if (differenceModeToolStripMenuItem.Checked == false) { loadAllToolStripMenuItem.Text = @"Load All PAKs"; loadOneToolStripMenuItem.Enabled = true; updateModeToolStripMenuItem.Enabled = false; if (updateModeToolStripMenuItem.Checked) updateModeToolStripMenuItem.Checked = false; } if (updateModeToolStripMenuItem.Checked == false && differenceModeToolStripMenuItem.Checked == false) { loadAllToolStripMenuItem.Text = @"Load All PAKs"; } } private void updateModeToolStripMenuItem_CheckedChanged(object sender, EventArgs e) { if (updateModeToolStripMenuItem.Checked) { loadAllToolStripMenuItem.Text = @"Load And Extract Difference"; var updateModeForm = new UpdateModeSettings(); if (Application.OpenForms[updateModeForm.Name] == null) { updateModeForm.Show(); } else { Application.OpenForms[updateModeForm.Name].Focus(); } } if (updateModeToolStripMenuItem.Checked == false) { loadAllToolStripMenuItem.Text = @"Load Difference"; } } private void scintilla1_KeyDown(object sender, KeyEventArgs e) { if (e.Control && e.KeyCode == Keys.F) { _myFindReplace.ShowFind(); e.SuppressKeyPress = true; } else if (e.Shift && e.KeyCode == Keys.F3) { _myFindReplace.Window.FindPrevious(); e.SuppressKeyPress = true; } else if (e.KeyCode == Keys.F3) { _myFindReplace.Window.FindNext(); e.SuppressKeyPress = true; } else if (e.Control && e.KeyCode == Keys.H) { _myFindReplace.ShowReplace(); e.SuppressKeyPress = true; } else if (e.Control && e.KeyCode == Keys.I) { _myFindReplace.ShowIncrementalSearch(); e.SuppressKeyPress = true; } else if (e.Control && e.KeyCode == Keys.G) { GoTo myGoTo = new GoTo((Scintilla)sender); myGoTo.ShowGoToDialog(); e.SuppressKeyPress = true; } } private void MyFindReplace_KeyPressed(object sender, KeyEventArgs e) { scintilla1_KeyDown(sender, e); } //FORMS private void settingsToolStripMenuItem_Click(object sender, EventArgs e) { var settingsForm = new Forms.Settings(); if (Application.OpenForms[settingsForm.Name] == null) { settingsForm.Show(); } else { Application.OpenForms[settingsForm.Name].Focus(); } } private void aboutFModelToolStripMenuItem_Click(object sender, EventArgs e) { var aboutForm = new About(); if (Application.OpenForms[aboutForm.Name] == null) { aboutForm.Show(); } else { Application.OpenForms[aboutForm.Name].Focus(); } } private void searchToolStripMenuItem_Click(object sender, EventArgs e) { var searchForm = new SearchFiles(); if (Application.OpenForms[searchForm.Name] == null) { searchForm.Show(); } else { Application.OpenForms[searchForm.Name].Focus(); } searchForm.FormClosing += (o, c) => { OpenMe(); }; } #endregion #region PAKLIST & FILL TREE //METHODS private string ReadPakGuid(string pakPath) { using (BinaryReader reader = new BinaryReader(File.Open(pakPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))) { reader.BaseStream.Seek(reader.BaseStream.Length - 61 - 160, SeekOrigin.Begin); uint g1 = reader.ReadUInt32(); reader.BaseStream.Seek(reader.BaseStream.Length - 57 - 160, SeekOrigin.Begin); uint g2 = reader.ReadUInt32(); reader.BaseStream.Seek(reader.BaseStream.Length - 53 - 160, SeekOrigin.Begin); uint g3 = reader.ReadUInt32(); reader.BaseStream.Seek(reader.BaseStream.Length - 49 - 160, SeekOrigin.Begin); uint g4 = reader.ReadUInt32(); var guid = g1 + "-" + g2 + "-" + g3 + "-" + g4; return guid; } } private void RegisterPaKsinDict(string[] allYourPaKs, ToolStripItemClickedEventArgs theSinglePak = null, bool loadAllPaKs = false) { for (int i = 0; i < allYourPaKs.Length; i++) { string arCurrentUsedPak = allYourPaKs[i]; //SET CURRENT PAK string arCurrentUsedPakGuid = ReadPakGuid(Settings.Default.PAKsPath + "\\" + arCurrentUsedPak); //SET CURRENT PAK GUID if (arCurrentUsedPakGuid == "0-0-0-0") //NO DYNAMIC PAK IN DICTIONARY { try { MyExtractor = new PakExtractor(Settings.Default.PAKsPath + "\\" + arCurrentUsedPak, Settings.Default.AESKey); } catch (Exception) { break; } if (MyExtractor.GetFileList() != null) { _paksMountPoint.Add(arCurrentUsedPak, MyExtractor.GetMountPoint().Substring(9)); if (loadAllPaKs) if (!File.Exists(DefaultOutputPath + "\\FortnitePAKs.txt")) File.Create(DefaultOutputPath + "\\FortnitePAKs.txt").Dispose(); string[] currentUsedPakLines = MyExtractor.GetFileList().ToArray(); for (int ii = 0; ii < currentUsedPakLines.Length; ii++) { currentUsedPakLines[ii] = MyExtractor.GetMountPoint().Substring(6) + currentUsedPakLines[ii]; string currentUsedPakFileName = currentUsedPakLines[ii].Substring(currentUsedPakLines[ii].LastIndexOf("/", StringComparison.Ordinal) + 1); if (currentUsedPakFileName.Contains(".uasset") || currentUsedPakFileName.Contains(".uexp") || currentUsedPakFileName.Contains(".ubulk")) { if (!AllpaksDictionary.ContainsKey(currentUsedPakFileName.Substring(0, currentUsedPakFileName.LastIndexOf(".", StringComparison.Ordinal)))) { AllpaksDictionary.Add(currentUsedPakFileName.Substring(0, currentUsedPakFileName.LastIndexOf(".", StringComparison.Ordinal)), arCurrentUsedPak); } } else { if (!AllpaksDictionary.ContainsKey(currentUsedPakFileName)) { AllpaksDictionary.Add(currentUsedPakFileName, arCurrentUsedPak); } } } if (loadAllPaKs) { UpdateConsole(".PAK mount point: " + MyExtractor.GetMountPoint().Substring(9), Color.FromArgb(255, 244, 132, 66), "Waiting"); File.AppendAllLines(DefaultOutputPath + "\\FortnitePAKs.txt", currentUsedPakLines); CurrentUsedPak = null; CurrentUsedPakGuid = null; } } } if (theSinglePak != null) { CurrentUsedPak = theSinglePak.ClickedItem.Text; CurrentUsedPakGuid = ReadPakGuid(Settings.Default.PAKsPath + "\\" + CurrentUsedPak); if (arCurrentUsedPak == theSinglePak.ClickedItem.Text && MyExtractor.GetFileList() != null) PakAsTxt = MyExtractor.GetFileList().ToArray(); } } if (theSinglePak != null && ReadPakGuid(Settings.Default.PAKsPath + "\\" + theSinglePak.ClickedItem.Text) != "0-0-0-0") //LOADING DYNAMIC PAK { CurrentUsedPak = theSinglePak.ClickedItem.Text; CurrentUsedPakGuid = ReadPakGuid(Settings.Default.PAKsPath + "\\" + CurrentUsedPak); try { MyExtractor = new PakExtractor(Settings.Default.PAKsPath + "\\" + theSinglePak.ClickedItem.Text, Settings.Default.AESKey); if (MyExtractor.GetFileList() != null) { _paksMountPoint.Add(theSinglePak.ClickedItem.Text, MyExtractor.GetMountPoint().Substring(9)); PakAsTxt = MyExtractor.GetFileList().ToArray(); } } catch (Exception) { UpdateConsole("Can't read " + theSinglePak.ClickedItem.Text + " with this key", Color.FromArgb(255, 244, 66, 66), "Error"); } } UpdateConsole("Building tree, please wait...", Color.FromArgb(255, 244, 132, 66), "Loading"); } private void TreeParsePath(TreeNodeCollection nodeList, string path) //https://social.msdn.microsoft.com/Forums/en-US/c75c1804-6933-40ba-b17a-0e36ae8bcbb5/how-to-create-a-tree-view-with-full-paths?forum=csharplanguage { TreeNode node; string folder; int p = path.IndexOf('/'); if (p == -1) { folder = path; path = ""; } else { folder = path.Substring(0, p); path = path.Substring(p + 1, path.Length - (p + 1)); } node = null; foreach (TreeNode item in nodeList) { if (item.Text == folder) { node = item; } } if (node == null) { node = new TreeNode(folder); Invoke(new Action(() => { nodeList.Add(node); })); } if (path != "") { TreeParsePath(node.Nodes, path); } } private void ComparePaKs() { PakAsTxt = File.ReadAllLines(DefaultOutputPath + "\\FortnitePAKs.txt"); File.Delete(DefaultOutputPath + "\\FortnitePAKs.txt"); //ASK DIFFERENCE FILE AND COMPARE OpenFileDialog theDialog = new OpenFileDialog(); theDialog.Title = @"Choose your Backup PAK File"; theDialog.InitialDirectory = DefaultOutputPath + "\\Backup"; theDialog.Multiselect = false; theDialog.Filter = @"TXT Files (*.txt)|*.txt|All Files (*.*)|*.*"; Invoke(new Action(() => { if (theDialog.ShowDialog() == DialogResult.OK) { String[] linesA = File.ReadAllLines(theDialog.FileName); for (int i = 0; i < linesA.Length; i++) if (!linesA[i].StartsWith("../")) linesA[i] = "../" + linesA[i]; IEnumerable onlyB = PakAsTxt.Except(linesA); IEnumerable removed = linesA.Except(PakAsTxt); File.WriteAllLines(DefaultOutputPath + "\\Result.txt", onlyB); File.WriteAllLines(DefaultOutputPath + "\\Removed.txt", removed); } })); //GET REMOVED FILES var removedTxt = File.ReadAllLines(DefaultOutputPath + "\\Removed.txt"); File.Delete(DefaultOutputPath + "\\Removed.txt"); List removedItems = new List(); for (int i = 0; i < removedTxt.Length; i++) { if (removedTxt[i].Contains("FortniteGame/Content/Athena/Items/Cosmetics/")) removedItems.Add(removedTxt[i].Substring(0, removedTxt[i].LastIndexOf(".", StringComparison.Ordinal))); } if (removedItems.Count != 0) { Invoke(new Action(() => { AppendText("Items Removed/Renamed:", Color.Red, true); removedItems = removedItems.Distinct().ToList(); for (int ii = 0; ii < removedItems.Count; ii++) AppendText(" - " + removedItems[ii], Color.Black, true); })); } PakAsTxt = File.ReadAllLines(DefaultOutputPath + "\\Result.txt"); File.Delete(DefaultOutputPath + "\\Result.txt"); } private void CreatePakList(ToolStripItemClickedEventArgs selectedPak = null, bool loadAllPaKs = false, bool getDiff = false, bool updateMode = false) { AllpaksDictionary = new Dictionary(); _diffToExtract = new Dictionary(); _paksMountPoint = new Dictionary(); Settings.Default.AESKey = AESKeyTextBox.Text.Substring(2).ToUpper(); Settings.Default.Save(); if (selectedPak != null) { UpdateConsole(Settings.Default.PAKsPath + "\\" + selectedPak.ClickedItem.Text, Color.FromArgb(255, 244, 132, 66), "Loading"); //ADD TO DICTIONNARY RegisterPaKsinDict(_paksArray, selectedPak); if (PakAsTxt != null) { Invoke(new Action(() => { treeView1.BeginUpdate(); for (int i = 0; i < PakAsTxt.Length; i++) { TreeParsePath(treeView1.Nodes, PakAsTxt[i].Replace(PakAsTxt[i].Split('/').Last(), "")); } treeView1.EndUpdate(); })); UpdateConsole(Settings.Default.PAKsPath + "\\" + selectedPak.ClickedItem.Text, Color.FromArgb(255, 66, 244, 66), "Success"); } else UpdateConsole("Can't read " + selectedPak.ClickedItem.Text + " with this key", Color.FromArgb(255, 244, 66, 66), "Error"); } if (loadAllPaKs) { //ADD TO DICTIONNARY RegisterPaKsinDict(_paksArray, null, true); if (!File.Exists(DefaultOutputPath + "\\FortnitePAKs.txt")) { UpdateConsole("Can't read .PAK files with this key", Color.FromArgb(255, 244, 66, 66), "Error"); } else { PakAsTxt = File.ReadAllLines(DefaultOutputPath + "\\FortnitePAKs.txt"); File.Delete(DefaultOutputPath + "\\FortnitePAKs.txt"); Invoke(new Action(() => { treeView1.BeginUpdate(); for (int i = 0; i < PakAsTxt.Length; i++) { TreeParsePath(treeView1.Nodes, PakAsTxt[i].Replace(PakAsTxt[i].Split('/').Last(), "")); } treeView1.EndUpdate(); })); UpdateConsole(Settings.Default.PAKsPath, Color.FromArgb(255, 66, 244, 66), "Success"); } } if (getDiff) { //ADD TO DICTIONNARY RegisterPaKsinDict(_paksArray, null, true); if (!File.Exists(DefaultOutputPath + "\\FortnitePAKs.txt")) { UpdateConsole("Can't read .PAK files with this key", Color.FromArgb(255, 244, 66, 66), "Error"); } else { UpdateConsole("Comparing files...", Color.FromArgb(255, 244, 132, 66), "Loading"); ComparePaKs(); if (updateMode) { UmFilter(PakAsTxt, _diffToExtract); UmWorking = true; } Invoke(new Action(() => { treeView1.BeginUpdate(); for (int i = 0; i < PakAsTxt.Length; i++) { TreeParsePath(treeView1.Nodes, PakAsTxt[i].Replace(PakAsTxt[i].Split('/').Last(), "")); } treeView1.EndUpdate(); })); UpdateConsole("Files compared", Color.FromArgb(255, 66, 244, 66), "Success"); } } } private void CreateBackupList(string[] allYourPaKs) { bool connection = IsInternetAvailable(); string url = "https://pastebin.com/raw/bbnhmjWN"; if (connection) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) using (Stream stream = response.GetResponseStream()) using (StreamReader reader = new StreamReader(stream ?? throw new InvalidOperationException())) { _backupDynamicKeys = reader.ReadToEnd(); } } Settings.Default.AESKey = AESKeyTextBox.Text.Substring(2).ToUpper(); Settings.Default.Save(); for (int i = 0; i < allYourPaKs.Length; i++) { string arCurrentUsedPak = allYourPaKs[i]; //SET CURRENT PAK string arCurrentUsedPakGuid = ReadPakGuid(Settings.Default.PAKsPath + "\\" + arCurrentUsedPak); //SET CURRENT PAK GUID if (arCurrentUsedPakGuid == "0-0-0-0") //NO DYNAMIC PAK { try { MyExtractor = new PakExtractor(Settings.Default.PAKsPath + "\\" + arCurrentUsedPak, Settings.Default.AESKey); } catch (Exception) { break; } if (MyExtractor.GetFileList() != null) { if (!File.Exists(DefaultOutputPath + "\\Backup" + _backupFileName)) File.Create(DefaultOutputPath + "\\Backup" + _backupFileName).Dispose(); string[] currentUsedPakLines = MyExtractor.GetFileList().ToArray(); for (int ii = 0; ii < currentUsedPakLines.Length; ii++) { currentUsedPakLines[ii] = MyExtractor.GetMountPoint().Substring(6) + currentUsedPakLines[ii]; } UpdateConsole(".PAK mount point: " + MyExtractor.GetMountPoint().Substring(9), Color.FromArgb(255, 244, 132, 66), "Waiting"); File.AppendAllLines(DefaultOutputPath + "\\Backup" + _backupFileName, currentUsedPakLines); } } else { foreach (var myString in _backupDynamicKeys.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)) { var parts = myString.Split(':'); if (parts[0] == arCurrentUsedPak && parts[1].StartsWith("0x")) { try { MyExtractor = new PakExtractor(Settings.Default.PAKsPath + "\\" + arCurrentUsedPak, parts[1].Substring(2)); } catch (Exception) { continue; } if (MyExtractor.GetFileList() != null) { if (!File.Exists(DefaultOutputPath + "\\Backup" + _backupFileName)) File.Create(DefaultOutputPath + "\\Backup" + _backupFileName).Dispose(); string[] currentUsedPakLines = MyExtractor.GetFileList().ToArray(); for (int ii = 0; ii < currentUsedPakLines.Length; ii++) { currentUsedPakLines[ii] = MyExtractor.GetMountPoint().Substring(6) + currentUsedPakLines[ii]; } UpdateConsole(arCurrentUsedPak, Color.FromArgb(255, 244, 132, 66), "Waiting"); File.AppendAllLines(DefaultOutputPath + "\\Backup" + _backupFileName, currentUsedPakLines); } } else if (parts[0] == arCurrentUsedPak && parts[1] == "undefined") { AppendText("No key found for ", Color.Black); AppendText(arCurrentUsedPak, Color.DarkRed, true); //TODO: BETTER VERSION KTHX /*string promptValue = Prompt.ShowDialog("AES Key:", arCurrentUsedPak); if (!string.IsNullOrEmpty(promptValue)) { JwpmProcess("filelist \"" + Settings.Default.PAKsPath + "\\" + arCurrentUsedPak + "\" \"" + DefaultOutputPath + "\" " + promptValue.Substring(2)); if (File.Exists(DefaultOutputPath + "\\" + arCurrentUsedPak + ".txt")) { if (!File.Exists(DefaultOutputPath + "\\Backup" + _backupFileName)) File.Create(DefaultOutputPath + "\\Backup" + _backupFileName).Dispose(); string[] currentUsedPakLines = File.ReadAllLines(DefaultOutputPath + "\\" + arCurrentUsedPak + ".txt"); for (int ii = 0; ii < currentUsedPakLines.Length; ii++) { currentUsedPakLines[ii] = "FortniteGame/" + currentUsedPakLines[ii]; } UpdateConsole(".PAK mount point: \"/FortniteGame/\"", Color.FromArgb(255, 244, 132, 66), "Waiting"); File.AppendAllLines(DefaultOutputPath + "\\Backup" + _backupFileName, currentUsedPakLines); File.Delete(DefaultOutputPath + "\\" + arCurrentUsedPak + ".txt"); } }*/ } } } } if (File.Exists(DefaultOutputPath + "\\Backup" + _backupFileName)) UpdateConsole("\\Backup" + _backupFileName + " successfully created", Color.FromArgb(255, 66, 244, 66), "Success"); else UpdateConsole("Can't create " + _backupFileName.Substring(1), Color.FromArgb(255, 244, 66, 66), "Error"); } private void UpdateModeExtractSave() { CreatePakList(null, false, true, true); _questStageDict = new Dictionary(); Invoke(new Action(() => { ExtractButton.Enabled = false; OpenImageButton.Enabled = false; StopButton.Enabled = true; })); if (backgroundWorker2.IsBusy != true) { backgroundWorker2.RunWorkerAsync(); } } private void UmFilter(String[] theFile, Dictionary diffToExtract) { List searchResults = new List(); if (Settings.Default.UMCosmetics) searchResults.Add("Athena/Items/Cosmetics/"); if (Settings.Default.UMVariants) searchResults.Add("Athena/Items/CosmeticVariantTokens/"); if (Settings.Default.UMConsumablesWeapons) { searchResults.Add("AGID_"); searchResults.Add("WID_"); } if (Settings.Default.UMTraps) searchResults.Add("Athena/Items/Traps/"); if (Settings.Default.UMChallenges) searchResults.Add("Athena/Items/ChallengeBundles/"); if (Settings.Default.UMTCosmeticsVariants) { searchResults.Add("UI/Foundation/Textures/Icons/Backpacks/"); searchResults.Add("UI/Foundation/Textures/Icons/Emotes/"); searchResults.Add("UI/Foundation/Textures/Icons/Heroes/Athena/Soldier/"); searchResults.Add("UI/Foundation/Textures/Icons/Heroes/Variants/"); searchResults.Add("UI/Foundation/Textures/Icons/Skydiving/"); searchResults.Add("UI/Foundation/Textures/Icons/Pets/"); searchResults.Add("UI/Foundation/Textures/Icons/Wraps/"); } if (Settings.Default.UMTLoading) { searchResults.Add("FortniteGame/Content/2dAssets/Loadingscreens/"); searchResults.Add("UI/Foundation/Textures/LoadingScreens/"); } if (Settings.Default.UMTWeapons) searchResults.Add("UI/Foundation/Textures/Icons/Weapons/Items/"); if (Settings.Default.UMTBanners) { searchResults.Add("FortniteGame/Content/2dAssets/Banners/"); searchResults.Add("UI/Foundation/Textures/Banner/"); searchResults.Add("FortniteGame/Content/2dAssets/Sprays/"); searchResults.Add("FortniteGame/Content/2dAssets/Emoji/"); searchResults.Add("FortniteGame/Content/2dAssets/Music/"); searchResults.Add("FortniteGame/Content/2dAssets/Toys/"); } if (Settings.Default.UMTFeaturedIMGs) searchResults.Add("UI/Foundation/Textures/BattleRoyale/"); if (Settings.Default.UMTAthena) searchResults.Add("UI/Foundation/Textures/Icons/Athena/"); if (Settings.Default.UMTAthena) searchResults.Add("UI/Foundation/Textures/Icons/Athena/"); if (Settings.Default.UMTDevices) searchResults.Add("UI/Foundation/Textures/Icons/Devices/"); if (Settings.Default.UMTVehicles) searchResults.Add("UI/Foundation/Textures/Icons/Vehicles/"); for (int i = 0; i < theFile.Length; i++) { bool b = searchResults.Any(s => theFile[i].Contains(s)); if (b) { string filename = theFile[i].Substring(theFile[i].LastIndexOf("/", StringComparison.Ordinal) + 1); if (filename.Contains(".uasset") || filename.Contains(".uexp") || filename.Contains(".ubulk")) { if (!diffToExtract.ContainsKey(filename.Substring(0, filename.LastIndexOf(".", StringComparison.Ordinal)))) diffToExtract.Add(filename.Substring(0, filename.LastIndexOf(".", StringComparison.Ordinal)), theFile[i]); } } } } //EVENTS private async void loadOneToolStripMenuItem_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e) { await Task.Run(() => { Invoke(new Action(() => { scintilla1.Text = ""; pictureBox1.Image = null; treeView1.Nodes.Clear(); //SMH HERE IT DOESN'T LAG listBox1.Items.Clear(); })); CreatePakList(e); }); } private async void loadAllToolStripMenuItem_Click(object sender, EventArgs e) { Invoke(new Action(() => { scintilla1.Text = ""; pictureBox1.Image = null; treeView1.Nodes.Clear(); //SMH HERE IT DOESN'T LAG listBox1.Items.Clear(); })); if (differenceModeToolStripMenuItem.Checked == false) { await Task.Run(() => { CreatePakList(null, true); }); } if (differenceModeToolStripMenuItem.Checked && updateModeToolStripMenuItem.Checked == false) { await Task.Run(() => { CreatePakList(null, false, true); }); } if (differenceModeToolStripMenuItem.Checked && updateModeToolStripMenuItem.Checked) { await Task.Run(() => { UpdateModeExtractSave(); }); } } private async void backupPAKsToolStripMenuItem_Click(object sender, EventArgs e) { await Task.Run(() => { CreateBackupList(_paksArray); }); } //UPDATE MODE private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e) { StopWatch = new Stopwatch(); StopWatch.Start(); CreateDir(); ExtractAndSerializeItems(e, true); } private void backgroundWorker2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { StopWatch.Stop(); if (e.Cancelled) { UpdateConsole("Canceled!", Color.FromArgb(255, 244, 66, 66), "Error"); } else if (e.Error != null) { UpdateConsole(e.Error.Message, Color.FromArgb(255, 244, 66, 66), "Error"); } else if (UmWorking == false) { UpdateConsole("Can't read .PAK files with this key", Color.FromArgb(255, 244, 66, 66), "Error"); } else { TimeSpan ts = StopWatch.Elapsed; string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10); UpdateConsole("Time elapsed: " + elapsedTime, Color.FromArgb(255, 66, 244, 66), "Success"); } SelectedItemsArray = null; UmWorking = false; Invoke(new Action(() => { updateModeToolStripMenuItem.Checked = false; StopButton.Enabled = false; OpenImageButton.Enabled = true; ExtractButton.Enabled = true; })); } #endregion #region FILL LISTBOX & FILTER //METHODS public static IEnumerable GetAncestors(TItem item, Func getParentFunc) { if (getParentFunc == null) { throw new ArgumentNullException("getParentFunc"); } if (ReferenceEquals(item, null)) yield break; for (TItem curItem = getParentFunc(item); !ReferenceEquals(curItem, null); curItem = getParentFunc(curItem)) { yield return curItem; } } private void GetFilesAndFill(TreeNodeMouseClickEventArgs selectedNode) { List itemsNotToDisplay = new List(); _itemsToDisplay = new List(); Invoke(new Action(() => { listBox1.Items.Clear(); FilterTextBox.Text = string.Empty; })); var all = GetAncestors(selectedNode.Node, x => x.Parent).ToList(); all.Reverse(); var full = string.Join("/", all.Select(x => x.Text)) + "/" + selectedNode.Node.Text + "/"; if (string.IsNullOrEmpty(full)) { return; } var dirfiles = PakAsTxt.Where(x => x.StartsWith(full) && !x.Replace(full, "").Contains("/")); var enumerable = dirfiles as string[] ?? dirfiles.ToArray(); if (!enumerable.Any()) { return; } foreach (var i in enumerable) { string v; if (i.Contains(".uasset") || i.Contains(".uexp") || i.Contains(".ubulk")) { v = i.Substring(0, i.LastIndexOf('.')); } else { v = i.Replace(full, ""); } itemsNotToDisplay.Add(v.Replace(full, "")); } _itemsToDisplay = itemsNotToDisplay.Distinct().ToList(); //NO DUPLICATION + NO EXTENSION = EASY TO FIND WHAT WE WANT Invoke(new Action(() => { for (int i = 0; i < _itemsToDisplay.Count; i++) { listBox1.Items.Add(_itemsToDisplay[i]); } ExtractButton.Enabled = listBox1.SelectedIndex >= 0; //DISABLE EXTRACT BUTTON IF NOTHING IS SELECTED IN LISTBOX })); } public static bool CaseInsensitiveContains(string text, string value, StringComparison stringComparison = StringComparison.CurrentCultureIgnoreCase) { return text.IndexOf(value, stringComparison) >= 0; } //FILTER INSENSITIVE private void FilterItems() { if (listBox1.InvokeRequired) { listBox1.Invoke(new Action(FilterItems)); return; } listBox1.BeginUpdate(); listBox1.Items.Clear(); if (_itemsToDisplay != null) { if (!string.IsNullOrEmpty(FilterTextBox.Text)) { for (int i = 0; i < _itemsToDisplay.Count; i++) { if (CaseInsensitiveContains(_itemsToDisplay[i], FilterTextBox.Text)) { listBox1.Items.Add(_itemsToDisplay[i]); } } } else { for (int i = 0; i < _itemsToDisplay.Count; i++) { listBox1.Items.Add(_itemsToDisplay[i]); } } } listBox1.EndUpdate(); } public async void ExpandMyLitleBoys(TreeNode node, List path) { path.RemoveAt(0); node.Expand(); if (path.Count == 0) return; if (path.Count == 1) { treeView1.SelectedNode = node; await Task.Run(() => { List itemsNotToDisplay = new List(); _itemsToDisplay = new List(); Invoke(new Action(() => { listBox1.Items.Clear(); FilterTextBox.Text = string.Empty; })); var all = GetAncestors(node, x => x.Parent).ToList(); all.Reverse(); var full = string.Join("/", all.Select(x => x.Text)) + "/" + node.Text + "/"; if (string.IsNullOrEmpty(full)) { return; } var dirfiles = PakAsTxt.Where(x => x.StartsWith(full) && !x.Replace(full, "").Contains("/")); var enumerable = dirfiles as string[] ?? dirfiles.ToArray(); if (!enumerable.Any()) { return; } foreach (var i in enumerable) { string v; if (i.Contains(".uasset") || i.Contains(".uexp") || i.Contains(".ubulk")) { v = i.Substring(0, i.LastIndexOf('.')); } else { v = i.Replace(full, ""); } itemsNotToDisplay.Add(v.Replace(full, "")); } _itemsToDisplay = itemsNotToDisplay.Distinct().ToList(); //NO DUPLICATION + NO EXTENSION = EASY TO FIND WHAT WE WANT Invoke(new Action(() => { for (int i = 0; i < _itemsToDisplay.Count; i++) { listBox1.Items.Add(_itemsToDisplay[i]); } ExtractButton.Enabled = listBox1.SelectedIndex >= 0; //DISABLE EXTRACT BUTTON IF NOTHING IS SELECTED IN LISTBOX })); }); for (int i = 0; i < listBox1.Items.Count; i++) { if (listBox1.Items[i].ToString() == SearchFiles.SfPath.Substring(SearchFiles.SfPath.LastIndexOf("/", StringComparison.Ordinal) + 1)) { listBox1.SelectedItem = listBox1.Items[i]; } } } foreach (TreeNode mynode in node.Nodes) if (mynode.Text == path[0]) { ExpandMyLitleBoys(mynode, path); //recursive call break; } } public void OpenMe() { if (SearchFiles.IsClosed) { treeView1.CollapseAll(); var pathList = SearchFiles.SfPath.Split('/').ToList(); foreach (TreeNode node in treeView1.Nodes) if (node.Text == pathList[0]) ExpandMyLitleBoys(node, pathList); } } //EVENTS private async void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { await Task.Run(() => { GetFilesAndFill(e); }); } private async void FilterTextBox_TextChanged(object sender, EventArgs e) { await Task.Run(() => { FilterItems(); }); } private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { if (listBox1.SelectedItem != null && SelectedItemsArray == null) { ExtractButton.Enabled = true; } } #endregion #region EXTRACT BUTTON //METHODS public static string ExtractAsset(string currentPak, string currentItem) { string toReturn = string.Empty; MyExtractor = new PakExtractor(Settings.Default.PAKsPath + "\\" + currentPak, Settings.Default.AESKey); string[] myArray = MyExtractor.GetFileList().ToArray(); string[] results; if (currentItem.Contains(".")) results = Array.FindAll(myArray, s => s.Contains("/" + currentItem)); else results = Array.FindAll(myArray, s => s.Contains("/" + currentItem + ".")); for (int i = 0; i < results.Length; i++) { int index = Array.IndexOf(myArray, results[i]); uint y = (uint)index; byte[] b = MyExtractor.GetData(y); if (CurrentUsedPakGuid != null && CurrentUsedPakGuid != "0-0-0-0") { Directory.CreateDirectory(DefaultOutputPath + "\\Extracted\\" + _paksMountPoint[CurrentUsedPak] + results[i].Substring(0, results[i].LastIndexOf("/", StringComparison.Ordinal))); File.WriteAllBytes(DefaultOutputPath + "\\Extracted\\" + _paksMountPoint[CurrentUsedPak] + results[i], b); toReturn = DefaultOutputPath + "\\Extracted\\" + _paksMountPoint[CurrentUsedPak] + results[i]; } else { Directory.CreateDirectory(DefaultOutputPath + "\\Extracted\\" + _paksMountPoint[AllpaksDictionary[currentItem]] + results[i].Substring(0, results[i].LastIndexOf("/", StringComparison.Ordinal))); File.WriteAllBytes(DefaultOutputPath + "\\Extracted\\" + _paksMountPoint[AllpaksDictionary[currentItem]] + results[i], b); toReturn = DefaultOutputPath + "\\Extracted\\" + _paksMountPoint[AllpaksDictionary[currentItem]] + results[i]; } } return toReturn.Replace("/", "\\"); } private void ExtractAndSerializeItems(DoWorkEventArgs e, bool updateMode = false) { if (updateMode == false) { //REGISTER SELECTED ITEMS Invoke(new Action(() => { SelectedItemsArray = new string[listBox1.SelectedItems.Count]; for (int i = 0; i < listBox1.SelectedItems.Count; i++) //ADD SELECTED ITEM TO ARRAY { SelectedItemsArray[i] = listBox1.SelectedItems[i].ToString(); } })); } else { //REGISTER SELECTED ITEMS Invoke(new Action(() => { SelectedItemsArray = new string[_diffToExtract.Count]; for (int i = 0; i < _diffToExtract.Count; i++) //ADD DICT ITEM TO ARRAY { SelectedItemsArray[i] = _diffToExtract.Keys.ElementAt(i); } })); } //DO WORK for (int i = 0; i < SelectedItemsArray.Length; i++) { if (backgroundWorker1.CancellationPending && backgroundWorker1.IsBusy) { e.Cancel = true; return; } if (backgroundWorker2.CancellationPending && backgroundWorker2.IsBusy) { e.Cancel = true; return; } CurrentUsedItem = SelectedItemsArray[i]; if (CurrentUsedPakGuid != null && CurrentUsedPakGuid != "0-0-0-0") ExtractedFilePath = ExtractAsset(CurrentUsedPak, CurrentUsedItem); else ExtractedFilePath = ExtractAsset(AllpaksDictionary[CurrentUsedItem], CurrentUsedItem); if (ExtractedFilePath != null) { UpdateConsole(CurrentUsedItem + " successfully extracted", Color.FromArgb(255, 66, 244, 66), "Success"); if (ExtractedFilePath.Contains(".uasset") || ExtractedFilePath.Contains(".uexp") || ExtractedFilePath.Contains(".ubulk")) { MyAsset = new PakAsset(ExtractedFilePath.Substring(0, ExtractedFilePath.LastIndexOf('.'))); JsonParseFile(); } if (ExtractedFilePath.Contains(".ufont")) ConvertToTtf(ExtractedFilePath); if (ExtractedFilePath.Contains(".ini")) { Invoke(new Action(() => { scintilla1.Text = File.ReadAllText(ExtractedFilePath); })); } } else UpdateConsole("Error while extracting " + CurrentUsedItem, Color.FromArgb(255, 244, 66, 66), "Error"); } } private void JsonParseFile() { if (MyAsset.GetSerialized() != null) { UpdateConsole(CurrentUsedItem + " successfully serialized", Color.FromArgb(255, 66, 244, 66), "Success"); Invoke(new Action(() => { try { scintilla1.Text = JToken.Parse(MyAsset.GetSerialized()).ToString(); } catch (JsonReaderException) { AppendText(CurrentUsedItem + " ", Color.Red); AppendText(".JSON file can't be displayed", Color.Black, true); } })); NavigateThroughJson(MyAsset, ExtractedFilePath); } else UpdateConsole("No serialized file found", Color.FromArgb(255, 244, 66, 66), "Error"); } private void NavigateThroughJson(PakAsset theAsset, string questJson = null) { try { string parsedJson = JToken.Parse(theAsset.GetSerialized()).ToString(); var itemId = ItemsIdParser.FromJson(parsedJson); UpdateConsole("Parsing " + CurrentUsedItem + "...", Color.FromArgb(255, 244, 132, 66), "Waiting"); for (int i = 0; i < itemId.Length; i++) { if (Settings.Default.createIconForCosmetics && (itemId[i].ExportType.Contains("Athena") && itemId[i].ExportType.Contains("Item") && itemId[i].ExportType.Contains("Definition"))) CreateItemIcon(itemId[i], "athIteDef"); else if (Settings.Default.createIconForConsumablesWeapons && (itemId[i].ExportType == "FortWeaponRangedItemDefinition" || itemId[i].ExportType == "FortWeaponMeleeItemDefinition")) CreateItemIcon(itemId[i], "consAndWeap"); else if (Settings.Default.createIconForTraps && (itemId[i].ExportType == "FortTrapItemDefinition" || itemId[i].ExportType == "FortContextTrapItemDefinition")) CreateItemIcon(itemId[i]); else if (Settings.Default.createIconForVariants && (itemId[i].ExportType == "FortVariantTokenType")) CreateItemIcon(itemId[i], "variant"); else if (Settings.Default.createIconForAmmo && (itemId[i].ExportType == "FortAmmoItemDefinition")) CreateItemIcon(itemId[i], "ammo"); else if (questJson != null && (Settings.Default.createIconForSTWHeroes && (itemId[i].ExportType == "FortHeroType" && (questJson.Contains("ItemDefinition") || questJson.Contains("TestDefsSkydive") || questJson.Contains("GameplayPrototypes"))))) //Contains x not to trigger HID from BR CreateItemIcon(itemId[i], "stwHeroes"); else if (Settings.Default.createIconForSTWDefenders && (itemId[i].ExportType == "FortDefenderItemDefinition")) CreateItemIcon(itemId[i], "stwDefenders"); else if (Settings.Default.createIconForSTWCardPacks && (itemId[i].ExportType == "FortCardPackItemDefinition")) CreateItemIcon(itemId[i]); else if (itemId[i].ExportType == "FortChallengeBundleItemDefinition") CreateChallengesIcon(itemId[i], parsedJson, questJson); else if (itemId[i].ExportType == "Texture2D") ConvertTexture2D(); else if (itemId[i].ExportType == "SoundWave") ConvertSoundWave(); else UpdateConsole(CurrentUsedItem + " successfully extracted", Color.FromArgb(255, 66, 244, 66), "Success"); } } catch (Exception ex) { Console.WriteLine(ex.Message); } } private void CreateItemIcon(ItemsIdParser theItem, string specialMode = null) { UpdateConsole(CurrentUsedItem + " is a Cosmetic ID", Color.FromArgb(255, 66, 244, 66), "Success"); Bitmap bmp = new Bitmap(522, 522); Graphics g = Graphics.FromImage(bmp); g.TextRenderingHint = TextRenderingHint.AntiAlias; Rarity.DrawRarity(theItem, g, specialMode); ItemIconPath = string.Empty; if (Settings.Default.loadFeaturedImage == false) { GetItemIcon(theItem); } if (Settings.Default.loadFeaturedImage) { GetItemIcon(theItem, true); } #region DRAW ICON if (File.Exists(ItemIconPath)) { Image itemIcon; using (var bmpTemp = new Bitmap(ItemIconPath)) { itemIcon = new Bitmap(bmpTemp); } g.DrawImage(Forms.Settings.ResizeImage(itemIcon, 512, 512), new Point(5, 5)); } else { Image itemIcon = Resources.unknown512; g.DrawImage(itemIcon, new Point(0, 0)); } #endregion #region WATERMARK if (UmWorking == false && (Settings.Default.isWatermark && !string.IsNullOrEmpty(Settings.Default.wFilename))) { Image watermark = Image.FromFile(Settings.Default.wFilename); var opacityImage = SetImageOpacity(watermark, (float)Settings.Default.wOpacity / 100); g.DrawImage(Forms.Settings.ResizeImage(opacityImage, Settings.Default.wSize, Settings.Default.wSize), (522 - Settings.Default.wSize) / 2, (522 - Settings.Default.wSize) / 2, Settings.Default.wSize, Settings.Default.wSize); } if (UmWorking && (Settings.Default.UMWatermark && !string.IsNullOrEmpty(Settings.Default.UMFilename))) { Image watermark = Image.FromFile(Settings.Default.UMFilename); var opacityImage = SetImageOpacity(watermark, (float)Settings.Default.UMOpacity / 100); g.DrawImage(Forms.Settings.ResizeImage(opacityImage, Settings.Default.UMSize, Settings.Default.UMSize), (522 - Settings.Default.UMSize) / 2, (522 - Settings.Default.UMSize) / 2, Settings.Default.UMSize, Settings.Default.UMSize); } #endregion Image bg512 = Resources.BG512; g.DrawImage(bg512, new Point(5, 383)); #region DRAW TEXT try { g.DrawString(theItem.DisplayName, new Font(_pfc.Families[0], 35), new SolidBrush(Color.White), new Point(522 / 2, 395), _centeredString); } catch (NullReferenceException) { AppendText(CurrentUsedItem + " ", Color.Red); AppendText("No ", Color.Black); AppendText("DisplayName ", Color.SteelBlue); AppendText("found", Color.Black, true); } //NAME try { g.DrawString(theItem.Description, new Font("Arial", 10), new SolidBrush(Color.White), new RectangleF(5, 441, 512, 49), _centeredStringLine); } catch (NullReferenceException) { AppendText(CurrentUsedItem + " ", Color.Red); AppendText("No ", Color.Black); AppendText("Description ", Color.SteelBlue); AppendText("found", Color.Black, true); } //DESCRIPTION if (specialMode == "athIteDef") { try { g.DrawString(theItem.ShortDescription, new Font(_pfc.Families[0], 13), new SolidBrush(Color.White), new Point(5, 500)); } catch (NullReferenceException) { AppendText(CurrentUsedItem + " ", Color.Red); AppendText("No ", Color.Black); AppendText("ShortDescription ", Color.SteelBlue); AppendText("found", Color.Black, true); } //TYPE try { g.DrawString(theItem.GameplayTags.GameplayTagsGameplayTags[Array.FindIndex(theItem.GameplayTags.GameplayTagsGameplayTags, x => x.StartsWith("Cosmetics.Source."))].Substring(17), new Font(_pfc.Families[0], 13), new SolidBrush(Color.White), new Point(522 - 5, 500), _rightString); } catch (NullReferenceException) { AppendText(CurrentUsedItem + " ", Color.Red); AppendText("No ", Color.Black); AppendText("GameplayTags ", Color.SteelBlue); AppendText("found", Color.Black, true); } catch (IndexOutOfRangeException) { AppendText(CurrentUsedItem + " ", Color.Red); AppendText("No ", Color.Black); AppendText("GameplayTags ", Color.SteelBlue); AppendText("as ", Color.Black); AppendText("Cosmetics.Source ", Color.SteelBlue); AppendText("found", Color.Black, true); } //COSMETIC SOURCE } if (specialMode == "consAndWeap") { try { g.DrawString(theItem.GameplayTags.GameplayTagsGameplayTags[Array.FindIndex(theItem.GameplayTags.GameplayTagsGameplayTags, x => x.StartsWith("Athena.ItemAction."))].Substring(18), new Font(_pfc.Families[0], 13), new SolidBrush(Color.White), new Point(522 - 5, 500), _rightString); } catch (NullReferenceException) { AppendText(CurrentUsedItem + " ", Color.Red); AppendText("No ", Color.Black); AppendText("GameplayTags ", Color.SteelBlue); AppendText("found", Color.Black, true); } catch (IndexOutOfRangeException) { try { g.DrawString(theItem.GameplayTags.GameplayTagsGameplayTags[Array.FindIndex(theItem.GameplayTags.GameplayTagsGameplayTags, x => x.StartsWith("Weapon."))].Substring(7), new Font(_pfc.Families[0], 13), new SolidBrush(Color.White), new Point(522 - 5, 500), _rightString); } catch (NullReferenceException) { AppendText(CurrentUsedItem + " ", Color.Red); AppendText("No ", Color.Black); AppendText("GameplayTags ", Color.SteelBlue); AppendText("found", Color.Black, true); } catch (IndexOutOfRangeException) { AppendText(CurrentUsedItem + " ", Color.Red); AppendText("No ", Color.Black); AppendText("GameplayTags ", Color.SteelBlue); AppendText("as ", Color.Black); AppendText("Athena.ItemAction ", Color.SteelBlue); AppendText("or ", Color.Black); AppendText("Weapon ", Color.SteelBlue); AppendText("found", Color.Black, true); } } //ACTION if (theItem.AmmoData != null && theItem.AmmoData.AssetPathName.Contains("Ammo")) //TO AVOID TRIGGERING CONSUMABLES, NAME SHOULD CONTAIN "AMMO" { GetAmmoData(theItem.AmmoData.AssetPathName, g); } } if (specialMode == "variant") { try { g.DrawString(theItem.ShortDescription, new Font(_pfc.Families[0], 13), new SolidBrush(Color.White), new Point(5, 500)); } catch (NullReferenceException) { AppendText(CurrentUsedItem + " ", Color.Red); AppendText("No ", Color.Black); AppendText("ShortDescription ", Color.SteelBlue); AppendText("found", Color.Black, true); } //TYPE try { g.DrawString(theItem.CosmeticItem, new Font(_pfc.Families[0], 13), new SolidBrush(Color.White), new Point(522 - 5, 500), _rightString); } catch (NullReferenceException) { AppendText(CurrentUsedItem + " ", Color.Red); AppendText("No ", Color.Black); AppendText("Cosmetic Item ", Color.SteelBlue); AppendText("found", Color.Black, true); } //COSMETIC ITEM } try { if (theItem.GameplayTags.GameplayTagsGameplayTags[Array.FindIndex(theItem.GameplayTags.GameplayTagsGameplayTags, x => x.StartsWith("Cosmetics.UserFacingFlags."))].Contains("Animated")) { Image animatedLogo = Resources.T_Icon_Animated_64; g.DrawImage(Forms.Settings.ResizeImage(animatedLogo, 32, 32), new Point(6, -2)); } else if (theItem.GameplayTags.GameplayTagsGameplayTags[Array.FindIndex(theItem.GameplayTags.GameplayTagsGameplayTags, x => x.StartsWith("Cosmetics.UserFacingFlags."))].Contains("HasUpgradeQuests") && theItem.ExportType != "AthenaPetCarrierItemDefinition") { Image questLogo = Resources.T_Icon_Quests_64; g.DrawImage(Forms.Settings.ResizeImage(questLogo, 32, 32), new Point(6, 6)); } else if (theItem.GameplayTags.GameplayTagsGameplayTags[Array.FindIndex(theItem.GameplayTags.GameplayTagsGameplayTags, x => x.StartsWith("Cosmetics.UserFacingFlags."))].Contains("HasUpgradeQuests") && theItem.ExportType == "AthenaPetCarrierItemDefinition") { Image petLogo = Resources.T_Icon_Pets_64; g.DrawImage(Forms.Settings.ResizeImage(petLogo, 32, 32), new Point(6, 6)); } else if (theItem.GameplayTags.GameplayTagsGameplayTags[Array.FindIndex(theItem.GameplayTags.GameplayTagsGameplayTags, x => x.StartsWith("Cosmetics.UserFacingFlags."))].Contains("HasVariants")) { Image variantsLogo = Resources.T_Icon_Variant_64; g.DrawImage(Forms.Settings.ResizeImage(variantsLogo, 32, 32), new Point(6, 6)); } else if (theItem.GameplayTags.GameplayTagsGameplayTags[Array.FindIndex(theItem.GameplayTags.GameplayTagsGameplayTags, x => x.StartsWith("Cosmetics.UserFacingFlags."))].Contains("Reactive")) { Image reactiveLogo = Resources.T_Icon_Adaptive_64; g.DrawImage(Forms.Settings.ResizeImage(reactiveLogo, 32, 32), new Point(7, 7)); } else if (theItem.GameplayTags.GameplayTagsGameplayTags[Array.FindIndex(theItem.GameplayTags.GameplayTagsGameplayTags, x => x.StartsWith("Cosmetics.UserFacingFlags."))].Contains("Traversal")) { Image traversalLogo = Resources.T_Icon_Traversal_64; g.DrawImage(Forms.Settings.ResizeImage(traversalLogo, 32, 32), new Point(6, 3)); } } catch (Exception) { } //COSMETIC USER FACING FLAGS if (specialMode == "stwHeroes") { try { g.DrawString(theItem.AttributeInitKey.AttributeInitCategory, new Font(_pfc.Families[0], 13), new SolidBrush(Color.White), new Point(522 - 5, 500), _rightString); } catch (NullReferenceException) { AppendText(CurrentUsedItem + " ", Color.Red); AppendText("No ", Color.Black); AppendText("AttributeInitCategory ", Color.SteelBlue); AppendText("found", Color.Black, true); } //CHARACTER TYPE } if (specialMode == "stwDefenders") { try { g.DrawString(theItem.GameplayTags.GameplayTagsGameplayTags[Array.FindIndex(theItem.GameplayTags.GameplayTagsGameplayTags, x => x.StartsWith("NPC.CharacterType.Survivor.Defender."))].Substring(36), new Font(_pfc.Families[0], 13), new SolidBrush(Color.White), new Point(522 - 5, 500), _rightString); } catch (NullReferenceException) { AppendText(CurrentUsedItem + " ", Color.Red); AppendText("No ", Color.Black); AppendText("GameplayTags ", Color.SteelBlue); AppendText("found", Color.Black, true); } catch (IndexOutOfRangeException) { AppendText(CurrentUsedItem + " ", Color.Red); AppendText("No ", Color.Black); AppendText("GameplayTags ", Color.SteelBlue); AppendText("as ", Color.Black); AppendText("NPC.CharacterType.Survivor.Defender ", Color.SteelBlue); AppendText("found", Color.Black, true); } //CHARACTER TYPE } #endregion pictureBox1.Image = bmp; UpdateConsole(theItem.DisplayName, Color.FromArgb(255, 66, 244, 66), "Success"); if (autoSaveImagesToolStripMenuItem.Checked || updateModeToolStripMenuItem.Checked) { Invoke(new Action(() => { pictureBox1.Image.Save(DefaultOutputPath + "\\Icons\\" + CurrentUsedItem + ".png", ImageFormat.Png); })); AppendText(CurrentUsedItem, Color.DarkRed); AppendText(" successfully saved", Color.Black, true); } } private void GetItemIcon(ItemsIdParser theItem, bool featured = false) { if (featured == false) { WasFeatured = false; SearchAthIteDefIcon(theItem); } if (featured) { if (theItem.DisplayAssetPath != null && theItem.DisplayAssetPath.AssetPathName.Contains("/Game/Catalog/DisplayAssets/") && theItem.ExportType != "AthenaItemWrapDefinition") { string catalogName = theItem.DisplayAssetPath.AssetPathName; SearchFeaturedCharacterIcon(theItem, catalogName); } else if (theItem.DisplayAssetPath == null && theItem.ExportType != "AthenaItemWrapDefinition") { SearchFeaturedCharacterIcon(theItem, "DA_Featured_" + CurrentUsedItem, true); } else { GetItemIcon(theItem); } } } private void SearchAthIteDefIcon(ItemsIdParser theItem) { if (theItem.HeroDefinition != null) { string heroFilePath; if (CurrentUsedPakGuid != null && CurrentUsedPakGuid != "0-0-0-0") heroFilePath = ExtractAsset(CurrentUsedPak, theItem.HeroDefinition); else heroFilePath = ExtractAsset(AllpaksDictionary[theItem.HeroDefinition], theItem.HeroDefinition); if (heroFilePath != null) { UpdateConsole(theItem.HeroDefinition + " successfully extracted", Color.FromArgb(255, 66, 244, 66), "Success"); if (heroFilePath.Contains(".uasset") || heroFilePath.Contains(".uexp") || heroFilePath.Contains(".ubulk")) { MyAsset = new PakAsset(heroFilePath.Substring(0, heroFilePath.LastIndexOf('.'))); try { if (MyAsset.GetSerialized() != null) { UpdateConsole(theItem.HeroDefinition + " successfully serialized", Color.FromArgb(255, 66, 244, 66), "Success"); string parsedJson = JToken.Parse(MyAsset.GetSerialized()).ToString(); var itemId = ItemsIdParser.FromJson(parsedJson); UpdateConsole("Parsing " + theItem.HeroDefinition + "...", Color.FromArgb(255, 244, 132, 66), "Waiting"); for (int i = 0; i < itemId.Length; i++) { if (itemId[i].LargePreviewImage != null) { string textureFile = Path.GetFileName(itemId[i].LargePreviewImage.AssetPathName) ?.Substring(0, Path.GetFileName(itemId[i].LargePreviewImage.AssetPathName) .LastIndexOf('.')); string textureFilePath; if (CurrentUsedPakGuid != null && CurrentUsedPakGuid != "0-0-0-0") textureFilePath = ExtractAsset(CurrentUsedPak, textureFile); else textureFilePath = ExtractAsset(AllpaksDictionary[textureFile ?? throw new InvalidOperationException()], textureFile); if (textureFilePath != null) { MyAsset = new PakAsset(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal))); MyAsset.SaveTexture(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"); ItemIconPath = textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"; UpdateConsole(textureFile + " successfully converted to .PNG", Color.FromArgb(255, 66, 244, 66), "Success"); } else UpdateConsole("Error while extracting " + textureFile, Color.FromArgb(255, 244, 66, 66), "Error"); } } } else UpdateConsole("No serialized file found", Color.FromArgb(255, 244, 66, 66), "Error"); } catch (JsonSerializationException) { AppendText(CurrentUsedItem + " ", Color.Red); AppendText(".JSON file can't be displayed", Color.Black, true); } } } else UpdateConsole("Error while extracting " + theItem.HeroDefinition, Color.FromArgb(255, 244, 66, 66), "Error"); } else if (theItem.WeaponDefinition != null) { //MANUAL FIX if (theItem.WeaponDefinition == "WID_Harvest_Pickaxe_NutCracker") theItem.WeaponDefinition = "WID_Harvest_Pickaxe_Nutcracker"; if (theItem.WeaponDefinition == "WID_Harvest_Pickaxe_Wukong") theItem.WeaponDefinition = "WID_Harvest_Pickaxe_WuKong"; string weaponFilePath; if (CurrentUsedPakGuid != null && CurrentUsedPakGuid != "0-0-0-0") weaponFilePath = ExtractAsset(CurrentUsedPak, theItem.WeaponDefinition); else weaponFilePath = ExtractAsset(AllpaksDictionary[theItem.WeaponDefinition], theItem.WeaponDefinition); if (weaponFilePath != null) { UpdateConsole(theItem.WeaponDefinition + " successfully extracted", Color.FromArgb(255, 66, 244, 66), "Success"); if (weaponFilePath.Contains(".uasset") || weaponFilePath.Contains(".uexp") || weaponFilePath.Contains(".ubulk")) { MyAsset = new PakAsset(weaponFilePath.Substring(0, weaponFilePath.LastIndexOf('.'))); try { if (MyAsset.GetSerialized() != null) { UpdateConsole(theItem.WeaponDefinition + " successfully serialized", Color.FromArgb(255, 66, 244, 66), "Success"); string parsedJson = JToken.Parse(MyAsset.GetSerialized()).ToString(); var itemId = ItemsIdParser.FromJson(parsedJson); UpdateConsole("Parsing " + theItem.WeaponDefinition + "...", Color.FromArgb(255, 244, 132, 66), "Waiting"); for (int i = 0; i < itemId.Length; i++) { if (itemId[i].LargePreviewImage != null) { string textureFile = Path.GetFileName(itemId[i].LargePreviewImage.AssetPathName) ?.Substring(0, Path.GetFileName(itemId[i].LargePreviewImage.AssetPathName) .LastIndexOf('.')); string textureFilePath; if (CurrentUsedPakGuid != null && CurrentUsedPakGuid != "0-0-0-0") textureFilePath = ExtractAsset(CurrentUsedPak, textureFile); else textureFilePath = ExtractAsset(AllpaksDictionary[textureFile ?? throw new InvalidOperationException()], textureFile); if (textureFilePath != null) { MyAsset = new PakAsset(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal))); MyAsset.SaveTexture(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"); ItemIconPath = textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"; UpdateConsole(textureFile + " successfully converted to .PNG", Color.FromArgb(255, 66, 244, 66), "Success"); } else UpdateConsole("Error while extracting " + textureFile, Color.FromArgb(255, 244, 66, 66), "Error"); } } } else UpdateConsole("No serialized file found", Color.FromArgb(255, 244, 66, 66), "Error"); } catch (JsonSerializationException) { AppendText(CurrentUsedItem + " ", Color.Red); AppendText(".JSON file can't be displayed", Color.Black, true); } } } else UpdateConsole("Error while extracting " + theItem.WeaponDefinition, Color.FromArgb(255, 244, 66, 66), "Error"); } else SearchLargeSmallIcon(theItem); } private void SearchLargeSmallIcon(ItemsIdParser theItem) { if (theItem.LargePreviewImage != null) { string textureFile = Path.GetFileName(theItem.LargePreviewImage.AssetPathName)?.Substring(0, Path.GetFileName(theItem.LargePreviewImage.AssetPathName).LastIndexOf('.')); string textureFilePath; if (CurrentUsedPakGuid != null && CurrentUsedPakGuid != "0-0-0-0") textureFilePath = ExtractAsset(CurrentUsedPak, textureFile); else textureFilePath = ExtractAsset(AllpaksDictionary[textureFile ?? throw new InvalidOperationException()], textureFile); if (textureFilePath != null) { MyAsset = new PakAsset(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal))); MyAsset.SaveTexture(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"); ItemIconPath = textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"; UpdateConsole(textureFile + " successfully converted to .PNG", Color.FromArgb(255, 66, 244, 66), "Success"); } else UpdateConsole("Error while extracting " + textureFile, Color.FromArgb(255, 244, 66, 66), "Error"); } else if (theItem.SmallPreviewImage != null) { string textureFile = Path.GetFileName(theItem.SmallPreviewImage.AssetPathName)?.Substring(0, Path.GetFileName(theItem.SmallPreviewImage.AssetPathName).LastIndexOf('.')); string textureFilePath; if (CurrentUsedPakGuid != null && CurrentUsedPakGuid != "0-0-0-0") textureFilePath = ExtractAsset(CurrentUsedPak, textureFile); else textureFilePath = ExtractAsset(AllpaksDictionary[textureFile ?? throw new InvalidOperationException()], textureFile); if (textureFilePath != null) { MyAsset = new PakAsset(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal))); MyAsset.SaveTexture(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"); ItemIconPath = textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"; UpdateConsole(textureFile + " successfully converted to .PNG", Color.FromArgb(255, 66, 244, 66), "Success"); } else UpdateConsole("Error while extracting " + textureFile, Color.FromArgb(255, 244, 66, 66), "Error"); } } private void SearchFeaturedCharacterIcon(ItemsIdParser theItem, string catName, bool manualSearch = false) { if (manualSearch == false) { CurrentUsedItem = catName.Substring(catName.LastIndexOf('.') + 1); if (CurrentUsedItem == "DA_Featured_Glider_ID_141_AshtonBoardwalk") GetItemIcon(theItem); else { string catalogFilePath; if (CurrentUsedPakGuid != null && CurrentUsedPakGuid != "0-0-0-0") catalogFilePath = ExtractAsset(CurrentUsedPak, catName.Substring(catName.LastIndexOf('.') + 1)); else catalogFilePath = ExtractAsset(AllpaksDictionary[catName.Substring(catName.LastIndexOf('.') + 1)], catName.Substring(catName.LastIndexOf('.') + 1)); if (catalogFilePath != null) { WasFeatured = true; UpdateConsole(catName.Substring(catName.LastIndexOf('.') + 1) + " successfully extracted", Color.FromArgb(255, 66, 244, 66), "Success"); if (catalogFilePath.Contains(".uasset") || catalogFilePath.Contains(".uexp") || catalogFilePath.Contains(".ubulk")) { MyAsset = new PakAsset(catalogFilePath.Substring(0, catalogFilePath.LastIndexOf('.'))); try { if (MyAsset.GetSerialized() != null) { UpdateConsole(catName.Substring(catName.LastIndexOf('.') + 1) + " successfully serialized", Color.FromArgb(255, 66, 244, 66), "Success"); string parsedJson = JToken.Parse(MyAsset.GetSerialized()).ToString(); var featuredId = FeaturedParser.FromJson(parsedJson); UpdateConsole("Parsing " + catName.Substring(catName.LastIndexOf('.') + 1) + "...", Color.FromArgb(255, 244, 132, 66), "Waiting"); for (int i = 0; i < featuredId.Length; i++) { //Thanks EPIC if (CurrentUsedItem == "DA_Featured_CID_319_Athena_Commando_F_Nautilus") { if (featuredId[i].TileImage != null) { string textureFile = featuredId[i].TileImage.ResourceObject; string textureFilePath; if (CurrentUsedPakGuid != null && CurrentUsedPakGuid != "0-0-0-0") textureFilePath = ExtractAsset(CurrentUsedPak, textureFile); else textureFilePath = ExtractAsset(AllpaksDictionary[textureFile], textureFile); if (textureFilePath != null) { MyAsset = new PakAsset(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal))); MyAsset.SaveTexture(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"); ItemIconPath = textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"; UpdateConsole(textureFile + " successfully converted to .PNG", Color.FromArgb(255, 66, 244, 66), "Success"); } else UpdateConsole("Error while extracting " + textureFile, Color.FromArgb(255, 244, 66, 66), "Error"); } } else { if (featuredId[i].DetailsImage != null) { string textureFile = featuredId[i].DetailsImage.ResourceObject; string textureFilePath; if (CurrentUsedPakGuid != null && CurrentUsedPakGuid != "0-0-0-0") textureFilePath = ExtractAsset(CurrentUsedPak, textureFile); else textureFilePath = ExtractAsset(AllpaksDictionary[textureFile], textureFile); if (textureFilePath != null && textureFilePath.Contains("MI_UI_FeaturedRenderSwitch_")) { ItemIconPath = GetRenderSwitchMaterialTexture(textureFile, textureFilePath); } else if (textureFilePath != null && !textureFilePath.Contains("MI_UI_FeaturedRenderSwitch_")) { MyAsset = new PakAsset(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal))); MyAsset.SaveTexture(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"); ItemIconPath = textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"; UpdateConsole(textureFile + " successfully converted to .PNG", Color.FromArgb(255, 66, 244, 66), "Success"); } else UpdateConsole("Error while extracting " + textureFile, Color.FromArgb(255, 244, 66, 66), "Error"); } } } } } catch (JsonSerializationException) { AppendText(CurrentUsedItem + " ", Color.Red); AppendText(".JSON file can't be displayed", Color.Black, true); } } } else UpdateConsole("Error while extracting " + catName.Substring(catName.LastIndexOf('.') + 1), Color.FromArgb(255, 244, 66, 66), "Error"); } } if (manualSearch) { //Thanks EPIC if (catName == "DA_Featured_Glider_ID_015_Brite" || catName == "DA_Featured_Glider_ID_016_Tactical" || catName == "DA_Featured_Glider_ID_017_Assassin" || catName == "DA_Featured_Pickaxe_ID_027_Scavenger" || catName == "DA_Featured_Pickaxe_ID_028_Space" || catName == "DA_Featured_Pickaxe_ID_029_Assassin") GetItemIcon(theItem); else if (AllpaksDictionary.ContainsKey(catName)) { CurrentUsedItem = catName; string catalogFilePath; if (CurrentUsedPakGuid != null && CurrentUsedPakGuid != "0-0-0-0") catalogFilePath = ExtractAsset(CurrentUsedPak, catName); else catalogFilePath = ExtractAsset(AllpaksDictionary[catName], catName); if (catalogFilePath != null) { WasFeatured = true; UpdateConsole(catName + " successfully extracted", Color.FromArgb(255, 66, 244, 66), "Success"); if (catalogFilePath.Contains(".uasset") || catalogFilePath.Contains(".uexp") || catalogFilePath.Contains(".ubulk")) { MyAsset = new PakAsset(catalogFilePath.Substring(0, catalogFilePath.LastIndexOf('.'))); try { if (MyAsset.GetSerialized() != null) { UpdateConsole(catName + " successfully serialized", Color.FromArgb(255, 66, 244, 66), "Success"); string parsedJson = JToken.Parse(MyAsset.GetSerialized()).ToString(); var featuredId = FeaturedParser.FromJson(parsedJson); UpdateConsole("Parsing " + catName + "...", Color.FromArgb(255, 244, 132, 66), "Waiting"); for (int i = 0; i < featuredId.Length; i++) { //Thanks EPIC if (CurrentUsedItem == "DA_Featured_Glider_ID_070_DarkViking") { if (featuredId[i].TileImage != null) { string textureFile = featuredId[i].TileImage.ResourceObject; string textureFilePath; if (CurrentUsedPakGuid != null && CurrentUsedPakGuid != "0-0-0-0") textureFilePath = ExtractAsset(CurrentUsedPak, textureFile); else textureFilePath = ExtractAsset(AllpaksDictionary[textureFile], textureFile); if (textureFilePath != null) { MyAsset = new PakAsset(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal))); MyAsset.SaveTexture(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"); ItemIconPath = textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"; UpdateConsole(textureFile + " successfully converted to .PNG", Color.FromArgb(255, 66, 244, 66), "Success"); } else UpdateConsole("Error while extracting " + textureFile, Color.FromArgb(255, 244, 66, 66), "Error"); } } else { if (featuredId[i].DetailsImage != null) { string textureFile = featuredId[i].DetailsImage.ResourceObject; string textureFilePath; if (CurrentUsedPakGuid != null && CurrentUsedPakGuid != "0-0-0-0") textureFilePath = ExtractAsset(CurrentUsedPak, textureFile); else textureFilePath = ExtractAsset(AllpaksDictionary[textureFile], textureFile); if (textureFilePath != null && textureFilePath.Contains("MI_UI_FeaturedRenderSwitch_")) { ItemIconPath = GetRenderSwitchMaterialTexture(textureFile, textureFilePath); } else if (textureFilePath != null && !textureFilePath.Contains("MI_UI_FeaturedRenderSwitch_")) { MyAsset = new PakAsset(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal))); MyAsset.SaveTexture(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"); ItemIconPath = textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"; UpdateConsole(textureFile + " successfully converted to .PNG", Color.FromArgb(255, 66, 244, 66), "Success"); } else UpdateConsole("Error while extracting " + textureFile, Color.FromArgb(255, 244, 66, 66), "Error"); } } } } } catch (JsonSerializationException) { AppendText(CurrentUsedItem + " ", Color.Red); AppendText(".JSON file can't be displayed", Color.Black, true); } } } } else GetItemIcon(theItem); } } private string GetRenderSwitchMaterialTexture(string theTexture, string theTexturePath) { string toReturn = string.Empty; UpdateConsole(theTexture + " successfully extracted", Color.FromArgb(255, 66, 244, 66), "Success"); if (theTexturePath.Contains(".uasset") || theTexturePath.Contains(".uexp") || theTexturePath.Contains(".ubulk")) { MyAsset = new PakAsset(theTexturePath.Substring(0, theTexturePath.LastIndexOf('.'))); try { if (MyAsset.GetSerialized() != null) { UpdateConsole(theTexture + " successfully serialized", Color.FromArgb(255, 66, 244, 66), "Success"); string parsedRsmJson = JToken.Parse(MyAsset.GetSerialized()).ToString(); var rsmid = RenderSwitchMaterial.FromJson(parsedRsmJson); UpdateConsole("Parsing " + theTexture + "...", Color.FromArgb(255, 244, 132, 66), "Waiting"); for (int i = 0; i < rsmid.Length; i++) { if (rsmid[i].TextureParameterValues.FirstOrDefault()?.ParameterValue != null) { string textureFile = rsmid[i].TextureParameterValues.FirstOrDefault()?.ParameterValue; string textureFilePath; if (CurrentUsedPakGuid != null && CurrentUsedPakGuid != "0-0-0-0") textureFilePath = ExtractAsset(CurrentUsedPak, textureFile); else textureFilePath = ExtractAsset(AllpaksDictionary[textureFile ?? throw new InvalidOperationException()], textureFile); if (textureFilePath != null) { MyAsset = new PakAsset(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal))); MyAsset.SaveTexture(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"); toReturn = textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"; UpdateConsole(textureFile + " successfully converted to .PNG", Color.FromArgb(255, 66, 244, 66), "Success"); } else UpdateConsole("Error while extracting " + textureFile, Color.FromArgb(255, 244, 66, 66), "Error"); } } } } catch (JsonSerializationException) { AppendText(CurrentUsedItem + " ", Color.Red); AppendText(".JSON file can't be displayed", Color.Black, true); } } return toReturn; } private void GetAmmoData(string ammoFile, Graphics toDrawOn) { string ammoFilePath; if (CurrentUsedPakGuid != null && CurrentUsedPakGuid != "0-0-0-0") ammoFilePath = ExtractAsset(CurrentUsedPak, ammoFile.Substring(ammoFile.LastIndexOf('.') + 1)); else ammoFilePath = ExtractAsset(AllpaksDictionary[ammoFile.Substring(ammoFile.LastIndexOf('.') + 1)], ammoFile.Substring(ammoFile.LastIndexOf('.') + 1)); if (ammoFilePath != null) { UpdateConsole(ammoFile.Substring(ammoFile.LastIndexOf('.') + 1) + " successfully extracted", Color.FromArgb(255, 66, 244, 66), "Success"); if (ammoFilePath.Contains(".uasset") || ammoFilePath.Contains(".uexp") || ammoFilePath.Contains(".ubulk")) { MyAsset = new PakAsset(ammoFilePath.Substring(0, ammoFilePath.LastIndexOf('.'))); try { if (MyAsset.GetSerialized() != null) { UpdateConsole(ammoFile.Substring(ammoFile.LastIndexOf('.') + 1) + " successfully serialized", Color.FromArgb(255, 66, 244, 66), "Success"); string parsedJson = JToken.Parse(MyAsset.GetSerialized()).ToString(); var ammoId = ItemsIdParser.FromJson(parsedJson); UpdateConsole("Parsing " + ammoFile.Substring(ammoFile.LastIndexOf('.') + 1) + "...", Color.FromArgb(255, 244, 132, 66), "Waiting"); for (int i = 0; i < ammoId.Length; i++) { SearchLargeSmallIcon(ammoId[i]); if (File.Exists(ItemIconPath)) { Image itemIcon; using (var bmpTemp = new Bitmap(ItemIconPath)) { itemIcon = new Bitmap(bmpTemp); } toDrawOn.DrawImage(Forms.Settings.ResizeImage(itemIcon, 64, 64), new Point(6, 6)); } else { Image itemIcon = Resources.unknown512; toDrawOn.DrawImage(Forms.Settings.ResizeImage(itemIcon, 64, 64), new Point(6, 6)); } } } } catch (JsonSerializationException) { AppendText(CurrentUsedItem + " ", Color.Red); AppendText(".JSON file can't be displayed", Color.Black, true); } } } else UpdateConsole("Error while extracting " + ammoFile.Substring(ammoFile.LastIndexOf('.') + 1), Color.FromArgb(255, 244, 66, 66), "Error"); } //TODO: SIMPLIFY private void CreateChallengesIcon(ItemsIdParser theItem, string theParsedJson, string questJson = null) { if (theItem.ExportType == "FortChallengeBundleItemDefinition") { if (CurrentUsedItem == "QuestBundle_S9_Fortbyte") CreateFortByteChallengesIcon(theItem, theParsedJson, questJson); else { Bitmap bmp = new Bitmap(Resources.Quest); Graphics g = Graphics.FromImage(bmp); g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; g.SmoothingMode = SmoothingMode.HighQuality; int iamY = 275; int justSkip = 0; YAfterLoop = 0; bool v2 = false; var bundleParser = ChallengeBundleIdParser.FromJson(theParsedJson); for (int i = 0; i < bundleParser.Length; i++) { SelectedChallengesArray = new string[bundleParser[i].QuestInfos.Length]; for (int i2 = 0; i2 < bundleParser[i].QuestInfos.Length; i2++) { string cName = Path.GetFileName(bundleParser[i].QuestInfos[i2].QuestDefinition.AssetPathName); SelectedChallengesArray[i2] = cName.Substring(0, cName.LastIndexOf('.')); } try { if (Settings.Default.createIconForChallenges && bundleParser[i].DisplayStyle.DisplayImage != null) { DrawV2(bundleParser[i], theItem, questJson, g, bmp); v2 = true; } } catch (Exception) { } for (int i2 = 0; i2 < SelectedChallengesArray.Length; i2++) { try { string challengeFilePath; if (CurrentUsedPakGuid != null && CurrentUsedPakGuid != "0-0-0-0") challengeFilePath = ExtractAsset(CurrentUsedPak, SelectedChallengesArray[i2]); else challengeFilePath = ExtractAsset(AllpaksDictionary[SelectedChallengesArray[i2]], SelectedChallengesArray[i2]); if (challengeFilePath != null) { UpdateConsole(SelectedChallengesArray[i2] + " successfully extracted", Color.FromArgb(255, 66, 244, 66), "Success"); if (challengeFilePath.Contains(".uasset") || challengeFilePath.Contains(".uexp") || challengeFilePath.Contains(".ubulk")) { MyAsset = new PakAsset(challengeFilePath.Substring(0, challengeFilePath.LastIndexOf('.'))); try { if (MyAsset.GetSerialized() != null) { UpdateConsole(SelectedChallengesArray[i2] + " successfully serialized", Color.FromArgb(255, 66, 244, 66), "Success"); string parsedJson = JToken.Parse(MyAsset.GetSerialized()).ToString(); var questParser = QuestParser.FromJson(parsedJson); UpdateConsole("Parsing " + SelectedChallengesArray[i2] + "...", Color.FromArgb(255, 244, 132, 66), "Waiting"); for (int ii = 0; ii < questParser.Length; ii++) { string oldQuest = string.Empty; string oldCount = string.Empty; for (int ii2 = 0; ii2 < questParser[ii].Objectives.Length; ii2++) { string newQuest = questParser[ii].Objectives[ii2].Description; string newCount = questParser[ii].Objectives[ii2].Count.ToString(); if (newQuest != oldQuest && newCount != oldCount) { if (Settings.Default.createIconForChallenges) { justSkip += 1; iamY += 140; g.DrawString(questParser[ii].Objectives[ii2].Description, new Font(_pfc.Families[1], 50), new SolidBrush(Color.White), new Point(100, iamY)); Image slider = Resources.Challenges_Slider; g.DrawImage(slider, new Point(108, iamY + 86)); g.DrawString(questParser[ii].Objectives[ii2].Count.ToString(), new Font(_pfc.Families[0], 20), new SolidBrush(Color.FromArgb(255, 255, 255, 255)), new Point(968, iamY + 87)); if (justSkip != 1) { g.DrawLine(new Pen(Color.FromArgb(30, 255, 255, 255)), 100, iamY - 10, 2410, iamY - 10); } } AppendText(questParser[ii].Objectives[ii2].Description, Color.SteelBlue); if (questParser[ii].Rewards != null) { AppendText("\t\tCount: " + questParser[ii].Objectives[ii2].Count, Color.DarkRed); try { if (Settings.Default.createIconForChallenges) { string itemToExtract = questParser[ii].Rewards.Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Quest").Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Token").FirstOrDefault().ItemPrimaryAssetId.PrimaryAssetName; if (string.Equals(itemToExtract, "athenabattlestar", StringComparison.CurrentCultureIgnoreCase)) { #region DRAW ICON Image rewardIcon = Resources.T_FNBR_BattlePoints_L; g.DrawImage(Forms.Settings.ResizeImage(rewardIcon, 75, 75), new Point(2325, iamY + 22)); GraphicsPath p = new GraphicsPath(); p.AddString( questParser[ii].Rewards.Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Quest") .Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Token") .FirstOrDefault().Quantity.ToString(), _pfc.Families[1], (int)FontStyle.Regular, 60, new Point(2322, iamY + 25), _rightString); g.DrawPath(new Pen(Color.FromArgb(255, 143, 74, 32), 5), p); g.FillPath(new SolidBrush(Color.FromArgb(255, 255, 219, 103)), p); #endregion } else if (string.Equals(itemToExtract, "AthenaSeasonalXP", StringComparison.CurrentCultureIgnoreCase)) { #region DRAW ICON Image rewardIcon = Resources.T_FNBR_SeasonalXP_L; g.DrawImage(Forms.Settings.ResizeImage(rewardIcon, 75, 75), new Point(2325, iamY + 22)); GraphicsPath p = new GraphicsPath(); p.AddString( questParser[ii].Rewards.Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Quest") .Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Token") .FirstOrDefault().Quantity.ToString(), _pfc.Families[1], (int)FontStyle.Regular, 60, new Point(2322, iamY + 25), _rightString); g.DrawPath(new Pen(Color.FromArgb(255, 81, 131, 15), 5), p); g.FillPath(new SolidBrush(Color.FromArgb(255, 230, 253, 177)), p); #endregion } else if (string.Equals(itemToExtract, "MtxGiveaway", StringComparison.CurrentCultureIgnoreCase)) { #region DRAW ICON Image rewardIcon = Resources.T_Items_MTX_L; g.DrawImage(Forms.Settings.ResizeImage(rewardIcon, 75, 75), new Point(2325, iamY + 22)); GraphicsPath p = new GraphicsPath(); p.AddString( questParser[ii].Rewards.Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Quest") .Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Token") .FirstOrDefault().Quantity.ToString(), _pfc.Families[1], (int)FontStyle.Regular, 60, new Point(2322, iamY + 25), _rightString); g.DrawPath(new Pen(Color.FromArgb(255, 100, 160, 175), 5), p); g.FillPath(new SolidBrush(Color.FromArgb(255, 220, 230, 255)), p); #endregion } else DrawRewardIcon(itemToExtract, g, iamY); } AppendText("\t\t" + questParser[ii].Rewards.Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Quest") .Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Token") .FirstOrDefault().ItemPrimaryAssetId.PrimaryAssetType.Name + ":" + questParser[ii].Rewards.Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Quest") .Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Token") .FirstOrDefault().ItemPrimaryAssetId.PrimaryAssetName + ":" + questParser[ii].Rewards.Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Quest") .Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Token") .FirstOrDefault().Quantity, Color.DarkGreen, true); } catch (NullReferenceException) { if (questParser[ii].HiddenRewards != null) { if (Settings.Default.createIconForChallenges) { var partsofbruhreally = questParser[ii].HiddenRewards.FirstOrDefault().TemplateId.Split(':'); if (partsofbruhreally[0] != "HomebaseBannerIcon") DrawRewardIcon(partsofbruhreally[1], g, iamY); else DrawRewardBanner(partsofbruhreally[1], g, iamY); } AppendText("\t\t" + questParser[ii].HiddenRewards.FirstOrDefault().TemplateId + ":" + questParser[ii].HiddenRewards.FirstOrDefault().Quantity, Color.DarkGreen, true); } else { AppendText("", Color.Black, true); } } catch (Exception ex) { Console.WriteLine(ex.Message); } } else { AppendText("\t\tCount: " + questParser[ii].Objectives[ii2].Count, Color.DarkRed, true); } oldQuest = questParser[ii].Objectives[ii2].Description; oldCount = questParser[ii].Objectives[ii2].Count.ToString(); } try { for (int ii3 = 0; ii3 < questParser[ii].Rewards.Length; ii3++) { LoopStageQuest(questParser[ii].Rewards[ii3].ItemPrimaryAssetId.PrimaryAssetType.Name, questParser[ii].Rewards[ii3].ItemPrimaryAssetId.PrimaryAssetName, g, iamY, justSkip); iamY = YAfterLoop; } } catch (Exception ex) { Console.WriteLine(ex.Message); } } } } else UpdateConsole("No serialized file found", Color.FromArgb(255, 244, 66, 66), "Error"); } catch (JsonSerializationException) { AppendText(CurrentUsedItem + " ", Color.Red); AppendText(".JSON file can't be displayed", Color.Black, true); } } } else UpdateConsole("Error while extracting " + SelectedChallengesArray[i2], Color.FromArgb(255, 244, 66, 66), "Error"); } catch (KeyNotFoundException) { AppendText("Can't extract ", Color.Black); AppendText(SelectedChallengesArray[i2], Color.SteelBlue, true); } } iamY += 100; //BundleCompletionRewards try { for (int i2 = 0; i2 < bundleParser[i].BundleCompletionRewards.Length; i2++) { for (int i3 = 0; i3 < bundleParser[i].BundleCompletionRewards[i2].Rewards.Length; i3++) { string itemReward = Path.GetFileName(bundleParser[i].BundleCompletionRewards[i2].Rewards[i3].ItemDefinition.AssetPathName.Substring(0, bundleParser[i].BundleCompletionRewards[i2].Rewards[i3].ItemDefinition.AssetPathName.LastIndexOf(".", StringComparison.Ordinal))); string compCount = bundleParser[i].BundleCompletionRewards[i2].CompletionCount.ToString(); if (itemReward != "AthenaBattlePass_WeeklyChallenge_Token" && itemReward != "AthenaBattlePass_WeeklyBundle_Token") { justSkip += 1; iamY += 140; if (itemReward.Contains("Fortbyte_WeeklyChallengesComplete_")) { #region DRAW ICON string textureFile = "T_UI_PuzzleIcon_64"; string textureFilePath; if (CurrentUsedPakGuid != null && CurrentUsedPakGuid != "0-0-0-0") textureFilePath = ExtractAsset(CurrentUsedPak, textureFile); else textureFilePath = ExtractAsset(AllpaksDictionary[textureFile ?? throw new InvalidOperationException()], textureFile); if (textureFilePath != null) { MyAsset = new PakAsset(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal))); MyAsset.SaveTexture(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"); ItemIconPath = textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"; UpdateConsole(textureFile + " successfully converted to .PNG", Color.FromArgb(255, 66, 244, 66), "Success"); } else UpdateConsole("Error while extracting " + textureFile, Color.FromArgb(255, 244, 66, 66), "Error"); if (File.Exists(ItemIconPath)) { Image itemIcon; using (var bmpTemp = new Bitmap(ItemIconPath)) { itemIcon = new Bitmap(bmpTemp); } g.DrawImage(Forms.Settings.ResizeImage(itemIcon, 110, 110), new Point(2300, iamY + 6)); } else { Image itemIcon = Resources.unknown512; g.DrawImage(Forms.Settings.ResizeImage(itemIcon, 110, 110), new Point(2300, iamY + 6)); } #endregion if (compCount == "-1") g.DrawString("Complete ALL CHALLENGES to earn the reward item", new Font(_pfc.Families[1], 50), new SolidBrush(Color.White), new Point(100, iamY + 22)); else g.DrawString("Complete ANY " + compCount + " CHALLENGES to earn the reward item", new Font(_pfc.Families[1], 50), new SolidBrush(Color.White), new Point(100, iamY + 22)); } else { if (bundleParser[i].BundleCompletionRewards[i2].Rewards[i3].ItemDefinition.AssetPathName == "None") { var partsofbruhreally = bundleParser[i].BundleCompletionRewards[i2].Rewards[i3].TemplateId.Split(':'); DrawRewardBanner(partsofbruhreally[1], g, iamY); } else if (string.Equals(itemReward, "athenabattlestar", StringComparison.CurrentCultureIgnoreCase)) { #region DRAW ICON Image rewardIcon = Resources.T_FNBR_BattlePoints_L; g.DrawImage(Forms.Settings.ResizeImage(rewardIcon, 75, 75), new Point(2325, iamY + 22)); GraphicsPath p = new GraphicsPath(); p.AddString( bundleParser[i].BundleCompletionRewards[i2].Rewards[i3].Quantity.ToString(), _pfc.Families[1], (int)FontStyle.Regular, 60, new Point(2322, iamY + 25), _rightString); g.DrawPath(new Pen(Color.FromArgb(255, 143, 74, 32), 5), p); g.FillPath(new SolidBrush(Color.FromArgb(255, 255, 219, 103)), p); #endregion } else if (string.Equals(itemReward, "AthenaSeasonalXP", StringComparison.CurrentCultureIgnoreCase)) { #region DRAW ICON Image rewardIcon = Resources.T_FNBR_SeasonalXP_L; g.DrawImage(Forms.Settings.ResizeImage(rewardIcon, 75, 75), new Point(2325, iamY + 22)); GraphicsPath p = new GraphicsPath(); p.AddString( bundleParser[i].BundleCompletionRewards[i2].Rewards[i3].Quantity.ToString(), _pfc.Families[1], (int)FontStyle.Regular, 60, new Point(2322, iamY + 25), _rightString); g.DrawPath(new Pen(Color.FromArgb(255, 81, 131, 15), 5), p); g.FillPath(new SolidBrush(Color.FromArgb(255, 230, 253, 177)), p); #endregion } else if (string.Equals(itemReward, "MtxGiveaway", StringComparison.CurrentCultureIgnoreCase)) { #region DRAW ICON Image rewardIcon = Resources.T_Items_MTX_L; g.DrawImage(Forms.Settings.ResizeImage(rewardIcon, 75, 75), new Point(2325, iamY + 22)); GraphicsPath p = new GraphicsPath(); p.AddString( bundleParser[i].BundleCompletionRewards[i2].Rewards[i3].Quantity.ToString(), _pfc.Families[1], (int)FontStyle.Regular, 60, new Point(2322, iamY + 25), _rightString); g.DrawPath(new Pen(Color.FromArgb(255, 100, 160, 175), 5), p); g.FillPath(new SolidBrush(Color.FromArgb(255, 220, 230, 255)), p); #endregion } else DrawRewardIcon(itemReward, g, iamY); if (compCount == "-1") g.DrawString("Complete ALL CHALLENGES to earn the reward item", new Font(_pfc.Families[1], 50), new SolidBrush(Color.White), new Point(100, iamY + 22)); else g.DrawString("Complete ANY " + compCount + " CHALLENGES to earn the reward item", new Font(_pfc.Families[1], 50), new SolidBrush(Color.White), new Point(100, iamY + 22)); } } } } } catch (Exception ex) { UpdateConsole(ex.Message, Color.FromArgb(255, 244, 66, 66), "Error"); iamY -= 100; } } if (Settings.Default.createIconForChallenges) { #region WATERMARK g.FillRectangle(new SolidBrush(Color.FromArgb(100, 0, 0, 0)), new Rectangle(0, iamY + 240, bmp.Width, 40)); g.DrawString(theItem.DisplayName + " Generated using FModel & JohnWickParse - " + DateTime.Now.ToString("dd/MM/yyyy"), new Font(_pfc.Families[0], 20), new SolidBrush(Color.FromArgb(150, 255, 255, 255)), new Point(bmp.Width / 2, iamY + 250), _centeredString); #endregion if (v2 == false) { #region DRAW TEXT try { string seasonFolder = questJson.Substring(questJson.Substring(0, questJson.LastIndexOf("\\", StringComparison.Ordinal)).LastIndexOf("\\", StringComparison.Ordinal) + 1).ToUpper(); g.DrawString(seasonFolder.Substring(0, seasonFolder.LastIndexOf("\\", StringComparison.Ordinal)), new Font(_pfc.Families[1], 42), new SolidBrush(Color.FromArgb(255, 149, 213, 255)), new Point(340, 40)); } catch (NullReferenceException) { AppendText("[NullReferenceException] ", Color.Red); AppendText("No ", Color.Black); AppendText("Season ", Color.SteelBlue); AppendText("found", Color.Black, true); } //LAST SUBFOLDER try { g.DrawString(theItem.DisplayName.ToUpper(), new Font(_pfc.Families[1], 115), new SolidBrush(Color.White), new Point(325, 70)); } catch (NullReferenceException) { AppendText("[NullReferenceException] ", Color.Red); AppendText("No ", Color.Black); AppendText("DisplayName ", Color.SteelBlue); AppendText("found", Color.Black, true); } //NAME #endregion } #region CUT IMAGE using (Bitmap bmp2 = bmp) { var newImg = bmp2.Clone( new Rectangle { X = 0, Y = 0, Width = bmp.Width, Height = iamY + 280 }, bmp2.PixelFormat); pictureBox1.Image = newImg; } //CUT #endregion } UpdateConsole(theItem.DisplayName, Color.FromArgb(255, 66, 244, 66), "Success"); if (autoSaveImagesToolStripMenuItem.Checked || updateModeToolStripMenuItem.Checked) { Invoke(new Action(() => { pictureBox1.Image.Save(DefaultOutputPath + "\\Icons\\" + CurrentUsedItem + ".png", ImageFormat.Png); })); AppendText(CurrentUsedItem, Color.DarkRed); AppendText(" successfully saved", Color.Black, true); } AppendText("", Color.Black, true); } } } private void DrawV2(ChallengeBundleIdParser myBundle, ItemsIdParser theItem, string questJson, Graphics toDrawOn, Bitmap myBitmap) { int sRed; int sGreen; int sBlue; string seasonFolder = questJson.Substring(questJson.Substring(0, questJson.LastIndexOf("\\", StringComparison.Ordinal)).LastIndexOf("\\", StringComparison.Ordinal) + 1).ToUpper(); if (seasonFolder.Substring(0, seasonFolder.LastIndexOf("\\", StringComparison.Ordinal)) != "LTM") { sRed = (int)(myBundle.DisplayStyle.SecondaryColor.R * 255); sGreen = (int)(myBundle.DisplayStyle.SecondaryColor.G * 255); sBlue = (int)(myBundle.DisplayStyle.SecondaryColor.B * 255); } else { sRed = (int)(myBundle.DisplayStyle.AccentColor.R * 255); sGreen = (int)(myBundle.DisplayStyle.AccentColor.G * 255); sBlue = (int)(myBundle.DisplayStyle.AccentColor.B * 255); } int seasonRed = Convert.ToInt32(sRed / 1.5); int seasonGreen = Convert.ToInt32(sGreen / 1.5); int seasonBlue = Convert.ToInt32(sBlue / 1.5); toDrawOn.FillRectangle(new SolidBrush(Color.FromArgb(255, sRed, sGreen, sBlue)), new Rectangle(0, 0, myBitmap.Width, 271)); toDrawOn.FillRectangle(new SolidBrush(Color.FromArgb(255, seasonRed, seasonGreen, seasonBlue)), new Rectangle(0, 271, myBitmap.Width, myBitmap.Height - 271)); try { toDrawOn.DrawString(seasonFolder.Substring(0, seasonFolder.LastIndexOf("\\", StringComparison.Ordinal)), new Font(_pfc.Families[1], 42), new SolidBrush(Color.FromArgb(255, seasonRed, seasonGreen, seasonBlue)), new Point(340, 40)); } catch (NullReferenceException) { AppendText("[NullReferenceException] ", Color.Red); AppendText("No ", Color.Black); AppendText("Season ", Color.SteelBlue); AppendText("found", Color.Black, true); } //LAST SUBFOLDER try { toDrawOn.DrawString(theItem.DisplayName.ToUpper(), new Font(_pfc.Families[1], 115), new SolidBrush(Color.White), new Point(325, 70)); } catch (NullReferenceException) { AppendText("[NullReferenceException] ", Color.Red); AppendText("No ", Color.Black); AppendText("DisplayName ", Color.SteelBlue); AppendText("found", Color.Black, true); } //NAME string pngPath; string textureFile = Path.GetFileName(myBundle.DisplayStyle.DisplayImage.AssetPathName)?.Substring(0, Path.GetFileName(myBundle.DisplayStyle.DisplayImage.AssetPathName).LastIndexOf('.')); string textureFilePath; if (CurrentUsedPakGuid != null && CurrentUsedPakGuid != "0-0-0-0") textureFilePath = ExtractAsset(CurrentUsedPak, textureFile); else textureFilePath = ExtractAsset(AllpaksDictionary[textureFile ?? throw new InvalidOperationException()], textureFile); if (textureFilePath != null && textureFile == "M_UI_ChallengeTile_PCB") { pngPath = GetRenderSwitchMaterialTexture(textureFile, textureFilePath); Image challengeIcon = Image.FromFile(pngPath); toDrawOn.DrawImage(Forms.Settings.ResizeImage(challengeIcon, 271, 271), new Point(40, 0)); } else if (textureFilePath != null) { MyAsset = new PakAsset(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal))); MyAsset.SaveTexture(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"); pngPath = textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"; UpdateConsole(textureFile + " successfully converted to .PNG", Color.FromArgb(255, 66, 244, 66), "Success"); Image challengeIcon; using (var bmpTemp = new Bitmap(pngPath)) { challengeIcon = new Bitmap(bmpTemp); } toDrawOn.DrawImage(Forms.Settings.ResizeImage(challengeIcon, 271, 271), new Point(40, 0)); } } private void LoopStageQuest(string qAssetType, string qAssetName, Graphics toDrawOn, int yeay, int line) { Graphics toDrawOnLoop = toDrawOn; int yeayLoop = yeay; int lineLoop = line; if (qAssetType == "Quest") { try { string challengeFilePathLoop = ExtractAsset(AllpaksDictionary[qAssetName], qAssetName); if (challengeFilePathLoop != null) { UpdateConsole(qAssetName + " successfully extracted", Color.FromArgb(255, 66, 244, 66), "Success"); if (challengeFilePathLoop.Contains(".uasset") || challengeFilePathLoop.Contains(".uexp") || challengeFilePathLoop.Contains(".ubulk")) { MyAsset = new PakAsset(challengeFilePathLoop.Substring(0, challengeFilePathLoop.LastIndexOf('.'))); try { if (MyAsset.GetSerialized() != null) { UpdateConsole(qAssetName + " successfully serialized", Color.FromArgb(255, 66, 244, 66), "Success"); string parsedJson = JToken.Parse(MyAsset.GetSerialized()).ToString(); var questParser = QuestParser.FromJson(parsedJson); UpdateConsole("Parsing " + qAssetName + "...", Color.FromArgb(255, 244, 132, 66), "Waiting"); for (int i = 0; i < questParser.Length; i++) { string oldQuest = string.Empty; string oldCount = string.Empty; for (int ii = 0; ii < questParser[i].Objectives.Length; ii++) { if (CurrentUsedItem == "QuestBundle_S8_ExtraCredit" || CurrentUsedItem == "QuestBundle_S7_Overtime") { string newQuest = questParser[i].Objectives[ii].Description; string newCount = questParser[i].Objectives[ii].Count.ToString(); if (newQuest != oldQuest && newCount != oldCount) { if (Settings.Default.createIconForChallenges) { toDrawOnLoop.TextRenderingHint = TextRenderingHint.AntiAlias; lineLoop += 1; yeayLoop += 140; toDrawOnLoop.DrawString(questParser[i].Objectives[ii].Description, new Font(_pfc.Families[1], 50), new SolidBrush(Color.White), new Point(100, yeayLoop)); Image slider = Resources.Challenges_Slider; toDrawOnLoop.DrawImage(slider, new Point(108, yeayLoop + 86)); toDrawOnLoop.DrawString(questParser[i].Objectives[ii].Count.ToString(), new Font(_pfc.Families[0], 20), new SolidBrush(Color.FromArgb(255, 255, 255, 255)), new Point(968, yeayLoop + 87)); if (lineLoop != 1) { toDrawOnLoop.DrawLine(new Pen(Color.FromArgb(30, 255, 255, 255)), 100, yeayLoop - 10, 2410, yeayLoop - 10); } } AppendText(questParser[i].Objectives[ii].Description, Color.SteelBlue); AppendText("\t\tCount: " + questParser[i].Objectives[ii].Count, Color.DarkRed); if (questParser[i].Rewards != null) { AppendText("\t\tCount: " + questParser[i].Objectives[ii].Count, Color.DarkRed); try { if (Settings.Default.createIconForChallenges) { string itemToExtract = questParser[ii].Rewards.Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Quest").Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Token").FirstOrDefault().ItemPrimaryAssetId.PrimaryAssetName; if (string.Equals(itemToExtract, "athenabattlestar", StringComparison.CurrentCultureIgnoreCase)) { #region DRAW ICON Image rewardIcon = Resources.T_FNBR_BattlePoints_L; toDrawOnLoop.DrawImage(Forms.Settings.ResizeImage(rewardIcon, 75, 75), new Point(2325, yeayLoop + 22)); GraphicsPath p = new GraphicsPath(); p.AddString( questParser[ii].Rewards.Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Quest") .Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Token") .FirstOrDefault().Quantity.ToString(), _pfc.Families[1], (int)FontStyle.Regular, 60, new Point(2322, yeayLoop + 25), _rightString); toDrawOnLoop.DrawPath(new Pen(Color.FromArgb(255, 143, 74, 32), 5), p); toDrawOnLoop.FillPath(new SolidBrush(Color.FromArgb(255, 255, 219, 103)), p); #endregion } else if (string.Equals(itemToExtract, "AthenaSeasonalXP", StringComparison.CurrentCultureIgnoreCase)) { #region DRAW ICON Image rewardIcon = Resources.T_FNBR_SeasonalXP_L; toDrawOnLoop.DrawImage(Forms.Settings.ResizeImage(rewardIcon, 75, 75), new Point(2325, yeayLoop + 22)); GraphicsPath p = new GraphicsPath(); p.AddString( questParser[ii].Rewards.Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Quest") .Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Token") .FirstOrDefault().Quantity.ToString(), _pfc.Families[1], (int)FontStyle.Regular, 60, new Point(2322, yeayLoop + 25), _rightString); toDrawOnLoop.DrawPath(new Pen(Color.FromArgb(255, 81, 131, 15), 5), p); toDrawOnLoop.FillPath(new SolidBrush(Color.FromArgb(255, 230, 253, 177)), p); #endregion } else if (string.Equals(itemToExtract, "MtxGiveaway", StringComparison.CurrentCultureIgnoreCase)) { #region DRAW ICON Image rewardIcon = Resources.T_Items_MTX_L; toDrawOnLoop.DrawImage(Forms.Settings.ResizeImage(rewardIcon, 75, 75), new Point(2325, yeayLoop + 22)); GraphicsPath p = new GraphicsPath(); p.AddString( questParser[ii].Rewards.Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Quest") .Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Token") .FirstOrDefault().Quantity.ToString(), _pfc.Families[1], (int)FontStyle.Regular, 60, new Point(2322, yeayLoop + 25), _rightString); toDrawOnLoop.DrawPath(new Pen(Color.FromArgb(255, 100, 160, 175), 5), p); toDrawOnLoop.FillPath(new SolidBrush(Color.FromArgb(255, 220, 230, 255)), p); #endregion } else DrawRewardIcon(itemToExtract, toDrawOnLoop, yeayLoop); } AppendText("\t\t" + questParser[i].Rewards.Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Quest") .Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Token") .FirstOrDefault().ItemPrimaryAssetId.PrimaryAssetType.Name + ":" + questParser[i].Rewards.Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Quest") .Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Token") .FirstOrDefault().ItemPrimaryAssetId.PrimaryAssetName + ":" + questParser[i].Rewards.Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Quest") .Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Token") .FirstOrDefault().Quantity, Color.DarkGreen, true); } catch (NullReferenceException) { if (questParser[i].HiddenRewards != null) { if (Settings.Default.createIconForChallenges) { var partsofbruhreally = questParser[i].HiddenRewards.FirstOrDefault().TemplateId.Split(':'); if (partsofbruhreally[0] != "HomebaseBannerIcon") DrawRewardIcon(partsofbruhreally[1], toDrawOnLoop, yeayLoop); } AppendText("\t\t" + questParser[i].HiddenRewards.FirstOrDefault().TemplateId + ":" + questParser[i].HiddenRewards.FirstOrDefault().Quantity, Color.DarkGreen, true); } else { AppendText("", Color.Black, true); } } catch (Exception ex) { Console.WriteLine(ex.Message); } } else { AppendText("\t\tCount: " + questParser[i].Objectives[ii].Count, Color.DarkRed, true); } oldQuest = questParser[i].Objectives[ii].Description; oldCount = questParser[i].Objectives[ii].Count.ToString(); } for (int iii = 0; iii < questParser[i].Rewards.Length; iii++) { LoopStageQuest(questParser[i].Rewards[iii].ItemPrimaryAssetId.PrimaryAssetType.Name, questParser[i].Rewards[iii].ItemPrimaryAssetId.PrimaryAssetName, toDrawOnLoop, yeayLoop, lineLoop); yeayLoop = YAfterLoop; } } else if (!_questStageDict.ContainsKey(questParser[i].Objectives[ii].Description)) { string newQuest = questParser[i].Objectives[ii].Description; string newCount = questParser[i].Objectives[ii].Count.ToString(); _questStageDict.Add(questParser[i].Objectives[ii].Description, questParser[i].Objectives[ii].Count); if (newQuest != oldQuest && newCount != oldCount) { if (Settings.Default.createIconForChallenges) { lineLoop += 1; yeayLoop += 140; toDrawOnLoop.DrawString(questParser[i].Objectives[ii].Description, new Font(_pfc.Families[1], 50), new SolidBrush(Color.White), new Point(100, yeayLoop)); Image slider = Resources.Challenges_Slider; toDrawOnLoop.DrawImage(slider, new Point(108, yeayLoop + 86)); toDrawOnLoop.DrawString(questParser[i].Objectives[ii].Count.ToString(), new Font(_pfc.Families[0], 20), new SolidBrush(Color.FromArgb(255, 255, 255, 255)), new Point(968, yeayLoop + 87)); if (lineLoop != 1) { toDrawOnLoop.DrawLine(new Pen(Color.FromArgb(30, 255, 255, 255)), 100, yeayLoop - 10, 2410, yeayLoop - 10); } } AppendText(questParser[i].Objectives[ii].Description, Color.SteelBlue); AppendText("\t\tCount: " + questParser[i].Objectives[ii].Count, Color.DarkRed); if (questParser[i].Rewards != null) { AppendText("\t\tCount: " + questParser[i].Objectives[ii].Count, Color.DarkRed); try { if (Settings.Default.createIconForChallenges) { string itemToExtract = questParser[ii].Rewards.Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Quest").Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Token").FirstOrDefault().ItemPrimaryAssetId.PrimaryAssetName; if (string.Equals(itemToExtract, "athenabattlestar", StringComparison.CurrentCultureIgnoreCase)) { #region DRAW ICON Image rewardIcon = Resources.T_FNBR_BattlePoints_L; toDrawOnLoop.DrawImage(Forms.Settings.ResizeImage(rewardIcon, 75, 75), new Point(2325, yeayLoop + 22)); GraphicsPath p = new GraphicsPath(); p.AddString( questParser[ii].Rewards.Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Quest") .Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Token") .FirstOrDefault().Quantity.ToString(), _pfc.Families[1], (int)FontStyle.Regular, 60, new Point(2322, yeayLoop + 25), _rightString); toDrawOnLoop.DrawPath(new Pen(Color.FromArgb(255, 143, 74, 32), 5), p); toDrawOnLoop.FillPath(new SolidBrush(Color.FromArgb(255, 255, 219, 103)), p); #endregion } else if (string.Equals(itemToExtract, "AthenaSeasonalXP", StringComparison.CurrentCultureIgnoreCase)) { #region DRAW ICON Image rewardIcon = Resources.T_FNBR_SeasonalXP_L; toDrawOnLoop.DrawImage(Forms.Settings.ResizeImage(rewardIcon, 75, 75), new Point(2325, yeayLoop + 22)); GraphicsPath p = new GraphicsPath(); p.AddString( questParser[ii].Rewards.Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Quest") .Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Token") .FirstOrDefault().Quantity.ToString(), _pfc.Families[1], (int)FontStyle.Regular, 60, new Point(2322, yeayLoop + 25), _rightString); toDrawOnLoop.DrawPath(new Pen(Color.FromArgb(255, 81, 131, 15), 5), p); toDrawOnLoop.FillPath(new SolidBrush(Color.FromArgb(255, 230, 253, 177)), p); #endregion } else if (string.Equals(itemToExtract, "MtxGiveaway", StringComparison.CurrentCultureIgnoreCase)) { #region DRAW ICON Image rewardIcon = Resources.T_Items_MTX_L; toDrawOnLoop.DrawImage(Forms.Settings.ResizeImage(rewardIcon, 75, 75), new Point(2325, yeayLoop + 22)); GraphicsPath p = new GraphicsPath(); p.AddString( questParser[ii].Rewards.Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Quest") .Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Token") .FirstOrDefault().Quantity.ToString(), _pfc.Families[1], (int)FontStyle.Regular, 60, new Point(2322, yeayLoop + 25), _rightString); toDrawOnLoop.DrawPath(new Pen(Color.FromArgb(255, 100, 160, 175), 5), p); toDrawOnLoop.FillPath(new SolidBrush(Color.FromArgb(255, 220, 230, 255)), p); #endregion } else DrawRewardIcon(itemToExtract, toDrawOnLoop, yeayLoop); } AppendText("\t\t" + questParser[i].Rewards.Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Quest") .Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Token") .FirstOrDefault().ItemPrimaryAssetId.PrimaryAssetType.Name + ":" + questParser[i].Rewards.Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Quest") .Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Token") .FirstOrDefault().ItemPrimaryAssetId.PrimaryAssetName + ":" + questParser[i].Rewards.Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Quest") .Where(x => x.ItemPrimaryAssetId.PrimaryAssetType.Name != "Token") .FirstOrDefault().Quantity, Color.DarkGreen, true); } catch (Exception ex) { if (questParser[i].HiddenRewards != null) { if (Settings.Default.createIconForChallenges) { var partsofbruhreally = questParser[i].HiddenRewards.FirstOrDefault().TemplateId.Split(':'); if (partsofbruhreally[0] != "HomebaseBannerIcon") DrawRewardIcon(partsofbruhreally[1], toDrawOnLoop, yeayLoop); else DrawRewardBanner(partsofbruhreally[1], toDrawOnLoop, yeayLoop); } AppendText("\t\t" + questParser[i].HiddenRewards.FirstOrDefault().TemplateId + ":" + questParser[i].HiddenRewards.FirstOrDefault().Quantity, Color.DarkGreen, true); } else { Console.WriteLine(ex.Message); } } } else { AppendText("\t\tCount: " + questParser[i].Objectives[ii].Count, Color.DarkRed, true); } oldQuest = questParser[i].Objectives[ii].Description; oldCount = questParser[i].Objectives[ii].Count.ToString(); } for (int iii = 0; iii < questParser[i].Rewards.Length; iii++) { LoopStageQuest(questParser[i].Rewards[iii].ItemPrimaryAssetId.PrimaryAssetType.Name, questParser[i].Rewards[iii].ItemPrimaryAssetId.PrimaryAssetName, toDrawOnLoop, yeayLoop, lineLoop); yeayLoop = YAfterLoop; } } } } } else UpdateConsole("No serialized file found", Color.FromArgb(255, 244, 66, 66), "Error"); } catch (JsonSerializationException) { AppendText(CurrentUsedItem + " ", Color.Red); AppendText(".JSON file can't be displayed", Color.Black, true); } } } } catch (KeyNotFoundException) { AppendText("Can't extract ", Color.Black); AppendText(qAssetName, Color.SteelBlue); } } YAfterLoop = yeayLoop; } private void DrawRewardIcon(string iconName, Graphics toDrawOn, int y) { ItemIconPath = string.Empty; try { var value = AllpaksDictionary.Where(x => String.Equals(x.Key, iconName, StringComparison.CurrentCultureIgnoreCase)).Select(d => d.Key).FirstOrDefault(); if (value != null) { iconName = value; string extractedIconPath = ExtractAsset(AllpaksDictionary[iconName], iconName); if (extractedIconPath != null) { UpdateConsole(iconName + " successfully extracted", Color.FromArgb(255, 66, 244, 66), "Success"); if (extractedIconPath.Contains(".uasset") || extractedIconPath.Contains(".uexp") || extractedIconPath.Contains(".ubulk")) { MyAsset = new PakAsset(extractedIconPath.Substring(0, extractedIconPath.LastIndexOf('.'))); try { if (MyAsset.GetSerialized() != null) { UpdateConsole(iconName + " successfully serialized", Color.FromArgb(255, 66, 244, 66), "Success"); string parsedJson = JToken.Parse(MyAsset.GetSerialized()).ToString(); var itemId = ItemsIdParser.FromJson(parsedJson); UpdateConsole("Parsing " + iconName + "...", Color.FromArgb(255, 244, 132, 66), "Waiting"); for (int i = 0; i < itemId.Length; i++) { SearchAthIteDefIcon(itemId[i]); if (File.Exists(ItemIconPath)) { Image itemIcon; using (var bmpTemp = new Bitmap(ItemIconPath)) { itemIcon = new Bitmap(bmpTemp); } toDrawOn.DrawImage(Forms.Settings.ResizeImage(itemIcon, 110, 110), new Point(2300, y + 6)); } else { Image itemIcon = Resources.unknown512; toDrawOn.DrawImage(Forms.Settings.ResizeImage(itemIcon, 110, 110), new Point(2300, y + 6)); } } } else UpdateConsole("No serialized file found", Color.FromArgb(255, 244, 66, 66), "Error"); } catch (JsonSerializationException) { AppendText(CurrentUsedItem + " ", Color.Red); AppendText(".JSON file can't be displayed", Color.Black, true); } } } } } catch (Exception ex) { Console.WriteLine(ex.Message); } } private void DrawRewardBanner(string bannerName, Graphics toDrawOn, int y) { ItemIconPath = string.Empty; string extractedBannerPath = ExtractAsset(AllpaksDictionary["BannerIcons"], "BannerIcons"); if (extractedBannerPath != null) { UpdateConsole("BannerIcons successfully extracted", Color.FromArgb(255, 66, 244, 66), "Success"); if (extractedBannerPath.Contains(".uasset") || extractedBannerPath.Contains(".uexp") || extractedBannerPath.Contains(".ubulk")) { MyAsset = new PakAsset(extractedBannerPath.Substring(0, extractedBannerPath.LastIndexOf('.'))); try { if (MyAsset.GetSerialized() != null) { UpdateConsole("BannerIcons successfully serialized", Color.FromArgb(255, 66, 244, 66), "Success"); string parsedJson = JToken.Parse(MyAsset.GetSerialized()).ToString(); parsedJson = parsedJson.TrimStart('[').TrimEnd(']'); JObject jo = JObject.Parse(parsedJson); foreach (JToken token in jo.FindTokens(bannerName)) { var bannerId = BannersParser.FromJson(token.ToString()); UpdateConsole("Parsing " + token.Path + "...", Color.FromArgb(255, 244, 132, 66), "Waiting"); if (bannerId.LargeImage != null) { string textureFile = Path.GetFileName(bannerId.LargeImage.AssetPathName) ?.Substring(0, Path.GetFileName(bannerId.LargeImage.AssetPathName).LastIndexOf('.')); string textureFilePath; if (CurrentUsedPakGuid != null && CurrentUsedPakGuid != "0-0-0-0") textureFilePath = ExtractAsset(CurrentUsedPak, textureFile); else textureFilePath = ExtractAsset(AllpaksDictionary[textureFile ?? throw new InvalidOperationException()], textureFile); if (textureFilePath != null) { MyAsset = new PakAsset(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal))); MyAsset.SaveTexture(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"); ItemIconPath = textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"; UpdateConsole(textureFile + " successfully converted to .PNG", Color.FromArgb(255, 66, 244, 66), "Success"); } else UpdateConsole("Error while extracting " + textureFile, Color.FromArgb(255, 244, 66, 66), "Error"); } else if (bannerId.SmallImage != null) { string textureFile = Path.GetFileName(bannerId.SmallImage.AssetPathName) ?.Substring(0, Path.GetFileName(bannerId.SmallImage.AssetPathName).LastIndexOf('.')); string textureFilePath; if (CurrentUsedPakGuid != null && CurrentUsedPakGuid != "0-0-0-0") textureFilePath = ExtractAsset(CurrentUsedPak, textureFile); else textureFilePath = ExtractAsset(AllpaksDictionary[textureFile ?? throw new InvalidOperationException()], textureFile); if (textureFilePath != null) { MyAsset = new PakAsset(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal))); MyAsset.SaveTexture(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"); ItemIconPath = textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"; UpdateConsole(textureFile + " successfully converted to .PNG", Color.FromArgb(255, 66, 244, 66), "Success"); } else UpdateConsole("Error while extracting " + textureFile, Color.FromArgb(255, 244, 66, 66), "Error"); } if (File.Exists(ItemIconPath)) { Image itemIcon; using (var bmpTemp = new Bitmap(ItemIconPath)) { itemIcon = new Bitmap(bmpTemp); } toDrawOn.DrawImage(Forms.Settings.ResizeImage(itemIcon, 110, 110), new Point(2300, y + 6)); } else { Image itemIcon = Resources.unknown512; toDrawOn.DrawImage(Forms.Settings.ResizeImage(itemIcon, 110, 110), new Point(2300, y + 6)); } } } else UpdateConsole("No serialized file found", Color.FromArgb(255, 244, 66, 66), "Error"); } catch (JsonSerializationException) { AppendText(CurrentUsedItem + " ", Color.Red); AppendText(".JSON file can't be displayed", Color.Black, true); } } } } private void CreateFortByteChallengesIcon(ItemsIdParser theItem, string theParsedJson, string questJson = null) { Bitmap bmp = new Bitmap(2500, 7500); Graphics g = Graphics.FromImage(bmp); g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; g.SmoothingMode = SmoothingMode.HighQuality; int iamY = 275; int justSkip = 0; YAfterLoop = 0; bool v2 = false; int sRed; int sGreen; int sBlue; var bundleParser = ChallengeBundleIdParser.FromJson(theParsedJson); for (int i = 0; i < bundleParser.Length; i++) { #region DRAW BUNDLE ICON try { if (Settings.Default.createIconForChallenges) { if (bundleParser[i].DisplayStyle.DisplayImage != null) { v2 = true; string seasonFolder = questJson.Substring(questJson.Substring(0, questJson.LastIndexOf("\\", StringComparison.Ordinal)).LastIndexOf("\\", StringComparison.Ordinal) + 1).ToUpper(); #region COLORS + IMAGE if (seasonFolder.Substring(0, seasonFolder.LastIndexOf("\\", StringComparison.Ordinal)) != "LTM") { sRed = (int)(bundleParser[i].DisplayStyle.SecondaryColor.R * 255); sGreen = (int)(bundleParser[i].DisplayStyle.SecondaryColor.G * 255); sBlue = (int)(bundleParser[i].DisplayStyle.SecondaryColor.B * 255); } else { sRed = (int)(bundleParser[i].DisplayStyle.AccentColor.R * 255); sGreen = (int)(bundleParser[i].DisplayStyle.AccentColor.G * 255); sBlue = (int)(bundleParser[i].DisplayStyle.AccentColor.B * 255); } int seasonRed = Convert.ToInt32(sRed / 1.5); int seasonGreen = Convert.ToInt32(sGreen / 1.5); int seasonBlue = Convert.ToInt32(sBlue / 1.5); g.FillRectangle(new SolidBrush(Color.FromArgb(255, sRed, sGreen, sBlue)), new Rectangle(0, 0, bmp.Width, 271)); g.FillRectangle(new SolidBrush(Color.FromArgb(255, seasonRed, seasonGreen, seasonBlue)), new Rectangle(0, 271, bmp.Width, bmp.Height - 271)); try { g.DrawString(seasonFolder.Substring(0, seasonFolder.LastIndexOf("\\", StringComparison.Ordinal)), new Font(_pfc.Families[1], 42), new SolidBrush(Color.FromArgb(255, seasonRed, seasonGreen, seasonBlue)), new Point(340, 40)); } catch (NullReferenceException) { AppendText("[NullReferenceException] ", Color.Red); AppendText("No ", Color.Black); AppendText("Season ", Color.SteelBlue); AppendText("found", Color.Black, true); } //LAST SUBFOLDER try { g.DrawString(theItem.DisplayName.ToUpper(), new Font(_pfc.Families[1], 115), new SolidBrush(Color.White), new Point(325, 70)); } catch (NullReferenceException) { AppendText("[NullReferenceException] ", Color.Red); AppendText("No ", Color.Black); AppendText("DisplayName ", Color.SteelBlue); AppendText("found", Color.Black, true); } //NAME string pngPath; string textureFile = Path.GetFileName(bundleParser[i].DisplayStyle.DisplayImage.AssetPathName).Substring(0, Path.GetFileName(bundleParser[i].DisplayStyle.DisplayImage.AssetPathName).LastIndexOf('.')); string textureFilePath; if (CurrentUsedPakGuid != null && CurrentUsedPakGuid != "0-0-0-0") textureFilePath = ExtractAsset(CurrentUsedPak, textureFile); else textureFilePath = ExtractAsset(AllpaksDictionary[textureFile], textureFile); if (textureFilePath != null && textureFile == "M_UI_ChallengeTile_PCB") { pngPath = GetRenderSwitchMaterialTexture(textureFile, textureFilePath); Image challengeIcon = Image.FromFile(pngPath); g.DrawImage(Forms.Settings.ResizeImage(challengeIcon, 271, 271), new Point(40, 0)); //327 } else if (textureFilePath != null) { MyAsset = new PakAsset(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal))); MyAsset.SaveTexture(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"); pngPath = textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"; UpdateConsole(textureFile + " successfully converted to .PNG", Color.FromArgb(255, 66, 244, 66), "Success"); Image challengeIcon; using (var bmpTemp = new Bitmap(pngPath)) { challengeIcon = new Bitmap(bmpTemp); } g.DrawImage(Forms.Settings.ResizeImage(challengeIcon, 271, 271), new Point(40, 0)); //327 } #endregion } } } catch (Exception ex) { Console.WriteLine(ex.Message); } #endregion SelectedChallengesArray = new string[bundleParser[i].QuestInfos.Length]; for (int i2 = 0; i2 < bundleParser[i].QuestInfos.Length; i2++) { string cName = Path.GetFileName(bundleParser[i].QuestInfos[i2].QuestDefinition.AssetPathName); SelectedChallengesArray[i2] = cName.Substring(0, cName.LastIndexOf('.')); } int damageOpCount = 0; int damageOpPosition = 0; for (int i2 = 0; i2 < SelectedChallengesArray.Length; i2++) { try { string challengeFilePath; if (CurrentUsedPakGuid != null && CurrentUsedPakGuid != "0-0-0-0") challengeFilePath = ExtractAsset(CurrentUsedPak, SelectedChallengesArray[i2]); else challengeFilePath = ExtractAsset(AllpaksDictionary[SelectedChallengesArray[i2]], SelectedChallengesArray[i2]); if (challengeFilePath != null) { UpdateConsole(SelectedChallengesArray[i2] + " successfully extracted", Color.FromArgb(255, 66, 244, 66), "Success"); if (challengeFilePath.Contains(".uasset") || challengeFilePath.Contains(".uexp") || challengeFilePath.Contains(".ubulk")) { MyAsset = new PakAsset(challengeFilePath.Substring(0, challengeFilePath.LastIndexOf('.'))); try { if (MyAsset.GetSerialized() != null) { UpdateConsole(SelectedChallengesArray[i2] + " successfully serialized", Color.FromArgb(255, 66, 244, 66), "Success"); string parsedJson = JToken.Parse(MyAsset.GetSerialized()).ToString(); var questParser = QuestParser.FromJson(parsedJson); UpdateConsole("Parsing " + SelectedChallengesArray[i2] + "...", Color.FromArgb(255, 244, 132, 66), "Waiting"); for (int ii = 0; ii < questParser.Length; ii++) { string oldQuest = string.Empty; string oldCount = string.Empty; for (int ii2 = 0; ii2 < questParser[ii].Objectives.Length; ii2++) { string newQuest = questParser[ii].Objectives[ii2].Description; string newCount = questParser[ii].Objectives[ii2].Count.ToString(); if (newQuest != oldQuest && newCount != oldCount) { if (Settings.Default.createIconForChallenges) { if (questParser[ii].Objectives[ii2].Description == "Deal damage to opponents") { damageOpCount += 1; if (damageOpCount == 1) { AppendText(questParser[ii].Objectives[ii2].Description, Color.SteelBlue); AppendText("\t\tCount: " + questParser[ii].Objectives[ii2].Count, Color.DarkRed, true); justSkip += 1; iamY += 140; g.DrawString(questParser[ii].Objectives[ii2].Description, new Font(_pfc.Families[1], 50), new SolidBrush(Color.White), new Point(100, iamY)); damageOpPosition = iamY; Image slider = Resources.Challenges_Slider; g.DrawImage(slider, new Point(108, iamY + 86)); g.DrawString(questParser[ii].Objectives[ii2].Count.ToString(), new Font(_pfc.Families[0], 20), new SolidBrush(Color.FromArgb(255, 255, 255, 255)), new Point(968, iamY + 87)); if (justSkip != 1) { g.DrawLine(new Pen(Color.FromArgb(30, 255, 255, 255)), 100, iamY - 10, 2410, iamY - 10); } #region getIcon string textureFile = Path.GetFileName(questParser[ii].LargePreviewImage.AssetPathName)?.Substring(0, Path.GetFileName(questParser[ii].LargePreviewImage.AssetPathName).LastIndexOf('.')); string textureFilePath; if (CurrentUsedPakGuid != null && CurrentUsedPakGuid != "0-0-0-0") textureFilePath = ExtractAsset(CurrentUsedPak, textureFile); else textureFilePath = ExtractAsset(AllpaksDictionary[textureFile ?? throw new InvalidOperationException()], textureFile); if (textureFilePath != null) { MyAsset = new PakAsset(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal))); MyAsset.SaveTexture(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"); ItemIconPath = textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"; UpdateConsole(textureFile + " successfully converted to .PNG", Color.FromArgb(255, 66, 244, 66), "Success"); } else UpdateConsole("Error while extracting " + textureFile, Color.FromArgb(255, 244, 66, 66), "Error"); if (File.Exists(ItemIconPath)) { Image itemIcon; using (var bmpTemp = new Bitmap(ItemIconPath)) { itemIcon = new Bitmap(bmpTemp); } g.DrawImage(Forms.Settings.ResizeImage(itemIcon, 110, 110), new Point(2300, iamY + 6)); } else { Image itemIcon = Resources.unknown512; g.DrawImage(Forms.Settings.ResizeImage(itemIcon, 110, 110), new Point(2300, iamY + 6)); } #endregion } } else { AppendText(questParser[ii].Objectives[ii2].Description, Color.SteelBlue); AppendText("\t\tCount: " + questParser[ii].Objectives[ii2].Count, Color.DarkRed, true); justSkip += 1; iamY += 140; g.DrawString(questParser[ii].Objectives[ii2].Description, new Font(_pfc.Families[1], 50), new SolidBrush(Color.White), new Point(100, iamY)); Image slider = Resources.Challenges_Slider; g.DrawImage(slider, new Point(108, iamY + 86)); g.DrawString(questParser[ii].Objectives[ii2].Count.ToString(), new Font(_pfc.Families[0], 20), new SolidBrush(Color.FromArgb(255, 255, 255, 255)), new Point(968, iamY + 87)); if (justSkip != 1) { g.DrawLine(new Pen(Color.FromArgb(30, 255, 255, 255)), 100, iamY - 10, 2410, iamY - 10); } #region getIcon string textureFile = Path.GetFileName(questParser[ii].LargePreviewImage.AssetPathName)?.Substring(0, Path.GetFileName(questParser[ii].LargePreviewImage.AssetPathName).LastIndexOf('.')); string textureFilePath; if (CurrentUsedPakGuid != null && CurrentUsedPakGuid != "0-0-0-0") textureFilePath = ExtractAsset(CurrentUsedPak, textureFile); else textureFilePath = ExtractAsset(AllpaksDictionary[textureFile ?? throw new InvalidOperationException()], textureFile); if (textureFilePath != null) { MyAsset = new PakAsset(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal))); MyAsset.SaveTexture(textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"); ItemIconPath = textureFilePath.Substring(0, textureFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"; UpdateConsole(textureFile + " successfully converted to .PNG", Color.FromArgb(255, 66, 244, 66), "Success"); } else UpdateConsole("Error while extracting " + textureFile, Color.FromArgb(255, 244, 66, 66), "Error"); if (File.Exists(ItemIconPath)) { Image itemIcon; using (var bmpTemp = new Bitmap(ItemIconPath)) { itemIcon = new Bitmap(bmpTemp); } g.DrawImage(Forms.Settings.ResizeImage(itemIcon, 110, 110), new Point(2300, iamY + 6)); } else { Image itemIcon = Resources.unknown512; g.DrawImage(Forms.Settings.ResizeImage(itemIcon, 110, 110), new Point(2300, iamY + 6)); } #endregion } } oldQuest = questParser[ii].Objectives[ii2].Description; oldCount = questParser[ii].Objectives[ii2].Count.ToString(); } } } } else UpdateConsole("No serialized file found", Color.FromArgb(255, 244, 66, 66), "Error"); } catch (JsonSerializationException) { AppendText(CurrentUsedItem + " ", Color.Red); AppendText(".JSON file can't be displayed", Color.Black, true); } } } else UpdateConsole("Error while extracting " + SelectedChallengesArray[i2], Color.FromArgb(255, 244, 66, 66), "Error"); } catch (KeyNotFoundException) { AppendText("Can't extract ", Color.Black); AppendText(SelectedChallengesArray[i2], Color.SteelBlue, true); } } g.DrawString("Same Quest x" + damageOpCount, new Font(_pfc.Families[1], 50), new SolidBrush(Color.White), new Point(1500, damageOpPosition + 25)); iamY += 100; //BundleCompletionRewards try { for (int i2 = 0; i2 < bundleParser[i].BundleCompletionRewards.Length; i2++) { string itemReward = bundleParser[i].BundleCompletionRewards[i2].Rewards.FirstOrDefault().ItemDefinition.AssetPathName.Substring(bundleParser[i].BundleCompletionRewards[i2].Rewards.FirstOrDefault().ItemDefinition.AssetPathName.LastIndexOf(".", StringComparison.Ordinal) + 1); string compCount = bundleParser[i].BundleCompletionRewards[i2].CompletionCount.ToString(); if (itemReward != "AthenaBattlePass_WeeklyChallenge_Token" && itemReward != "AthenaBattlePass_WeeklyBundle_Token") { justSkip += 1; iamY += 140; if (bundleParser[i].BundleCompletionRewards[i2].Rewards.FirstOrDefault().ItemDefinition.AssetPathName == "None") { var partsofbruhreally = bundleParser[i].BundleCompletionRewards[i2].Rewards.FirstOrDefault().TemplateId.Split(':'); DrawRewardBanner(partsofbruhreally[1], g, iamY); } else DrawRewardIcon(itemReward, g, iamY); if (compCount == "-1") g.DrawString("Complete ALL CHALLENGES to earn the reward item", new Font(_pfc.Families[1], 50), new SolidBrush(Color.White), new Point(100, iamY + 22)); else g.DrawString("Complete ANY " + compCount + " CHALLENGES to earn the reward item", new Font(_pfc.Families[1], 50), new SolidBrush(Color.White), new Point(100, iamY + 22)); } } } catch (Exception ex) { UpdateConsole(ex.Message, Color.FromArgb(255, 244, 66, 66), "Error"); iamY -= 100; } } if (Settings.Default.createIconForChallenges) { #region WATERMARK g.FillRectangle(new SolidBrush(Color.FromArgb(100, 0, 0, 0)), new Rectangle(0, iamY + 240, bmp.Width, 40)); g.DrawString(theItem.DisplayName + " Generated using FModel & JohnWickParse - " + DateTime.Now.ToString("dd/MM/yyyy"), new Font(_pfc.Families[0], 20), new SolidBrush(Color.FromArgb(150, 255, 255, 255)), new Point(bmp.Width / 2, iamY + 250), _centeredString); #endregion if (v2 == false) { #region DRAW TEXT try { string seasonFolder = questJson.Substring(questJson.Substring(0, questJson.LastIndexOf("\\", StringComparison.Ordinal)).LastIndexOf("\\", StringComparison.Ordinal) + 1).ToUpper(); g.DrawString(seasonFolder.Substring(0, seasonFolder.LastIndexOf("\\", StringComparison.Ordinal)), new Font(_pfc.Families[1], 42), new SolidBrush(Color.FromArgb(255, 149, 213, 255)), new Point(340, 40)); } catch (NullReferenceException) { AppendText("[NullReferenceException] ", Color.Red); AppendText("No ", Color.Black); AppendText("Season ", Color.SteelBlue); AppendText("found", Color.Black, true); } //LAST SUBFOLDER try { g.DrawString(theItem.DisplayName.ToUpper(), new Font(_pfc.Families[1], 115), new SolidBrush(Color.White), new Point(325, 70)); } catch (NullReferenceException) { AppendText("[NullReferenceException] ", Color.Red); AppendText("No ", Color.Black); AppendText("DisplayName ", Color.SteelBlue); AppendText("found", Color.Black, true); } //NAME #endregion } #region CUT IMAGE using (Bitmap bmp2 = bmp) { var newImg = bmp2.Clone( new Rectangle { X = 0, Y = 0, Width = bmp.Width, Height = iamY + 280 }, bmp2.PixelFormat); pictureBox1.Image = newImg; } //CUT #endregion } UpdateConsole(theItem.DisplayName, Color.FromArgb(255, 66, 244, 66), "Success"); if (autoSaveImagesToolStripMenuItem.Checked || updateModeToolStripMenuItem.Checked) { Invoke(new Action(() => { pictureBox1.Image.Save(DefaultOutputPath + "\\Icons\\" + CurrentUsedItem + ".png", ImageFormat.Png); })); AppendText(CurrentUsedItem, Color.DarkRed); AppendText(" successfully saved", Color.Black, true); } AppendText("", Color.Black, true); } private void ConvertTexture2D() { UpdateConsole(CurrentUsedItem + " is a Texture2D", Color.FromArgb(255, 66, 244, 66), "Success"); MyAsset = new PakAsset(ExtractedFilePath.Substring(0, ExtractedFilePath.LastIndexOf(".", StringComparison.Ordinal))); MyAsset.SaveTexture(ExtractedFilePath.Substring(0, ExtractedFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"); string imgPath = ExtractedFilePath.Substring(0, ExtractedFilePath.LastIndexOf(".", StringComparison.Ordinal)) + ".png"; if (File.Exists(imgPath)) { pictureBox1.Image = Image.FromFile(imgPath); } if (autoSaveImagesToolStripMenuItem.Checked || updateModeToolStripMenuItem.Checked) { Invoke(new Action(() => { pictureBox1.Image.Save(DefaultOutputPath + "\\Icons\\" + CurrentUsedItem + ".png", ImageFormat.Png); })); AppendText(CurrentUsedItem, Color.DarkRed); AppendText(" successfully saved", Color.Black, true); } } private void ConvertSoundWave() { UpdateConsole(CurrentUsedItem + " is a Sound", Color.FromArgb(255, 66, 244, 66), "Success"); string soundPathToConvert = ExtractedFilePath.Substring(0, ExtractedFilePath.LastIndexOf('\\')) + "\\" + CurrentUsedItem + ".uexp"; UpdateConsole("Converting " + CurrentUsedItem, Color.FromArgb(255, 244, 132, 66), "Processing"); OpenWithDefaultProgramAndNoFocus(UnrealEngineDataToOgg.ConvertToOgg(soundPathToConvert)); UpdateConsole("Opening " + CurrentUsedItem + ".ogg", Color.FromArgb(255, 66, 244, 66), "Success"); } private void ConvertToTtf(string file) { File.Move(file, Path.ChangeExtension(file, ".ttf") ?? throw new InvalidOperationException()); UpdateConsole(CurrentUsedItem + " successfully converter to a font", Color.FromArgb(255, 66, 244, 66), "Success"); } //EVENTS private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { StopWatch = new Stopwatch(); StopWatch.Start(); CreateDir(); ExtractAndSerializeItems(e); } private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { StopWatch.Stop(); if (e.Cancelled) { UpdateConsole("Canceled!", Color.FromArgb(255, 244, 66, 66), "Error"); } else if (e.Error != null) { UpdateConsole(e.Error.Message, Color.FromArgb(255, 244, 66, 66), "Error"); } else { TimeSpan ts = StopWatch.Elapsed; string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10); UpdateConsole("Time elapsed: " + elapsedTime, Color.FromArgb(255, 66, 244, 66), "Success"); } SelectedItemsArray = null; Invoke(new Action(() => { StopButton.Enabled = false; OpenImageButton.Enabled = true; ExtractButton.Enabled = true; })); } private void ExtractButton_Click(object sender, EventArgs e) { scintilla1.Text = ""; pictureBox1.Image = null; _questStageDict = new Dictionary(); ExtractButton.Enabled = false; OpenImageButton.Enabled = false; StopButton.Enabled = true; if (backgroundWorker1.IsBusy != true) { backgroundWorker1.RunWorkerAsync(); } } private void StopButton_Click(object sender, EventArgs e) { if (backgroundWorker1.WorkerSupportsCancellation) { backgroundWorker1.CancelAsync(); } if (backgroundWorker2.WorkerSupportsCancellation) { backgroundWorker2.CancelAsync(); } } #endregion #region IMAGES SAVE & MERGE //METHODS private void AskMergeImages() { if (string.IsNullOrEmpty(Settings.Default.mergerFileName)) { MessageBox.Show(@"Please, set a name to your Merger file before trying to merge images Steps: - Load - Settings", @"Merger File Name Missing", MessageBoxButtons.OK, MessageBoxIcon.Error); } else { OpenFileDialog theDialog = new OpenFileDialog(); theDialog.Multiselect = true; theDialog.InitialDirectory = DefaultOutputPath + "\\Icons\\"; theDialog.Title = @"Choose your images"; theDialog.Filter = @"PNG Files (*.png)|*.png|JPEG Files (*.jpg)|*.jpg|BMP Files (*.bmp)|*.bmp|All Files (*.*)|*.*"; Invoke(new Action(() => { if (theDialog.ShowDialog() == DialogResult.OK) { List selectedImages = new List(); foreach (var files in theDialog.FileNames) { selectedImages.Add(Image.FromFile(files)); } MergeSelected(selectedImages); } })); } } private void MergeSelected(List mySelectedImages) { if (Settings.Default.mergerImagesRow == 0) { Settings.Default.mergerImagesRow = 7; Settings.Default.Save(); } int numperrow = Settings.Default.mergerImagesRow; var w = 530 * numperrow; if (mySelectedImages.Count * 530 < 530 * numperrow) { w = mySelectedImages.Count * 530; } int h = int.Parse(Math.Ceiling(double.Parse(mySelectedImages.Count.ToString()) / numperrow).ToString(CultureInfo.InvariantCulture)) * 530; Bitmap bmp = new Bitmap(w - 8, h - 8); var num = 1; var curW = 0; var curH = 0; for (int i = 0; i < mySelectedImages.Count; i++) { using (Graphics g = Graphics.FromImage(bmp)) { g.DrawImage(Forms.Settings.ResizeImage(mySelectedImages[i], 522, 522), new PointF(curW, curH)); if (num % numperrow == 0) { curW = 0; curH += 530; num += 1; } else { curW += 530; num += 1; } } } bmp.Save(DefaultOutputPath + "\\" + Settings.Default.mergerFileName + ".png", ImageFormat.Png); OpenMerged(bmp); } private void OpenMerged(Bitmap mergedImage) { if (mergedImage != null) { var newForm = new Form(); PictureBox pb = new PictureBox(); pb.Dock = DockStyle.Fill; pb.Image = mergedImage; pb.SizeMode = PictureBoxSizeMode.Zoom; newForm.WindowState = FormWindowState.Maximized; newForm.Size = mergedImage.Size; newForm.Icon = Resources.FModel; newForm.Text = DefaultOutputPath + @"\" + Settings.Default.mergerFileName + @".png"; newForm.StartPosition = FormStartPosition.CenterScreen; newForm.Controls.Add(pb); newForm.Show(); } } //EVENTS private void OpenImageButton_Click(object sender, EventArgs e) { if (pictureBox1.Image != null) { var newForm = new Form(); PictureBox pb = new PictureBox(); pb.Dock = DockStyle.Fill; pb.Image = pictureBox1.Image; pb.SizeMode = PictureBoxSizeMode.Zoom; newForm.Size = pictureBox1.Image.Size; newForm.Icon = Resources.FModel; newForm.Text = CurrentUsedItem; newForm.StartPosition = FormStartPosition.CenterScreen; newForm.Controls.Add(pb); newForm.Show(); } } private void saveImageToolStripMenuItem_Click(object sender, EventArgs e) { if (pictureBox1.Image != null) { SaveFileDialog saveTheDialog = new SaveFileDialog(); saveTheDialog.Title = @"Save Icon"; saveTheDialog.Filter = @"PNG Files (*.png)|*.png"; saveTheDialog.InitialDirectory = DefaultOutputPath + "\\Icons\\"; saveTheDialog.FileName = CurrentUsedItem; if (saveTheDialog.ShowDialog() == DialogResult.OK) { pictureBox1.Image.Save(saveTheDialog.FileName, ImageFormat.Png); AppendText(CurrentUsedItem, Color.DarkRed); AppendText(" successfully saved", Color.Black, true); } } } private async void mergeImagesToolStripMenuItem_Click(object sender, EventArgs e) { await Task.Run(() => { AskMergeImages(); }); } #endregion } }