diff --git a/FModel/App.config b/FModel/App.config
index 747661a3..1700d9c1 100644
--- a/FModel/App.config
+++ b/FModel/App.config
@@ -55,6 +55,60 @@
False
+
+ True
+
+
+ True
+
+
+ False
+
+
+ False
+
+
+ True
+
+
+ 1
+
+
+ 0
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+ True
+
+
+ False
+
+
+ True
+
+
+ True
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+
+
\ No newline at end of file
diff --git a/FModel/FModel.csproj b/FModel/FModel.csproj
index c803bf70..b83d5497 100644
--- a/FModel/FModel.csproj
+++ b/FModel/FModel.csproj
@@ -117,6 +117,12 @@
Component
+
+ Form
+
+
+ UpdateModeOption.cs
+
Options.cs
@@ -133,6 +139,9 @@
Resources.resx
True
+
+ UpdateModeOption.cs
+
SettingsSingleFileGenerator
diff --git a/FModel/PAKWindow.Designer.cs b/FModel/PAKWindow.Designer.cs
index 19d6bc44..ea30f1a0 100644
--- a/FModel/PAKWindow.Designer.cs
+++ b/FModel/PAKWindow.Designer.cs
@@ -31,11 +31,14 @@
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PAKWindow));
this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.LoadButton = new FModel.SplitButton();
this.LoadContext = new System.Windows.Forms.ContextMenuStrip(this.components);
this.loadAllPAKsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.backupCurrentPAKsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.enablePAKsDiffToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+ this.updateModeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
this.optionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.AESKeyLabel = new System.Windows.Forms.Label();
this.AESKeyTextBox = new System.Windows.Forms.TextBox();
@@ -46,8 +49,10 @@
this.ItemIconPictureBox = new System.Windows.Forms.PictureBox();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.scintilla1 = new ScintillaNET.Scintilla();
+ this.OpenImageButton = new FModel.SplitButton();
this.ImageContext = new System.Windows.Forms.ContextMenuStrip(this.components);
this.ImageSaveTS = new System.Windows.Forms.ToolStripMenuItem();
+ this.ExtractAssetButton = new FModel.SplitButton();
this.ExtractAsset = new System.Windows.Forms.ContextMenuStrip(this.components);
this.LoadDataTS = new System.Windows.Forms.ToolStripMenuItem();
this.SaveImageTS = new System.Windows.Forms.ToolStripMenuItem();
@@ -56,11 +61,6 @@
this.ConsoleRichTextBox = new System.Windows.Forms.RichTextBox();
this.FilterLabel = new System.Windows.Forms.Label();
this.FilterTextBox = new System.Windows.Forms.TextBox();
- this.updateModeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
- this.OpenImageButton = new FModel.SplitButton();
- this.ExtractAssetButton = new FModel.SplitButton();
- this.LoadButton = new FModel.SplitButton();
this.groupBox1.SuspendLayout();
this.LoadContext.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.ItemIconPictureBox)).BeginInit();
@@ -82,6 +82,18 @@
this.groupBox1.TabStop = false;
this.groupBox1.Text = "PAK";
//
+ // LoadButton
+ //
+ this.LoadButton.Location = new System.Drawing.Point(296, 18);
+ this.LoadButton.Menu = this.LoadContext;
+ this.LoadButton.Name = "LoadButton";
+ this.LoadButton.Size = new System.Drawing.Size(106, 23);
+ this.LoadButton.TabIndex = 12;
+ this.LoadButton.Text = " Load";
+ this.LoadButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.LoadButton.UseVisualStyleBackColor = true;
+ this.LoadButton.Click += new System.EventHandler(this.LoadButton_Click);
+ //
// LoadContext
//
this.LoadContext.ImageScalingSize = new System.Drawing.Size(18, 18);
@@ -104,6 +116,11 @@
this.loadAllPAKsToolStripMenuItem.Text = "Load All PAKs";
this.loadAllPAKsToolStripMenuItem.Click += new System.EventHandler(this.loadAllPAKsToolStripMenuItem_Click);
//
+ // toolStripSeparator2
+ //
+ this.toolStripSeparator2.Name = "toolStripSeparator2";
+ this.toolStripSeparator2.Size = new System.Drawing.Size(182, 6);
+ //
// backupCurrentPAKsToolStripMenuItem
//
this.backupCurrentPAKsToolStripMenuItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
@@ -121,10 +138,19 @@
this.enablePAKsDiffToolStripMenuItem.Text = "Enable PAKs Diff";
this.enablePAKsDiffToolStripMenuItem.CheckedChanged += new System.EventHandler(this.enablePAKsDiffToolStripMenuItem_CheckedChanged);
//
- // toolStripSeparator2
+ // updateModeToolStripMenuItem
//
- this.toolStripSeparator2.Name = "toolStripSeparator2";
- this.toolStripSeparator2.Size = new System.Drawing.Size(182, 6);
+ this.updateModeToolStripMenuItem.Enabled = false;
+ this.updateModeToolStripMenuItem.Name = "updateModeToolStripMenuItem";
+ this.updateModeToolStripMenuItem.Size = new System.Drawing.Size(185, 22);
+ this.updateModeToolStripMenuItem.Text = "Update Mode";
+ this.updateModeToolStripMenuItem.CheckedChanged += new System.EventHandler(this.updateModeToolStripMenuItem_CheckedChanged);
+ this.updateModeToolStripMenuItem.Click += new System.EventHandler(this.updateModeToolStripMenuItem_Click);
+ //
+ // toolStripSeparator3
+ //
+ this.toolStripSeparator3.Name = "toolStripSeparator3";
+ this.toolStripSeparator3.Size = new System.Drawing.Size(182, 6);
//
// optionsToolStripMenuItem
//
@@ -222,6 +248,18 @@
this.scintilla1.Size = new System.Drawing.Size(560, 350);
this.scintilla1.TabIndex = 12;
//
+ // OpenImageButton
+ //
+ this.OpenImageButton.Location = new System.Drawing.Point(810, 635);
+ this.OpenImageButton.Menu = this.ImageContext;
+ this.OpenImageButton.Name = "OpenImageButton";
+ this.OpenImageButton.Size = new System.Drawing.Size(112, 23);
+ this.OpenImageButton.TabIndex = 11;
+ this.OpenImageButton.Text = " Open Image";
+ this.OpenImageButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.OpenImageButton.UseVisualStyleBackColor = true;
+ this.OpenImageButton.Click += new System.EventHandler(this.OpenImageButton_Click);
+ //
// ImageContext
//
this.ImageContext.ImageScalingSize = new System.Drawing.Size(18, 18);
@@ -238,6 +276,18 @@
this.ImageSaveTS.Text = "Save Image";
this.ImageSaveTS.Click += new System.EventHandler(this.ImageSaveTS_Click);
//
+ // ExtractAssetButton
+ //
+ this.ExtractAssetButton.Location = new System.Drawing.Point(810, 664);
+ this.ExtractAssetButton.Menu = this.ExtractAsset;
+ this.ExtractAssetButton.Name = "ExtractAssetButton";
+ this.ExtractAssetButton.Size = new System.Drawing.Size(112, 23);
+ this.ExtractAssetButton.TabIndex = 10;
+ this.ExtractAssetButton.Text = " Extract Asset";
+ this.ExtractAssetButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.ExtractAssetButton.UseVisualStyleBackColor = true;
+ this.ExtractAssetButton.Click += new System.EventHandler(this.ExtractAssetButton_Click);
+ //
// ExtractAsset
//
this.ExtractAsset.ImageScalingSize = new System.Drawing.Size(18, 18);
@@ -307,55 +357,6 @@
this.FilterTextBox.TabIndex = 5;
this.FilterTextBox.TextChanged += new System.EventHandler(this.FilterTextBox_TextChanged);
//
- // updateModeToolStripMenuItem
- //
- this.updateModeToolStripMenuItem.CheckOnClick = true;
- this.updateModeToolStripMenuItem.Enabled = false;
- this.updateModeToolStripMenuItem.Name = "updateModeToolStripMenuItem";
- this.updateModeToolStripMenuItem.Size = new System.Drawing.Size(185, 22);
- this.updateModeToolStripMenuItem.Text = "Update Mode";
- //
- // toolStripSeparator3
- //
- this.toolStripSeparator3.Name = "toolStripSeparator3";
- this.toolStripSeparator3.Size = new System.Drawing.Size(182, 6);
- //
- // OpenImageButton
- //
- this.OpenImageButton.Location = new System.Drawing.Point(810, 635);
- this.OpenImageButton.Menu = this.ImageContext;
- this.OpenImageButton.Name = "OpenImageButton";
- this.OpenImageButton.Size = new System.Drawing.Size(112, 23);
- this.OpenImageButton.TabIndex = 11;
- this.OpenImageButton.Text = " Open Image";
- this.OpenImageButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
- this.OpenImageButton.UseVisualStyleBackColor = true;
- this.OpenImageButton.Click += new System.EventHandler(this.OpenImageButton_Click);
- //
- // ExtractAssetButton
- //
- this.ExtractAssetButton.Location = new System.Drawing.Point(810, 664);
- this.ExtractAssetButton.Menu = this.ExtractAsset;
- this.ExtractAssetButton.Name = "ExtractAssetButton";
- this.ExtractAssetButton.Size = new System.Drawing.Size(112, 23);
- this.ExtractAssetButton.TabIndex = 10;
- this.ExtractAssetButton.Text = " Extract Asset";
- this.ExtractAssetButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
- this.ExtractAssetButton.UseVisualStyleBackColor = true;
- this.ExtractAssetButton.Click += new System.EventHandler(this.ExtractAssetButton_Click);
- //
- // LoadButton
- //
- this.LoadButton.Location = new System.Drawing.Point(296, 18);
- this.LoadButton.Menu = this.LoadContext;
- this.LoadButton.Name = "LoadButton";
- this.LoadButton.Size = new System.Drawing.Size(106, 23);
- this.LoadButton.TabIndex = 12;
- this.LoadButton.Text = " Load";
- this.LoadButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
- this.LoadButton.UseVisualStyleBackColor = true;
- this.LoadButton.Click += new System.EventHandler(this.LoadButton_Click);
- //
// PAKWindow
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
diff --git a/FModel/PAKWindow.cs b/FModel/PAKWindow.cs
index 8e7199df..efed7fb0 100644
--- a/FModel/PAKWindow.cs
+++ b/FModel/PAKWindow.cs
@@ -366,6 +366,76 @@ namespace FModel
private static string currentPAK;
private static string currentGUID;
+ private void umFilter(String[] theFile, Dictionary diffToExtract)
+ {
+ List searchResults = new List();
+
+ if (Properties.Settings.Default.UMCosmetics == true)
+ searchResults.Add("Athena/Items/Cosmetics/");
+ if (Properties.Settings.Default.UMVariants == true)
+ searchResults.Add("Athena/Items/CosmeticVariantTokens/");
+ if (Properties.Settings.Default.UMConsumablesWeapons == true)
+ {
+ searchResults.Add("Athena/Items/Consumables/");
+ searchResults.Add("Athena/Items/Weapons/");
+ }
+ if (Properties.Settings.Default.UMTraps == true)
+ searchResults.Add("Athena/Items/Traps/");
+ if (Properties.Settings.Default.UMChallenges == true)
+ searchResults.Add("Athena/Items/ChallengeBundles/");
+
+ if (Properties.Settings.Default.UMTCosmeticsVariants == true)
+ {
+ 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 (Properties.Settings.Default.UMTLoading == true)
+ {
+ searchResults.Add("FortniteGame/Content/2dAssets/Loadingscreens/");
+ searchResults.Add("UI/Foundation/Textures/LoadingScreens/");
+ }
+ if (Properties.Settings.Default.UMTWeapons == true)
+ searchResults.Add("UI/Foundation/Textures/Icons/Weapons/Items/");
+ if (Properties.Settings.Default.UMTBanners == true)
+ {
+ 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 (Properties.Settings.Default.UMTFeaturedIMGs == true)
+ searchResults.Add("UI/Foundation/Textures/BattleRoyale/");
+ if (Properties.Settings.Default.UMTAthena == true)
+ searchResults.Add("UI/Foundation/Textures/Icons/Athena/");
+ if (Properties.Settings.Default.UMTAthena == true)
+ searchResults.Add("UI/Foundation/Textures/Icons/Athena/");
+ if (Properties.Settings.Default.UMTDevices == true)
+ searchResults.Add("UI/Foundation/Textures/Icons/Devices/");
+ if (Properties.Settings.Default.UMTVehicles == true)
+ searchResults.Add("UI/Foundation/Textures/Icons/Vehicles/");
+
+ for (int ii = 0; ii < theFile.Length; ii++)
+ {
+ bool b = searchResults.Any(s => theFile[ii].Contains(s));
+ if (b == true)
+ {
+ string filename = theFile[ii].Substring(theFile[ii].LastIndexOf("/") + 1);
+ if (filename.Contains(".uasset") || filename.Contains(".uexp") || filename.Contains(".ubulk"))
+ {
+ if (!diffToExtract.ContainsKey(filename.Substring(0, filename.LastIndexOf("."))))
+ diffToExtract.Add(filename.Substring(0, filename.LastIndexOf(".")), theFile[ii]);
+ }
+ }
+ CreatePath(PAKTreeView.Nodes, theFile[ii].Replace(theFile[ii].Split('/').Last(), ""));
+ }
+ }
private async void LoadButton_Click(object sender, EventArgs e)
{
isAllPAKs = false;
@@ -532,7 +602,7 @@ namespace FModel
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
AppendText("\nTime elapsed: " + elapsedTime, Color.Green, true, HorizontalAlignment.Right);
}
- if (enablePAKsDiffToolStripMenuItem.Checked == true)
+ if (enablePAKsDiffToolStripMenuItem.Checked == true && updateModeToolStripMenuItem.Checked == false)
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
@@ -667,6 +737,2909 @@ namespace FModel
}
LoadButton.Enabled = true;
+ stopWatch.Stop();
+ 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);
+ AppendText("\nTime elapsed: " + elapsedTime, Color.Green, true, HorizontalAlignment.Right);
+ }
+ if (updateModeToolStripMenuItem.Checked == true && enablePAKsDiffToolStripMenuItem.Checked == true)
+ {
+ if (!Directory.Exists(docPath + "\\Extracted\\")) //Create Extracted Subfolder
+ Directory.CreateDirectory(docPath + "\\Extracted\\");
+ if (!Directory.Exists(docPath + "\\UpdateMode Icons\\Textures\\")) //Create UpdateMode Icons Subfolder + Textures
+ Directory.CreateDirectory(docPath + "\\UpdateMode Icons\\Textures\\");
+
+ Stopwatch stopWatch = new Stopwatch();
+ stopWatch.Start();
+
+ isAllPAKs = true;
+ AllPAKsDict = new Dictionary();
+ Dictionary diffToExtract = new Dictionary();
+ PAKTreeView.Nodes.Clear();
+ ItemsListBox.Items.Clear();
+ File.WriteAllText("key.txt", AESKeyTextBox.Text.Substring(2));
+
+ LoadButton.Enabled = false;
+ for (int i = 0; i < AllPAKs.Count(); i++)
+ {
+ currentPAK = AllPAKs[i];
+ currentGUID = readPAKGuid(Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK);
+ if (currentGUID == "0-0-0-0")
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText("Loading ", Color.Black);
+ AppendText(currentPAK, Color.DarkRed, true);
+ await Task.Run(() => {
+ jwpmProcess("filelist \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + docPath + "\"");
+ });
+ if (!File.Exists(docPath + "\\" + currentPAK + ".txt"))
+ {
+ AppendText("✗", Color.Red);
+ AppendText(" Can't read ", Color.Black);
+ AppendText(currentPAK, Color.SteelBlue);
+ AppendText(" with this key", Color.Black, true);
+ }
+ else
+ {
+ if (!File.Exists(docPath + "\\FortnitePAKs.txt"))
+ {
+ File.Create(docPath + "\\FortnitePAKs.txt").Dispose();
+ }
+
+ string[] arr = File.ReadAllLines(docPath + "\\" + currentPAK + ".txt");
+ for (int ii = 0; ii < arr.Length; ii++)
+ {
+ if (currentPAK == "pakchunk0_s1-WindowsClient.pak" || currentPAK == "pakchunk0_s4-WindowsClient.pak" || currentPAK == "pakchunk0_s6-WindowsClient.pak" || currentPAK == "pakchunk0_s7-WindowsClient.pak" || currentPAK == "pakchunk1-WindowsClient.pak" || currentPAK == "pakchunk1_s1-WindowsClient.pak")
+ arr[ii] = "FortniteGame/Content/" + arr[ii];
+ if (currentPAK == "pakchunk0_s2-WindowsClient.pak")
+ arr[ii] = "FortniteGame/Content/Characters/Player/" + arr[ii];
+ if (currentPAK == "pakchunk0_s3-WindowsClient.pak")
+ arr[ii] = "FortniteGame/Content/Characters/Player/Male/" + arr[ii];
+ if (currentPAK == "pakchunk0_s5-WindowsClient.pak")
+ arr[ii] = "FortniteGame/Content/Environments/" + arr[ii];
+ if (currentPAK == "pakchunk0_s8-WindowsClient.pak")
+ arr[ii] = "FortniteGame/" + arr[ii];
+ if (currentPAK == "pakchunk5-WindowsClient.pak")
+ arr[ii] = "FortniteGame/Content/L10N/fr/" + arr[ii];
+ if (currentPAK == "pakchunk2-WindowsClient.pak")
+ arr[ii] = "FortniteGame/Content/L10N/de/" + arr[ii];
+ if (currentPAK == "pakchunk7-WindowsClient.pak")
+ arr[ii] = "FortniteGame/Content/L10N/pl/" + arr[ii];
+ if (currentPAK == "pakchunk8-WindowsClient.pak")
+ arr[ii] = "FortniteGame/Content/L10N/ru/" + arr[ii];
+ if (currentPAK == "pakchunk9-WindowsClient.pak")
+ arr[ii] = "FortniteGame/Content/L10N/zh-CN/" + arr[ii];
+
+ string filename = arr[ii].Substring(arr[ii].LastIndexOf("/") + 1);
+ if (filename.Contains(".uasset") || filename.Contains(".uexp") || filename.Contains(".ubulk"))
+ {
+ if (!AllPAKsDict.ContainsKey(filename.Substring(0, filename.LastIndexOf("."))))
+ {
+ AllPAKsDict.Add(filename.Substring(0, filename.LastIndexOf(".")), currentPAK);
+ }
+ }
+ else
+ {
+ if (!AllPAKsDict.ContainsKey(filename))
+ {
+ AllPAKsDict.Add(filename, currentPAK);
+ }
+ }
+ }
+ if (currentPAK == "pakchunk0_s1-WindowsClient.pak" || currentPAK == "pakchunk0_s4-WindowsClient.pak" || currentPAK == "pakchunk0_s6-WindowsClient.pak" || currentPAK == "pakchunk0_s7-WindowsClient.pak" || currentPAK == "pakchunk1-WindowsClient.pak" || currentPAK == "pakchunk1_s1-WindowsClient.pak")
+ AppendText("mount point: \"/FortniteGame/Content/\"", Color.Black, true);
+ if (currentPAK == "pakchunk0_s2-WindowsClient.pak")
+ AppendText("mount point: \"/FortniteGame/Content/Characters/Player/\"", Color.Black, true);
+ if (currentPAK == "pakchunk0_s3-WindowsClient.pak")
+ AppendText("mount point: \"/FortniteGame/Content/Characters/Player/Male/\"", Color.Black, true);
+ if (currentPAK == "pakchunk0_s5-WindowsClient.pak")
+ AppendText("mount point: \"/FortniteGame/Content/Environments/\"", Color.Black, true);
+ if (currentPAK == "pakchunk0_s8-WindowsClient.pak")
+ AppendText("mount point: \"/FortniteGame/\"", Color.Black, true);
+ if (currentPAK == "pakchunk5-WindowsClient.pak")
+ AppendText("mount point: \"/FortniteGame/Content/L10N/fr/\"", Color.Black, true);
+ if (currentPAK == "pakchunk2-WindowsClient.pak")
+ AppendText("mount point: \"/FortniteGame/Content/L10N/de/\"", Color.Black, true);
+ if (currentPAK == "pakchunk7-WindowsClient.pak")
+ AppendText("mount point: \"/FortniteGame/Content/L10N/pl/\"", Color.Black, true);
+ if (currentPAK == "pakchunk8-WindowsClient.pak")
+ AppendText("mount point: \"/FortniteGame/Content/L10N/ru/\"", Color.Black, true);
+ if (currentPAK == "pakchunk9-WindowsClient.pak")
+ AppendText("mount point: \"/FortniteGame/Content/L10N/zh-CN/\"", Color.Black, true);
+
+ File.AppendAllLines(docPath + "\\FortnitePAKs.txt", arr);
+ File.Delete(docPath + "\\" + currentPAK + ".txt");
+ }
+ }
+ }
+ if (File.Exists(docPath + "\\FortnitePAKs.txt"))
+ {
+ AppendText("Please wait...", Color.Black, true);
+ String[] linesB = File.ReadAllLines(docPath + "\\FortnitePAKs.txt");
+ File.Delete(docPath + "\\FortnitePAKs.txt");
+
+ OpenFileDialog theDialog = new OpenFileDialog();
+ theDialog.Title = "Choose your Backup PAK File";
+ theDialog.InitialDirectory = docPath;
+ theDialog.Multiselect = false;
+ theDialog.Filter = "TXT Files (*.txt)|*.txt|All Files (*.*)|*.*";
+
+ if (theDialog.ShowDialog() == DialogResult.OK)
+ {
+ String[] linesA = File.ReadAllLines(theDialog.FileName);
+ IEnumerable onlyB = linesB.Except(linesA);
+
+ AppendText("Comparing files...", Color.Black, true);
+ File.WriteAllLines(docPath + "\\Result.txt", onlyB);
+ }
+
+ PAKFileAsTXT = File.ReadAllLines(docPath + "\\Result.txt");
+ File.Delete(docPath + "\\Result.txt");
+
+ umFilter(PAKFileAsTXT, diffToExtract);
+ }
+ LoadButton.Enabled = true;
+
+ ExtractAssetButton.Enabled = false;
+ OpenImageButton.Enabled = false;
+ foreach (KeyValuePair entry in diffToExtract)
+ {
+ currentItem = entry.Key;
+
+ var files = Directory.GetFiles(docPath + "\\Extracted", currentItem + ".*", SearchOption.AllDirectories).Where(x => !x.EndsWith(".png")).FirstOrDefault();
+ if (!File.Exists(files))
+ {
+ await Task.Run(() =>
+ {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[currentItem] + "\" \"" + currentItem + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ files = Directory.GetFiles(docPath + "\\Extracted", currentItem + ".*", SearchOption.AllDirectories).Where(x => !x.EndsWith(".png")).FirstOrDefault();
+ }
+ if (files != null)
+ {
+ AppendText("", Color.Black, true);
+ AppendText("✔ ", Color.Green);
+ AppendText(currentItem, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(files.Substring(0, files.LastIndexOf('.')), Color.SteelBlue, true);
+
+ if (files.Contains(".uasset") || files.Contains(".uexp") || files.Contains(".ubulk"))
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(currentItem, Color.DarkRed);
+ AppendText(" is an ", Color.Black);
+ AppendText("asset", Color.SteelBlue, true);
+
+ if (Properties.Settings.Default.ExtractAndSerialize == true)
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("serialize \"" + files.Substring(0, files.LastIndexOf('.')) + "\"");
+ });
+ }
+ try
+ {
+ var filesJSON = Directory.GetFiles(docPath, currentItem + ".json", SearchOption.AllDirectories).FirstOrDefault();
+ if (filesJSON != null)
+ {
+ var json = JToken.Parse(File.ReadAllText(filesJSON)).ToString();
+ File.Delete(filesJSON);
+ AppendText("✔ ", Color.Green);
+ AppendText(currentItem, Color.DarkRed);
+ AppendText(" successfully serialized", Color.Black, true);
+ scintilla1.Text = json;
+
+ var IDParser = ItemsIdParser.FromJson(json);
+
+ if (filesJSON.Contains("Athena\\Items\\") && (filesJSON.Contains("Cosmetics") || filesJSON.Contains("Consumables") || filesJSON.Contains("Traps") || filesJSON.Contains("Gameplay") || filesJSON.Contains("Weapons") || filesJSON.Contains("CosmeticVariantTokens"))) //ASSET IS AN ID => CREATE ICON
+ {
+ AppendText("Parsing...", Color.Black, true);
+ for (int iii = 0; iii < IDParser.Length; iii++)
+ {
+ if (Properties.Settings.Default.UMCosmetics == true && (IDParser[iii].ExportType.Contains("Athena") && IDParser[iii].ExportType.Contains("Item") && IDParser[iii].ExportType.Contains("Definition")))
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(currentItem, Color.DarkRed);
+ AppendText(" is a ", Color.Black);
+ AppendText("Cosmetic ID", Color.SteelBlue);
+ AppendText(" file", Color.Black, true);
+
+ ItemName = IDParser[iii].DisplayName;
+ Bitmap bmp = new Bitmap(522, 522);
+ Graphics g = Graphics.FromImage(bmp);
+ g.TextRenderingHint = TextRenderingHint.AntiAlias;
+
+ getItemRarity(IDParser[iii], g);
+
+ string itemIconPath = string.Empty;
+ string catalogName = string.Empty;
+
+ if (Properties.Settings.Default.UMFeatured == false)
+ {
+ wasFeatured = false;
+ if (IDParser[iii].HeroDefinition != null)
+ {
+ var filesPath = Directory.GetFiles(docPath + "\\Extracted", IDParser[iii].HeroDefinition + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath))
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText("Extracting ", Color.Black);
+ AppendText(IDParser[iii].HeroDefinition, Color.DarkRed, true);
+
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[IDParser[iii].HeroDefinition] + "\" \"" + IDParser[iii].HeroDefinition + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ filesPath = Directory.GetFiles(docPath + "\\Extracted", IDParser[iii].HeroDefinition + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ try
+ {
+ if (filesPath != null)
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(IDParser[iii].HeroDefinition, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true);
+ try
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("serialize \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\"");
+ });
+ var filesJSON2 = Directory.GetFiles(docPath, IDParser[iii].HeroDefinition + ".json", SearchOption.AllDirectories).FirstOrDefault();
+ var json2 = JToken.Parse(File.ReadAllText(filesJSON2)).ToString();
+ File.Delete(filesJSON2);
+ AppendText("✔ ", Color.Green);
+ AppendText(IDParser[iii].HeroDefinition, Color.DarkRed);
+ AppendText(" successfully serialized", Color.Black, true);
+
+ var IDParser2 = ItemsIdParser.FromJson(json2);
+ for (int i1 = 0; i1 < IDParser2.Length; i1++)
+ {
+ if (IDParser2[i1].LargePreviewImage != null)
+ {
+ string textureFile = Path.GetFileName(IDParser2[i1].LargePreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser2[i1].LargePreviewImage.AssetPathName).LastIndexOf('.'));
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" detected as a ", Color.Black);
+ AppendText("Texture2D file", Color.SteelBlue, true);
+
+ var filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath2))
+ {
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ try
+ {
+ if (filesPath2 != null)
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath2.Substring(0, filesPath2.LastIndexOf('.')), Color.SteelBlue, true);
+
+ itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png";
+ if (!File.Exists(itemIconPath))
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("texture \"" + filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + "\"");
+ });
+ itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png";
+ }
+
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully converted to a PNG image with path ", Color.Black);
+ AppendText(itemIconPath, Color.SteelBlue, true);
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(textureFile, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true);
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(ex.Message);
+ }
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(IDParser[iii].HeroDefinition, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText(PAKsComboBox.SelectedItem.ToString(), Color.DarkRed, true);
+ }
+ }
+ else if (IDParser[iii].WeaponDefinition != null)
+ {
+ var filesPath = Directory.GetFiles(docPath + "\\Extracted", IDParser[iii].WeaponDefinition + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath))
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText("Extracting ", Color.Black);
+ AppendText(IDParser[iii].WeaponDefinition, Color.DarkRed, true);
+
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[IDParser[iii].WeaponDefinition] + "\" \"" + IDParser[iii].WeaponDefinition + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ filesPath = Directory.GetFiles(docPath + "\\Extracted", IDParser[iii].WeaponDefinition + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ try
+ {
+ if (filesPath != null)
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(IDParser[iii].WeaponDefinition, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true);
+ try
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("serialize \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\"");
+ });
+ var filesJSON2 = Directory.GetFiles(docPath, IDParser[iii].WeaponDefinition + ".json", SearchOption.AllDirectories).FirstOrDefault();
+ var json2 = JToken.Parse(File.ReadAllText(filesJSON2)).ToString();
+ File.Delete(filesJSON2);
+ AppendText("✔ ", Color.Green);
+ AppendText(IDParser[iii].WeaponDefinition, Color.DarkRed);
+ AppendText(" successfully serialized", Color.Black, true);
+
+ var IDParser2 = ItemsIdParser.FromJson(json2);
+ for (int i2 = 0; i2 < IDParser2.Length; i2++)
+ {
+ if (IDParser2[i2].LargePreviewImage != null)
+ {
+ string textureFile = Path.GetFileName(IDParser2[i2].LargePreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser2[i2].LargePreviewImage.AssetPathName).LastIndexOf('.'));
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" detected as a ", Color.Black);
+ AppendText("Texture2D file", Color.SteelBlue, true);
+
+ var filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath2))
+ {
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ try
+ {
+ if (filesPath2 != null)
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath2.Substring(0, filesPath2.LastIndexOf('.')), Color.SteelBlue, true);
+
+ itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png";
+ if (!File.Exists(itemIconPath))
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("texture \"" + filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + "\"");
+ });
+ itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png";
+ }
+
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully converted to a PNG image with path ", Color.Black);
+ AppendText(itemIconPath, Color.SteelBlue, true);
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(textureFile, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true);
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(ex.Message);
+ }
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(IDParser[iii].WeaponDefinition, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText(PAKsComboBox.SelectedItem.ToString(), Color.DarkRed, true);
+ }
+ }
+ else if (IDParser[iii].LargePreviewImage != null)
+ {
+ string textureFile = Path.GetFileName(IDParser[iii].LargePreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser[iii].LargePreviewImage.AssetPathName).LastIndexOf('.'));
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" detected as a ", Color.Black);
+ AppendText("Texture2D file", Color.SteelBlue, true);
+
+ var filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath))
+ {
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ try
+ {
+ if (filesPath != null)
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true);
+
+ itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png";
+ if (!File.Exists(itemIconPath))
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("texture \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\"");
+ });
+ itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png";
+ }
+
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully converted to a PNG image with path ", Color.Black);
+ AppendText(itemIconPath, Color.SteelBlue, true);
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(textureFile, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true);
+ }
+ }
+ else if (IDParser[iii].SmallPreviewImage != null)
+ {
+ string textureFile = Path.GetFileName(IDParser[iii].SmallPreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser[iii].SmallPreviewImage.AssetPathName).LastIndexOf('.'));
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" detected as a ", Color.Black);
+ AppendText("Texture2D file", Color.SteelBlue, true);
+
+ var filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath))
+ {
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ try
+ {
+ if (filesPath != null)
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true);
+
+ itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png";
+ if (!File.Exists(itemIconPath))
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("texture \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\"");
+ });
+ itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png";
+ }
+
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully converted to a PNG image with path ", Color.Black);
+ AppendText(itemIconPath, Color.SteelBlue, true);
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(textureFile, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true);
+ }
+ }
+ }
+ if (Properties.Settings.Default.UMFeatured == true)
+ {
+ if (IDParser[iii].DisplayAssetPath != null && IDParser[iii].DisplayAssetPath.AssetPathName.Contains("/Game/Catalog/DisplayAssets/") && IDParser[iii].ExportType == "AthenaCharacterItemDefinition")
+ {
+ wasFeatured = true;
+ catalogName = IDParser[iii].DisplayAssetPath.AssetPathName;
+ var filesPath = Directory.GetFiles(docPath + "\\Extracted", catalogName.Substring(catalogName.LastIndexOf('.') + 1) + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath))
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText("Extracting ", Color.Black);
+ AppendText(catalogName.Substring(catalogName.LastIndexOf('.') + 1), Color.DarkRed, true);
+
+ await Task.Run(() =>
+ {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[catalogName.Substring(catalogName.LastIndexOf('.') + 1)] + "\" \"" + catalogName.Substring(catalogName.LastIndexOf('.') + 1) + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ filesPath = Directory.GetFiles(docPath + "\\Extracted", catalogName.Substring(catalogName.LastIndexOf('.') + 1) + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ try
+ {
+ if (filesPath != null)
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(catalogName.Substring(catalogName.LastIndexOf('.') + 1), Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true);
+ try
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("serialize \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\"");
+ });
+ var filesJSON2 = Directory.GetFiles(docPath, catalogName.Substring(catalogName.LastIndexOf('.') + 1) + ".json", SearchOption.AllDirectories).FirstOrDefault();
+ var json2 = JToken.Parse(File.ReadAllText(filesJSON2)).ToString();
+ File.Delete(filesJSON2);
+ AppendText("✔ ", Color.Green);
+ AppendText(catalogName.Substring(catalogName.LastIndexOf('.') + 1), Color.DarkRed);
+ AppendText(" successfully serialized", Color.Black, true);
+
+ var IDParser2 = FeaturedParser.FromJson(json2);
+ for (int i1 = 0; i1 < IDParser2.Length; i1++)
+ {
+ if (IDParser2[i1].DetailsImage != null)
+ {
+ string textureFile = IDParser2[i1].DetailsImage.ResourceObject;
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" detected as a ", Color.Black);
+ AppendText("Texture2D file", Color.SteelBlue, true);
+
+ var filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath2))
+ {
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ try
+ {
+ if (filesPath2 != null && filesPath2.Contains("MI_UI_FeaturedRenderSwitch_"))
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath2.Substring(0, filesPath2.LastIndexOf('.')), Color.SteelBlue, true);
+ try
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("serialize \"" + filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + "\"");
+ });
+ var filesJSON3 = Directory.GetFiles(docPath, textureFile + ".json", SearchOption.AllDirectories).FirstOrDefault();
+ var json3 = JToken.Parse(File.ReadAllText(filesJSON3)).ToString();
+ File.Delete(filesJSON3);
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully serialized", Color.Black, true);
+
+ var RenderParser = RenderSwitchMaterial.FromJson(json3);
+ for (int i2 = 0; i2 < RenderParser.Length; i2++)
+ {
+ if (RenderParser[i2].TextureParameterValues.FirstOrDefault().ParameterValue != null)
+ {
+ string textureFile2 = RenderParser[i2].TextureParameterValues.FirstOrDefault().ParameterValue;
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile2, Color.DarkRed);
+ AppendText(" detected as a ", Color.Black);
+ AppendText("Texture2D file", Color.SteelBlue, true);
+
+ var filesPath3 = Directory.GetFiles(docPath + "\\Extracted", textureFile2 + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath3))
+ {
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile2] + "\" \"" + textureFile2 + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ filesPath3 = Directory.GetFiles(docPath + "\\Extracted", textureFile2 + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ try
+ {
+ if (filesPath3 != null)
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile2, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath3.Substring(0, filesPath3.LastIndexOf('.')), Color.SteelBlue, true);
+
+ itemIconPath = filesPath3.Substring(0, filesPath3.LastIndexOf('.')) + ".png";
+ if (!File.Exists(itemIconPath))
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("texture \"" + filesPath3.Substring(0, filesPath3.LastIndexOf('.')) + "\"");
+ });
+ itemIconPath = filesPath3.Substring(0, filesPath3.LastIndexOf('.')) + ".png";
+ }
+
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile2, Color.DarkRed);
+ AppendText(" successfully converted to a PNG image with path ", Color.Black);
+ AppendText(itemIconPath, Color.SteelBlue, true);
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(textureFile2, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true);
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(ex.Message);
+ }
+ }
+ else if (filesPath2 != null && !filesPath2.Contains("MI_UI_FeaturedRenderSwitch_"))
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath2.Substring(0, filesPath2.LastIndexOf('.')), Color.SteelBlue, true);
+
+ itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png";
+ if (!File.Exists(itemIconPath))
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("texture \"" + filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + "\"");
+ });
+ itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png";
+ }
+
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully converted to a PNG image with path ", Color.Black);
+ AppendText(itemIconPath, Color.SteelBlue, true);
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(textureFile, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true);
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(ex.Message);
+ }
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(catalogName.Substring(catalogName.LastIndexOf('.') + 1), Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText(PAKsComboBox.SelectedItem.ToString(), Color.DarkRed, true);
+ }
+ }
+ else if (IDParser[iii].DisplayAssetPath == null && IDParser[iii].ExportType == "AthenaCharacterItemDefinition")
+ {
+ var files2 = Directory.GetFiles(docPath + "\\Extracted", "DA_Featured_" + currentItem + ".*", SearchOption.AllDirectories).Where(x => !x.EndsWith(".png")).FirstOrDefault();
+ if (!File.Exists(files2))
+ {
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict["DA_Featured_" + currentItem] + "\" \"" + "DA_Featured_" + currentItem + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ files2 = Directory.GetFiles(docPath + "\\Extracted", "DA_Featured_" + currentItem + ".*", SearchOption.AllDirectories).Where(x => !x.EndsWith(".png")).FirstOrDefault();
+ }
+ try
+ {
+ if (files2 != null)
+ {
+ wasFeatured = true;
+ AppendText("✔ ", Color.Green);
+ AppendText("DA_Featured_" + currentItem, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(files2.Substring(0, files2.LastIndexOf('.')), Color.SteelBlue, true);
+ try
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("serialize \"" + files2.Substring(0, files2.LastIndexOf('.')) + "\"");
+ });
+ var filesJSON2 = Directory.GetFiles(docPath, "DA_Featured_" + currentItem + ".json", SearchOption.AllDirectories).FirstOrDefault();
+ var json2 = JToken.Parse(File.ReadAllText(filesJSON2)).ToString();
+ File.Delete(filesJSON2);
+ AppendText("✔ ", Color.Green);
+ AppendText("DA_Featured_" + currentItem, Color.DarkRed);
+ AppendText(" successfully serialized", Color.Black, true);
+
+ var IDParser2 = FeaturedParser.FromJson(json2);
+ for (int i1 = 0; i1 < IDParser2.Length; i1++)
+ {
+ if (IDParser2[i1].DetailsImage != null)
+ {
+ string textureFile = IDParser2[i1].DetailsImage.ResourceObject;
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" detected as a ", Color.Black);
+ AppendText("Texture2D file", Color.SteelBlue, true);
+
+ var filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath2))
+ {
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ try
+ {
+ if (filesPath2 != null && filesPath2.Contains("MI_UI_FeaturedRenderSwitch_"))
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath2.Substring(0, filesPath2.LastIndexOf('.')), Color.SteelBlue, true);
+ try
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("serialize \"" + filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + "\"");
+ });
+ var filesJSON3 = Directory.GetFiles(docPath, textureFile + ".json", SearchOption.AllDirectories).FirstOrDefault();
+ var json3 = JToken.Parse(File.ReadAllText(filesJSON3)).ToString();
+ File.Delete(filesJSON3);
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully serialized", Color.Black, true);
+
+ var RenderParser = RenderSwitchMaterial.FromJson(json3);
+ for (int i2 = 0; i2 < RenderParser.Length; i2++)
+ {
+ if (RenderParser[i2].TextureParameterValues.FirstOrDefault().ParameterValue != null)
+ {
+ string textureFile2 = RenderParser[i2].TextureParameterValues.FirstOrDefault().ParameterValue;
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile2, Color.DarkRed);
+ AppendText(" detected as a ", Color.Black);
+ AppendText("Texture2D file", Color.SteelBlue, true);
+
+ var filesPath3 = Directory.GetFiles(docPath + "\\Extracted", textureFile2 + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath3))
+ {
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile2] + "\" \"" + textureFile2 + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ filesPath3 = Directory.GetFiles(docPath + "\\Extracted", textureFile2 + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ try
+ {
+ if (filesPath3 != null)
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile2, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath3.Substring(0, filesPath3.LastIndexOf('.')), Color.SteelBlue, true);
+
+ itemIconPath = filesPath3.Substring(0, filesPath3.LastIndexOf('.')) + ".png";
+ if (!File.Exists(itemIconPath))
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("texture \"" + filesPath3.Substring(0, filesPath3.LastIndexOf('.')) + "\"");
+ });
+ itemIconPath = filesPath3.Substring(0, filesPath3.LastIndexOf('.')) + ".png";
+ }
+
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile2, Color.DarkRed);
+ AppendText(" successfully converted to a PNG image with path ", Color.Black);
+ AppendText(itemIconPath, Color.SteelBlue, true);
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(textureFile2, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true);
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(ex.Message);
+ }
+ }
+ else if (filesPath2 != null && !filesPath2.Contains("MI_UI_FeaturedRenderSwitch_"))
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath2.Substring(0, filesPath2.LastIndexOf('.')), Color.SteelBlue, true);
+
+ itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png";
+ if (!File.Exists(itemIconPath))
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("texture \"" + filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + "\"");
+ });
+ itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png";
+ }
+
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully converted to a PNG image with path ", Color.Black);
+ AppendText(itemIconPath, Color.SteelBlue, true);
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(textureFile, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true);
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(ex.Message);
+ }
+ }
+ else
+ {
+ wasFeatured = false;
+ if (IDParser[iii].HeroDefinition != null)
+ {
+ var filesPath = Directory.GetFiles(docPath + "\\Extracted", IDParser[iii].HeroDefinition + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath))
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText("Extracting ", Color.Black);
+ AppendText(IDParser[iii].HeroDefinition, Color.DarkRed, true);
+
+ if (isAllPAKs == false)
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + IDParser[iii].HeroDefinition + "\" \"" + docPath + "\"");
+ });
+ }
+ if (isAllPAKs == true)
+ {
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[IDParser[iii].HeroDefinition] + "\" \"" + IDParser[iii].HeroDefinition + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ }
+ filesPath = Directory.GetFiles(docPath + "\\Extracted", IDParser[iii].HeroDefinition + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ try
+ {
+ if (filesPath != null)
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(IDParser[iii].HeroDefinition, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true);
+ try
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("serialize \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\"");
+ });
+ var filesJSON2 = Directory.GetFiles(docPath, IDParser[iii].HeroDefinition + ".json", SearchOption.AllDirectories).FirstOrDefault();
+ var json2 = JToken.Parse(File.ReadAllText(filesJSON2)).ToString();
+ File.Delete(filesJSON2);
+ AppendText("✔ ", Color.Green);
+ AppendText(IDParser[iii].HeroDefinition, Color.DarkRed);
+ AppendText(" successfully serialized", Color.Black, true);
+
+ var IDParser2 = ItemsIdParser.FromJson(json2);
+ for (int i1 = 0; i1 < IDParser2.Length; i1++)
+ {
+ if (IDParser2[i1].LargePreviewImage != null)
+ {
+ string textureFile = Path.GetFileName(IDParser2[i1].LargePreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser2[i1].LargePreviewImage.AssetPathName).LastIndexOf('.'));
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" detected as a ", Color.Black);
+ AppendText("Texture2D file", Color.SteelBlue, true);
+
+ var filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath2))
+ {
+ if (currentGUID != "0-0-0-0")
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ });
+ filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ else
+ {
+ if (isAllPAKs == false)
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\pakchunk0_s7-WindowsClient.pak" + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ });
+ }
+ if (isAllPAKs == true)
+ {
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ }
+ filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ }
+ try
+ {
+ if (filesPath2 != null)
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath2.Substring(0, filesPath2.LastIndexOf('.')), Color.SteelBlue, true);
+
+ itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png";
+ if (!File.Exists(itemIconPath))
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("texture \"" + filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + "\"");
+ });
+ itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png";
+ }
+
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully converted to a PNG image with path ", Color.Black);
+ AppendText(itemIconPath, Color.SteelBlue, true);
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(textureFile, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true);
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(ex.Message);
+ }
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(IDParser[iii].HeroDefinition, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText(PAKsComboBox.SelectedItem.ToString(), Color.DarkRed, true);
+ }
+ }
+ else if (IDParser[iii].WeaponDefinition != null)
+ {
+ var filesPath = Directory.GetFiles(docPath + "\\Extracted", IDParser[iii].WeaponDefinition + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath))
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText("Extracting ", Color.Black);
+ AppendText(IDParser[iii].WeaponDefinition, Color.DarkRed, true);
+
+ if (isAllPAKs == false)
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + IDParser[iii].WeaponDefinition + "\" \"" + docPath + "\"");
+ });
+ }
+ if (isAllPAKs == true)
+ {
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[IDParser[iii].WeaponDefinition] + "\" \"" + IDParser[iii].WeaponDefinition + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ }
+ filesPath = Directory.GetFiles(docPath + "\\Extracted", IDParser[iii].WeaponDefinition + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ try
+ {
+ if (filesPath != null)
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(IDParser[iii].WeaponDefinition, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true);
+ try
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("serialize \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\"");
+ });
+ var filesJSON2 = Directory.GetFiles(docPath, IDParser[iii].WeaponDefinition + ".json", SearchOption.AllDirectories).FirstOrDefault();
+ var json2 = JToken.Parse(File.ReadAllText(filesJSON2)).ToString();
+ File.Delete(filesJSON2);
+ AppendText("✔ ", Color.Green);
+ AppendText(IDParser[iii].WeaponDefinition, Color.DarkRed);
+ AppendText(" successfully serialized", Color.Black, true);
+
+ var IDParser2 = ItemsIdParser.FromJson(json2);
+ for (int i2 = 0; i2 < IDParser2.Length; i2++)
+ {
+ if (IDParser2[i2].LargePreviewImage != null)
+ {
+ string textureFile = Path.GetFileName(IDParser2[i2].LargePreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser2[i2].LargePreviewImage.AssetPathName).LastIndexOf('.'));
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" detected as a ", Color.Black);
+ AppendText("Texture2D file", Color.SteelBlue, true);
+
+ var filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath2))
+ {
+ if (currentGUID != "0-0-0-0")
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ });
+ filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ else
+ {
+ if (isAllPAKs == false)
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\pakchunk0_s7-WindowsClient.pak" + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ });
+ }
+ if (isAllPAKs == true)
+ {
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ }
+ filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ }
+ try
+ {
+ if (filesPath2 != null)
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath2.Substring(0, filesPath2.LastIndexOf('.')), Color.SteelBlue, true);
+
+ itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png";
+ if (!File.Exists(itemIconPath))
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("texture \"" + filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + "\"");
+ });
+ itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png";
+ }
+
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully converted to a PNG image with path ", Color.Black);
+ AppendText(itemIconPath, Color.SteelBlue, true);
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(textureFile, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true);
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(ex.Message);
+ }
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(IDParser[iii].WeaponDefinition, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText(PAKsComboBox.SelectedItem.ToString(), Color.DarkRed, true);
+ }
+ }
+ else if (IDParser[iii].LargePreviewImage != null)
+ {
+ string textureFile = Path.GetFileName(IDParser[iii].LargePreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser[iii].LargePreviewImage.AssetPathName).LastIndexOf('.'));
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" detected as a ", Color.Black);
+ AppendText("Texture2D file", Color.SteelBlue, true);
+
+ var filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath))
+ {
+ if (currentGUID != "0-0-0-0") //DYNAMIC PAK
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ });
+ filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ else //NORMAL PAK
+ {
+ if (isAllPAKs == false)
+ {
+ await Task.Run(() =>
+ {
+ if (IDParser[iii].LargePreviewImage.AssetPathName.Contains("/Game/2dAssets/"))
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\pakchunk0-WindowsClient.pak" + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ }
+ else if (IDParser[iii].LargePreviewImage.AssetPathName.Contains("/Game/Athena/TestAssets/") || IDParser[iii].LargePreviewImage.AssetPathName.Contains("/Game/Athena/Prototype/") || IDParser[iii].LargePreviewImage.AssetPathName.Contains("/Game/Athena/Items/"))
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ }
+ else
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\pakchunk0_s7-WindowsClient.pak" + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ }
+ });
+ }
+ if (isAllPAKs == true)
+ {
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ }
+ filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ }
+ try
+ {
+ if (filesPath != null)
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true);
+
+ itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png";
+ if (!File.Exists(itemIconPath))
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("texture \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\"");
+ });
+ itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png";
+ }
+
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully converted to a PNG image with path ", Color.Black);
+ AppendText(itemIconPath, Color.SteelBlue, true);
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(textureFile, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true);
+ }
+ }
+ else if (IDParser[iii].SmallPreviewImage != null)
+ {
+ string textureFile = Path.GetFileName(IDParser[iii].SmallPreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser[iii].SmallPreviewImage.AssetPathName).LastIndexOf('.'));
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" detected as a ", Color.Black);
+ AppendText("Texture2D file", Color.SteelBlue, true);
+
+ var filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath))
+ {
+ if (currentGUID != "0-0-0-0")
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ });
+ filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ else
+ {
+ if (isAllPAKs == false)
+ {
+ await Task.Run(() =>
+ {
+ if (IDParser[iii].SmallPreviewImage.AssetPathName.Contains("/Game/2dAssets/"))
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\pakchunk0-WindowsClient.pak" + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ }
+ else if (IDParser[iii].SmallPreviewImage.AssetPathName.Contains("/Game/Athena/TestAssets/") || IDParser[iii].SmallPreviewImage.AssetPathName.Contains("/Game/Athena/Prototype/") || IDParser[iii].SmallPreviewImage.AssetPathName.Contains("/Game/Athena/Items/"))
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + currentPAK + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ }
+ else
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\pakchunk0_s7-WindowsClient.pak" + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ }
+ });
+ }
+ if (isAllPAKs == true)
+ {
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ }
+ filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ }
+ try
+ {
+ if (filesPath != null)
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true);
+
+ itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png";
+ if (!File.Exists(itemIconPath))
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("texture \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\"");
+ });
+ itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png";
+ }
+
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully converted to a PNG image with path ", Color.Black);
+ AppendText(itemIconPath, Color.SteelBlue, true);
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(textureFile, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true);
+ }
+ }
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText("DA_Featured_" + currentItem, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText(PAKsComboBox.SelectedItem.ToString(), Color.DarkRed, true);
+ }
+ }
+ else
+ {
+ wasFeatured = false;
+ if (IDParser[iii].HeroDefinition != null)
+ {
+ var filesPath = Directory.GetFiles(docPath + "\\Extracted", IDParser[iii].HeroDefinition + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath))
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText("Extracting ", Color.Black);
+ AppendText(IDParser[iii].HeroDefinition, Color.DarkRed, true);
+
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[IDParser[iii].HeroDefinition] + "\" \"" + IDParser[iii].HeroDefinition + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ filesPath = Directory.GetFiles(docPath + "\\Extracted", IDParser[iii].HeroDefinition + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ try
+ {
+ if (filesPath != null)
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(IDParser[iii].HeroDefinition, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true);
+ try
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("serialize \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\"");
+ });
+ var filesJSON2 = Directory.GetFiles(docPath, IDParser[iii].HeroDefinition + ".json", SearchOption.AllDirectories).FirstOrDefault();
+ var json2 = JToken.Parse(File.ReadAllText(filesJSON2)).ToString();
+ File.Delete(filesJSON2);
+ AppendText("✔ ", Color.Green);
+ AppendText(IDParser[iii].HeroDefinition, Color.DarkRed);
+ AppendText(" successfully serialized", Color.Black, true);
+
+ var IDParser2 = ItemsIdParser.FromJson(json2);
+ for (int i1 = 0; i1 < IDParser2.Length; i1++)
+ {
+ if (IDParser2[i1].LargePreviewImage != null)
+ {
+ string textureFile = Path.GetFileName(IDParser2[i1].LargePreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser2[i1].LargePreviewImage.AssetPathName).LastIndexOf('.'));
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" detected as a ", Color.Black);
+ AppendText("Texture2D file", Color.SteelBlue, true);
+
+ var filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath2))
+ {
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ try
+ {
+ if (filesPath2 != null)
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath2.Substring(0, filesPath2.LastIndexOf('.')), Color.SteelBlue, true);
+
+ itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png";
+ if (!File.Exists(itemIconPath))
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("texture \"" + filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + "\"");
+ });
+ itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png";
+ }
+
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully converted to a PNG image with path ", Color.Black);
+ AppendText(itemIconPath, Color.SteelBlue, true);
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(textureFile, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true);
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(ex.Message);
+ }
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(IDParser[iii].HeroDefinition, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText(PAKsComboBox.SelectedItem.ToString(), Color.DarkRed, true);
+ }
+ }
+ else if (IDParser[iii].WeaponDefinition != null)
+ {
+ var filesPath = Directory.GetFiles(docPath + "\\Extracted", IDParser[iii].WeaponDefinition + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath))
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText("Extracting ", Color.Black);
+ AppendText(IDParser[iii].WeaponDefinition, Color.DarkRed, true);
+
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[IDParser[iii].WeaponDefinition] + "\" \"" + IDParser[iii].WeaponDefinition + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ filesPath = Directory.GetFiles(docPath + "\\Extracted", IDParser[iii].WeaponDefinition + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ try
+ {
+ if (filesPath != null)
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(IDParser[iii].WeaponDefinition, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true);
+ try
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("serialize \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\"");
+ });
+ var filesJSON2 = Directory.GetFiles(docPath, IDParser[iii].WeaponDefinition + ".json", SearchOption.AllDirectories).FirstOrDefault();
+ var json2 = JToken.Parse(File.ReadAllText(filesJSON2)).ToString();
+ File.Delete(filesJSON2);
+ AppendText("✔ ", Color.Green);
+ AppendText(IDParser[iii].WeaponDefinition, Color.DarkRed);
+ AppendText(" successfully serialized", Color.Black, true);
+
+ var IDParser2 = ItemsIdParser.FromJson(json2);
+ for (int i2 = 0; i2 < IDParser2.Length; i2++)
+ {
+ if (IDParser2[i2].LargePreviewImage != null)
+ {
+ string textureFile = Path.GetFileName(IDParser2[i2].LargePreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser2[i2].LargePreviewImage.AssetPathName).LastIndexOf('.'));
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" detected as a ", Color.Black);
+ AppendText("Texture2D file", Color.SteelBlue, true);
+
+ var filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath2))
+ {
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ filesPath2 = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ try
+ {
+ if (filesPath2 != null)
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath2.Substring(0, filesPath2.LastIndexOf('.')), Color.SteelBlue, true);
+
+ itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png";
+ if (!File.Exists(itemIconPath))
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("texture \"" + filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + "\"");
+ });
+ itemIconPath = filesPath2.Substring(0, filesPath2.LastIndexOf('.')) + ".png";
+ }
+
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully converted to a PNG image with path ", Color.Black);
+ AppendText(itemIconPath, Color.SteelBlue, true);
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(textureFile, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true);
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(ex.Message);
+ }
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(IDParser[iii].WeaponDefinition, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText(PAKsComboBox.SelectedItem.ToString(), Color.DarkRed, true);
+ }
+ }
+ else if (IDParser[iii].LargePreviewImage != null)
+ {
+ string textureFile = Path.GetFileName(IDParser[iii].LargePreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser[iii].LargePreviewImage.AssetPathName).LastIndexOf('.'));
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" detected as a ", Color.Black);
+ AppendText("Texture2D file", Color.SteelBlue, true);
+
+ var filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath))
+ {
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ try
+ {
+ if (filesPath != null)
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true);
+
+ itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png";
+ if (!File.Exists(itemIconPath))
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("texture \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\"");
+ });
+ itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png";
+ }
+
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully converted to a PNG image with path ", Color.Black);
+ AppendText(itemIconPath, Color.SteelBlue, true);
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(textureFile, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true);
+ }
+ }
+ else if (IDParser[iii].SmallPreviewImage != null)
+ {
+ string textureFile = Path.GetFileName(IDParser[iii].SmallPreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser[iii].SmallPreviewImage.AssetPathName).LastIndexOf('.'));
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" detected as a ", Color.Black);
+ AppendText("Texture2D file", Color.SteelBlue, true);
+
+ var filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath))
+ {
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ try
+ {
+ if (filesPath != null)
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true);
+
+ itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png";
+ if (!File.Exists(itemIconPath))
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("texture \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\"");
+ });
+ itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png";
+ }
+
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully converted to a PNG image with path ", Color.Black);
+ AppendText(itemIconPath, Color.SteelBlue, true);
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(textureFile, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true);
+ }
+ }
+ }
+ }
+
+ if (File.Exists(itemIconPath))
+ {
+ Image ItemIcon = Image.FromFile(itemIconPath);
+ g.DrawImage(ResizeImage(ItemIcon, 512, 512), new Point(5, 5));
+ }
+ else
+ {
+ Image ItemIcon = Properties.Resources.unknown512;
+ g.DrawImage(ItemIcon, new Point(0, 0));
+ }
+
+ if (Properties.Settings.Default.UMWatermark == true && !string.IsNullOrEmpty(Properties.Settings.Default.UMFilename))
+ {
+ Image watermark = Image.FromFile(Properties.Settings.Default.UMFilename);
+ var opacityImage = SetImageOpacity(watermark, (float)Properties.Settings.Default.UMOpacity / 100);
+ g.DrawImage(ResizeImage(opacityImage, Properties.Settings.Default.UMSize, Properties.Settings.Default.UMSize), (522 - Properties.Settings.Default.UMSize) / 2, (522 - Properties.Settings.Default.UMSize) / 2, Properties.Settings.Default.UMSize, Properties.Settings.Default.UMSize);
+ }
+
+ Image bg512 = Properties.Resources.BG512;
+ g.DrawImage(bg512, new Point(5, 383));
+
+ try
+ {
+ g.DrawString(ItemName, new Font(pfc.Families[0], 35), new SolidBrush(Color.White), new Point(522 / 2, 395), centeredString);
+ }
+ catch (NullReferenceException)
+ {
+ AppendText("[NullReferenceException] ", Color.Red);
+ AppendText("No ", Color.Black);
+ AppendText("DisplayName ", Color.SteelBlue);
+ AppendText("found", Color.Black, true);
+ } //NAME
+ try
+ {
+ g.DrawString(IDParser[iii].Description, new Font("Arial", 10), new SolidBrush(Color.White), new Point(522 / 2, 465), centeredStringLine);
+ }
+ catch (NullReferenceException)
+ {
+ AppendText("[NullReferenceException] ", Color.Red);
+ AppendText("No ", Color.Black);
+ AppendText("Description ", Color.SteelBlue);
+ AppendText("found", Color.Black, true);
+ } //DESCRIPTION
+ try
+ {
+ g.DrawString(IDParser[iii].ShortDescription, new Font(pfc.Families[0], 13), new SolidBrush(Color.White), new Point(5, 500));
+ }
+ catch (NullReferenceException)
+ {
+ AppendText("[NullReferenceException] ", Color.Red);
+ AppendText("No ", Color.Black);
+ AppendText("ShortDescription ", Color.SteelBlue);
+ AppendText("found", Color.Black, true);
+ } //TYPE
+ try
+ {
+ g.DrawString(IDParser[iii].GameplayTags.GameplayTagsGameplayTags[Array.FindIndex(IDParser[iii].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("[NullReferenceException] ", Color.Red);
+ AppendText("No ", Color.Black);
+ AppendText("GameplayTags ", Color.SteelBlue);
+ AppendText("found", Color.Black, true);
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", 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
+
+ ItemIconPictureBox.Image = bmp;
+ string nameToSave;
+ if (wasFeatured == true)
+ {
+ nameToSave = catalogName.Substring(catalogName.LastIndexOf('.') + 1);
+ }
+ else
+ {
+ nameToSave = currentItem;
+ }
+
+ ItemIconPictureBox.Image.Save(docPath + "\\UpdateMode Icons\\" + nameToSave + ".png", ImageFormat.Png);
+
+ AppendText("✔ ", Color.Green);
+ AppendText(nameToSave, Color.DarkRed);
+ AppendText(" successfully saved to ", Color.Black);
+ AppendText(docPath + "\\UpdateMode Icons\\" + nameToSave + ".png", Color.SteelBlue, true);
+ } //Cosmetics
+ if (Properties.Settings.Default.UMConsumablesWeapons == true && (IDParser[iii].ExportType.Contains("FortWeaponRangedItemDefinition") || IDParser[iii].ExportType.Contains("FortWeaponMeleeItemDefinition")))
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(currentItem, Color.DarkRed);
+ AppendText(" is an ", Color.Black);
+ AppendText("ID", Color.SteelBlue);
+ AppendText(" file", Color.Black, true);
+
+ ItemName = IDParser[iii].DisplayName;
+ Bitmap bmp = new Bitmap(522, 522);
+ Graphics g = Graphics.FromImage(bmp);
+ g.TextRenderingHint = TextRenderingHint.AntiAlias;
+
+ getItemRarity(IDParser[iii], g);
+
+ string itemIconPath = string.Empty;
+
+ if (IDParser[iii].LargePreviewImage != null)
+ {
+ string textureFile = Path.GetFileName(IDParser[iii].LargePreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser[iii].LargePreviewImage.AssetPathName).LastIndexOf('.'));
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" detected as a ", Color.Black);
+ AppendText("Texture2D file", Color.SteelBlue, true);
+
+ var filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath))
+ {
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ try
+ {
+ if (filesPath != null)
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true);
+
+ itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png";
+ if (!File.Exists(itemIconPath))
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("texture \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\"");
+ });
+ itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png";
+ }
+
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully converted to a PNG image with path ", Color.Black);
+ AppendText(itemIconPath, Color.SteelBlue, true);
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(textureFile, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true);
+ }
+ }
+ else if (IDParser[iii].SmallPreviewImage != null)
+ {
+ string textureFile = Path.GetFileName(IDParser[iii].SmallPreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser[iii].SmallPreviewImage.AssetPathName).LastIndexOf('.'));
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" detected as a ", Color.Black);
+ AppendText("Texture2D file", Color.SteelBlue, true);
+
+ var filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath))
+ {
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ try
+ {
+ if (filesPath != null)
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true);
+
+ itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png";
+ if (!File.Exists(itemIconPath))
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("texture \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\"");
+ });
+ itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png";
+ }
+
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully converted to a PNG image with path ", Color.Black);
+ AppendText(itemIconPath, Color.SteelBlue, true);
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(textureFile, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true);
+ }
+ }
+
+ if (File.Exists(itemIconPath))
+ {
+ Image ItemIcon = Image.FromFile(itemIconPath);
+ g.DrawImage(ResizeImage(ItemIcon, 512, 512), new Point(5, 5));
+ }
+ else
+ {
+ Image ItemIcon = Properties.Resources.unknown512;
+ g.DrawImage(ItemIcon, new Point(0, 0));
+ }
+
+ if (Properties.Settings.Default.UMWatermark == true && !string.IsNullOrEmpty(Properties.Settings.Default.UMFilename))
+ {
+ Image watermark = Image.FromFile(Properties.Settings.Default.UMFilename);
+ var opacityImage = SetImageOpacity(watermark, (float)Properties.Settings.Default.UMOpacity / 100);
+ g.DrawImage(ResizeImage(opacityImage, Properties.Settings.Default.UMSize, Properties.Settings.Default.UMSize), (522 - Properties.Settings.Default.UMSize) / 2, (522 - Properties.Settings.Default.UMSize) / 2, Properties.Settings.Default.UMSize, Properties.Settings.Default.UMSize);
+ }
+
+ Image bg512 = Properties.Resources.BG512;
+ g.DrawImage(bg512, new Point(5, 383));
+
+ try
+ {
+ g.DrawString(ItemName, new Font(pfc.Families[0], 35), new SolidBrush(Color.White), new Point(522 / 2, 395), centeredString);
+ }
+ catch (NullReferenceException)
+ {
+ AppendText("[NullReferenceException] ", Color.Red);
+ AppendText("No ", Color.Black);
+ AppendText("DisplayName ", Color.SteelBlue);
+ AppendText("found", Color.Black, true);
+ } //NAME
+ try
+ {
+ g.DrawString(IDParser[iii].Description, new Font("Arial", 10), new SolidBrush(Color.White), new Point(522 / 2, 465), centeredStringLine);
+ }
+ catch (NullReferenceException)
+ {
+ AppendText("[NullReferenceException] ", Color.Red);
+ AppendText("No ", Color.Black);
+ AppendText("Description ", Color.SteelBlue);
+ AppendText("found", Color.Black, true);
+ } //DESCRIPTION
+ try
+ {
+ g.DrawString(IDParser[iii].GameplayTags.GameplayTagsGameplayTags[Array.FindIndex(IDParser[iii].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("[NullReferenceException] ", Color.Red);
+ AppendText("No ", Color.Black);
+ AppendText("GameplayTags ", Color.SteelBlue);
+ AppendText("found", Color.Black, true);
+ }
+ catch (IndexOutOfRangeException)
+ {
+ try
+ {
+ g.DrawString(IDParser[iii].GameplayTags.GameplayTagsGameplayTags[Array.FindIndex(IDParser[iii].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("[NullReferenceException] ", Color.Red);
+ AppendText("No ", Color.Black);
+ AppendText("GameplayTags ", Color.SteelBlue);
+ AppendText("found", Color.Black, true);
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", 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
+
+ ItemIconPictureBox.Image = bmp;
+
+ string nameToSave;
+ nameToSave = currentItem;
+
+ ItemIconPictureBox.Image.Save(docPath + "\\UpdateMode Icons\\" + nameToSave + ".png", ImageFormat.Png);
+
+ AppendText("✔ ", Color.Green);
+ AppendText(nameToSave, Color.DarkRed);
+ AppendText(" successfully saved to ", Color.Black);
+ AppendText(docPath + "\\UpdateMode Icons\\" + nameToSave + ".png", Color.SteelBlue, true);
+ } //Consumables & Weapons
+ if (Properties.Settings.Default.UMTraps == true && (IDParser[iii].ExportType.Contains("FortTrapItemDefinition") || IDParser[iii].ExportType.Contains("FortContextTrapItemDefinition")))
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(currentItem, Color.DarkRed);
+ AppendText(" is a ", Color.Black);
+ AppendText("Trap ID", Color.SteelBlue);
+ AppendText(" file", Color.Black, true);
+
+ ItemName = IDParser[iii].DisplayName;
+ Bitmap bmp = new Bitmap(522, 522);
+ Graphics g = Graphics.FromImage(bmp);
+ g.TextRenderingHint = TextRenderingHint.AntiAlias;
+
+ getItemRarity(IDParser[iii], g);
+
+ string itemIconPath = string.Empty;
+
+ if (IDParser[iii].LargePreviewImage != null)
+ {
+ string textureFile = Path.GetFileName(IDParser[iii].LargePreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser[iii].LargePreviewImage.AssetPathName).LastIndexOf('.'));
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" detected as a ", Color.Black);
+ AppendText("Texture2D file", Color.SteelBlue, true);
+
+ var filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath))
+ {
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ try
+ {
+ if (filesPath != null)
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true);
+
+ itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png";
+ if (!File.Exists(itemIconPath))
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("texture \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\"");
+ });
+ itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png";
+ }
+
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully converted to a PNG image with path ", Color.Black);
+ AppendText(itemIconPath, Color.SteelBlue, true);
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(textureFile, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true);
+ }
+ }
+ else if (IDParser[iii].SmallPreviewImage != null)
+ {
+ string textureFile = Path.GetFileName(IDParser[iii].SmallPreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser[iii].SmallPreviewImage.AssetPathName).LastIndexOf('.'));
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" detected as a ", Color.Black);
+ AppendText("Texture2D file", Color.SteelBlue, true);
+
+ var filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath))
+ {
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ try
+ {
+ if (filesPath != null)
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true);
+
+ itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png";
+ if (!File.Exists(itemIconPath))
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("texture \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\"");
+ });
+ itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png";
+ }
+
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully converted to a PNG image with path ", Color.Black);
+ AppendText(itemIconPath, Color.SteelBlue, true);
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(textureFile, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true);
+ }
+ }
+
+ if (File.Exists(itemIconPath))
+ {
+ Image ItemIcon = Image.FromFile(itemIconPath);
+ g.DrawImage(ResizeImage(ItemIcon, 512, 512), new Point(5, 5));
+ }
+ else
+ {
+ Image ItemIcon = Properties.Resources.unknown512;
+ g.DrawImage(ItemIcon, new Point(0, 0));
+ }
+
+ if (Properties.Settings.Default.UMWatermark == true && !string.IsNullOrEmpty(Properties.Settings.Default.UMFilename))
+ {
+ Image watermark = Image.FromFile(Properties.Settings.Default.UMFilename);
+ var opacityImage = SetImageOpacity(watermark, (float)Properties.Settings.Default.UMOpacity / 100);
+ g.DrawImage(ResizeImage(opacityImage, Properties.Settings.Default.UMSize, Properties.Settings.Default.UMSize), (522 - Properties.Settings.Default.UMSize) / 2, (522 - Properties.Settings.Default.UMSize) / 2, Properties.Settings.Default.UMSize, Properties.Settings.Default.UMSize);
+ }
+
+ Image bg512 = Properties.Resources.BG512;
+ g.DrawImage(bg512, new Point(5, 383));
+
+ try
+ {
+ g.DrawString(ItemName, new Font(pfc.Families[0], 35), new SolidBrush(Color.White), new Point(522 / 2, 395), centeredString);
+ }
+ catch (NullReferenceException)
+ {
+ AppendText("[NullReferenceException] ", Color.Red);
+ AppendText("No ", Color.Black);
+ AppendText("DisplayName ", Color.SteelBlue);
+ AppendText("found", Color.Black, true);
+ } //NAME
+ try
+ {
+ g.DrawString(IDParser[iii].Description, new Font("Arial", 10), new SolidBrush(Color.White), new Point(522 / 2, 465), centeredStringLine);
+ }
+ catch (NullReferenceException)
+ {
+ AppendText("[NullReferenceException] ", Color.Red);
+ AppendText("No ", Color.Black);
+ AppendText("Description ", Color.SteelBlue);
+ AppendText("found", Color.Black, true);
+ } //DESCRIPTION
+
+ ItemIconPictureBox.Image = bmp;
+
+ string nameToSave;
+ nameToSave = currentItem;
+
+ ItemIconPictureBox.Image.Save(docPath + "\\UpdateMode Icons\\" + nameToSave + ".png", ImageFormat.Png);
+
+ AppendText("✔ ", Color.Green);
+ AppendText(nameToSave, Color.DarkRed);
+ AppendText(" successfully saved to ", Color.Black);
+ AppendText(docPath + "\\UpdateMode Icons\\" + nameToSave + ".png", Color.SteelBlue, true);
+ } //Traps
+ if (Properties.Settings.Default.UMVariants == true && (IDParser[iii].ExportType == "FortVariantTokenType"))
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(currentItem, Color.DarkRed);
+ AppendText(" is a ", Color.Black);
+ AppendText("Cosmetic Variant", Color.SteelBlue);
+ AppendText(" file", Color.Black, true);
+
+ ItemName = IDParser[iii].DisplayName;
+ Bitmap bmp = new Bitmap(522, 522);
+ Graphics g = Graphics.FromImage(bmp);
+ g.TextRenderingHint = TextRenderingHint.AntiAlias;
+
+ getItemRarity(IDParser[iii], g);
+
+ string itemIconPath = string.Empty;
+
+ if (IDParser[iii].LargePreviewImage != null)
+ {
+ string textureFile = Path.GetFileName(IDParser[iii].LargePreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser[iii].LargePreviewImage.AssetPathName).LastIndexOf('.'));
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" detected as a ", Color.Black);
+ AppendText("Texture2D file", Color.SteelBlue, true);
+
+ var filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath))
+ {
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ try
+ {
+ if (filesPath != null)
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true);
+
+ itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png";
+ if (!File.Exists(itemIconPath))
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("texture \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\"");
+ });
+ itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png";
+ }
+
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully converted to a PNG image with path ", Color.Black);
+ AppendText(itemIconPath, Color.SteelBlue, true);
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(textureFile, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true);
+ }
+ }
+ else if (IDParser[iii].SmallPreviewImage != null)
+ {
+ string textureFile = Path.GetFileName(IDParser[iii].SmallPreviewImage.AssetPathName).Substring(0, Path.GetFileName(IDParser[iii].SmallPreviewImage.AssetPathName).LastIndexOf('.'));
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" detected as a ", Color.Black);
+ AppendText("Texture2D file", Color.SteelBlue, true);
+
+ var filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ if (!File.Exists(filesPath))
+ {
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[textureFile] + "\" \"" + textureFile + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ filesPath = Directory.GetFiles(docPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).FirstOrDefault();
+ }
+ try
+ {
+ if (filesPath != null)
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true);
+
+ itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png";
+ if (!File.Exists(itemIconPath))
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("texture \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\"");
+ });
+ itemIconPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png";
+ }
+
+ AppendText("✔ ", Color.Green);
+ AppendText(textureFile, Color.DarkRed);
+ AppendText(" successfully converted to a PNG image with path ", Color.Black);
+ AppendText(itemIconPath, Color.SteelBlue, true);
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(textureFile, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText("pakchunk0_s7-WindowsClient.pak", Color.DarkRed, true);
+ }
+ }
+
+ if (File.Exists(itemIconPath))
+ {
+ Image ItemIcon = Image.FromFile(itemIconPath);
+ g.DrawImage(ResizeImage(ItemIcon, 512, 512), new Point(5, 5));
+ }
+ else
+ {
+ Image ItemIcon = Properties.Resources.unknown512;
+ g.DrawImage(ItemIcon, new Point(0, 0));
+ }
+
+ if (Properties.Settings.Default.UMWatermark == true && !string.IsNullOrEmpty(Properties.Settings.Default.UMFilename))
+ {
+ Image watermark = Image.FromFile(Properties.Settings.Default.UMFilename);
+ var opacityImage = SetImageOpacity(watermark, (float)Properties.Settings.Default.UMOpacity / 100);
+ g.DrawImage(ResizeImage(opacityImage, Properties.Settings.Default.UMSize, Properties.Settings.Default.UMSize), (522 - Properties.Settings.Default.UMSize) / 2, (522 - Properties.Settings.Default.UMSize) / 2, Properties.Settings.Default.UMSize, Properties.Settings.Default.UMSize);
+ }
+
+ Image bg512 = Properties.Resources.BG512;
+ g.DrawImage(bg512, new Point(5, 383));
+
+ try
+ {
+ g.DrawString(ItemName, new Font(pfc.Families[0], 35), new SolidBrush(Color.White), new Point(522 / 2, 395), centeredString);
+ }
+ catch (NullReferenceException)
+ {
+ AppendText("[NullReferenceException] ", Color.Red);
+ AppendText("No ", Color.Black);
+ AppendText("DisplayName ", Color.SteelBlue);
+ AppendText("found", Color.Black, true);
+ } //NAME
+ try
+ {
+ g.DrawString(IDParser[iii].Description, new Font("Arial", 10), new SolidBrush(Color.White), new Point(522 / 2, 465), centeredStringLine);
+ }
+ catch (NullReferenceException)
+ {
+ AppendText("[NullReferenceException] ", Color.Red);
+ AppendText("No ", Color.Black);
+ AppendText("Description ", Color.SteelBlue);
+ AppendText("found", Color.Black, true);
+ } //DESCRIPTION
+ try
+ {
+ g.DrawString(IDParser[iii].ShortDescription, new Font(pfc.Families[0], 13), new SolidBrush(Color.White), new Point(5, 500));
+ }
+ catch (NullReferenceException)
+ {
+ AppendText("[NullReferenceException] ", Color.Red);
+ AppendText("No ", Color.Black);
+ AppendText("ShortDescription ", Color.SteelBlue);
+ AppendText("found", Color.Black, true);
+ } //TYPE
+ try
+ {
+ g.DrawString(IDParser[iii].cosmetic_item, new Font(pfc.Families[0], 13), new SolidBrush(Color.White), new Point(522 - 5, 500), rightString);
+ }
+ catch (NullReferenceException)
+ {
+ AppendText("[NullReferenceException] ", Color.Red);
+ AppendText("No ", Color.Black);
+ AppendText("Cosmetic Item ", Color.SteelBlue);
+ AppendText("found", Color.Black, true);
+ } //COSMETIC ITEM
+
+ ItemIconPictureBox.Image = bmp;
+
+ string nameToSave;
+ nameToSave = currentItem;
+
+ ItemIconPictureBox.Image.Save(docPath + "\\UpdateMode Icons\\" + nameToSave + ".png", ImageFormat.Png);
+
+ AppendText("✔ ", Color.Green);
+ AppendText(nameToSave, Color.DarkRed);
+ AppendText(" successfully saved to ", Color.Black);
+ AppendText(docPath + "\\UpdateMode Icons\\" + nameToSave + ".png", Color.SteelBlue, true);
+ } //CosmeticVariantTokens
+ }
+ }
+ for (int ii = 0; ii < IDParser.Length; ii++)
+ {
+ if (Properties.Settings.Default.UMChallenges == true && IDParser[ii].ExportType == "FortChallengeBundleItemDefinition")
+ {
+ var ChallengeParser = ChallengeBundleIdParser.FromJson(json);
+ AppendText("Parsing...Please wait while extracting all challenges\n", Color.Black, true);
+
+ for (int iii = 0; iii < ChallengeParser.Length; iii++)
+ {
+ ItemName = ChallengeParser[iii].DisplayName.ToUpper();
+ challengesArray = new string[ChallengeParser[iii].QuestInfos.Length];
+ for (int y = 0; y < ChallengeParser[iii].QuestInfos.Length; y++)
+ {
+ string cName = Path.GetFileName(ChallengeParser[iii].QuestInfos[y].QuestDefinition.AssetPathName);
+ challengesArray[y] = cName.Substring(cName.LastIndexOf('.') + 1);
+ }
+
+ for (int w = 0; w < challengesArray.Length; w++)
+ {
+ var filesPath = Directory.GetFiles(docPath + "\\Extracted", challengesArray[w] + ".*", SearchOption.AllDirectories).Where(x => !x.EndsWith(".png")).FirstOrDefault();
+ if (!File.Exists(filesPath))
+ {
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[challengesArray[w]] + "\" \"" + challengesArray[w] + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ filesPath = Directory.GetFiles(docPath + "\\Extracted", challengesArray[w] + ".*", SearchOption.AllDirectories).Where(x => !x.EndsWith(".png")).FirstOrDefault();
+ }
+ try
+ {
+ if (filesPath != null)
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("serialize \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\"");
+ });
+ var filesJSON2 = Directory.GetFiles(docPath, challengesArray[w] + ".json", SearchOption.AllDirectories).FirstOrDefault();
+ if (filesJSON2 != null)
+ {
+ var json2 = JToken.Parse(File.ReadAllText(filesJSON2)).ToString();
+ File.Delete(filesJSON2);
+
+ var questParser = QuestParser.FromJson(json2);
+ for (int p = 0; p < questParser.Length; p++)
+ {
+ string oldQuest = null;
+ for (int pp = 0; pp < questParser[p].Objectives.Length; pp++)
+ {
+ string newQuest = questParser[p].Objectives[pp].Description;
+ if (newQuest != oldQuest)
+ {
+ if (!questDictFinal.ContainsKey(questParser[p].Objectives[pp].Description))
+ {
+ questDictFinal.Add(questParser[p].Objectives[pp].Description, questParser[p].Objectives[pp].Count);
+ }
+ AppendText(questParser[p].Objectives[pp].Description, Color.SteelBlue);
+ AppendText("\t\tCount: " + questParser[p].Objectives[pp].Count, Color.DarkRed, true);
+
+ oldQuest = questParser[p].Objectives[pp].Description;
+ }
+ try
+ {
+ for (int ppp = 0; ppp < questParser[p].Rewards.Length; ppp++)
+ {
+ loopStageQuest(questParser[p].Rewards[ppp].ItemPrimaryAssetId.PrimaryAssetType.Name, questParser[p].Rewards[ppp].ItemPrimaryAssetId.PrimaryAssetName);
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(ex.Message);
+ }
+ }
+ }
+ }
+ else
+ {
+ AppendText("✗ ", Color.Red);
+ AppendText("No serialized file found", Color.Black, true);
+ }
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(challengesArray[w], Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText(PAKsComboBox.SelectedItem.ToString(), Color.DarkRed, true);
+ }
+ }
+ }
+
+ Bitmap bmp = new Bitmap(Properties.Resources.Quest);
+ Graphics g = Graphics.FromImage(bmp);
+ g.TextRenderingHint = TextRenderingHint.AntiAlias;
+ int iamY = 400;
+ int justSkip = 0;
+ foreach (var d in questDictFinal)
+ {
+ justSkip += 1;
+ iamY += 100;
+ g.DrawString(d.Key, new Font(pfc.Families[1], 50), new SolidBrush(Color.White), new Point(100, iamY));
+ g.DrawString("/" + d.Value, new Font(pfc.Families[1], 50), new SolidBrush(Color.FromArgb(255, 149, 213, 255)), new Point(2410, iamY), rightString);
+ if (justSkip != 1)
+ {
+ g.DrawLine(new Pen(Color.FromArgb(30, 255, 255, 255)), 100, iamY - 10, 2410, iamY - 10);
+ }
+ }
+ try
+ {
+ string seasonFolder = filesJSON.Substring(filesJSON.Substring(0, filesJSON.LastIndexOf("\\")).LastIndexOf("\\") + 1).ToUpper();
+ g.DrawString(seasonFolder.Substring(0, seasonFolder.LastIndexOf("\\")), 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(ItemName, 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
+ using (Bitmap bmp2 = bmp)
+ {
+ var newImg = bmp2.Clone(
+ new Rectangle { X = 0, Y = 0, Width = bmp.Width, Height = iamY + 280 },
+ bmp2.PixelFormat);
+ ItemIconPictureBox.Image = newImg;
+ } //CUT
+
+ string nameToSave;
+ nameToSave = currentItem;
+
+ ItemIconPictureBox.Image.Save(docPath + "\\" + nameToSave + ".png", ImageFormat.Png);
+
+ AppendText("✔ ", Color.Green);
+ AppendText(nameToSave, Color.DarkRed);
+ AppendText(" successfully saved to ", Color.Black);
+ AppendText(docPath + "\\" + nameToSave + ".png", Color.SteelBlue, true);
+ } //ASSET IS A CHALLENGE => DISPLAY + ICON
+ if (IDParser[ii].ExportType == "Texture2D")
+ {
+ AppendText("Parsing...", Color.Black, true);
+ ItemName = currentItem;
+
+ AppendText("✔ ", Color.Green);
+ AppendText(currentItem, Color.DarkRed);
+ AppendText(" detected as a ", Color.Black);
+ AppendText("Texture2D file", Color.SteelBlue, true);
+
+ string IMGPath = string.Empty;
+
+ var filesPath = Directory.GetFiles(docPath + "\\Extracted", currentItem + ".*", SearchOption.AllDirectories).Where(x => !x.EndsWith(".png")).FirstOrDefault();
+ if (!File.Exists(filesPath))
+ {
+ await Task.Run(() => {
+ try
+ {
+ jwpmProcess("extract \"" + Properties.Settings.Default.FortnitePAKs + "\\" + AllPAKsDict[currentItem] + "\" \"" + currentItem + "\" \"" + docPath + "\"");
+ }
+ catch (KeyNotFoundException ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.Write("[ERROR] ");
+ Console.ForegroundColor = ConsoleColor.White;
+ Console.Write(ex.Message);
+ }
+ });
+ filesPath = Directory.GetFiles(docPath + "\\Extracted", currentItem + ".*", SearchOption.AllDirectories).Where(x => !x.EndsWith(".png")).FirstOrDefault();
+ }
+ try
+ {
+ if (filesPath != null)
+ {
+ AppendText("✔ ", Color.Green);
+ AppendText(currentItem, Color.DarkRed);
+ AppendText(" successfully extracted to ", Color.Black);
+ AppendText(filesPath.Substring(0, filesPath.LastIndexOf('.')), Color.SteelBlue, true);
+
+ IMGPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png";
+ if (!File.Exists(IMGPath))
+ {
+ await Task.Run(() =>
+ {
+ jwpmProcess("texture \"" + filesPath.Substring(0, filesPath.LastIndexOf('.')) + "\"");
+ });
+ IMGPath = filesPath.Substring(0, filesPath.LastIndexOf('.')) + ".png";
+ }
+
+ AppendText("✔ ", Color.Green);
+ AppendText(currentItem, Color.DarkRed);
+ AppendText(" successfully converted to a PNG image with path ", Color.Black);
+ AppendText(IMGPath, Color.SteelBlue, true);
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ AppendText("[IndexOutOfRangeException] ", Color.Red);
+ AppendText("Can't extract ", Color.Black);
+ AppendText(currentItem, Color.SteelBlue);
+ AppendText(" in ", Color.Black);
+ AppendText(PAKsComboBox.SelectedItem.ToString(), Color.DarkRed, true);
+ }
+
+ if (File.Exists(IMGPath))
+ {
+ ItemIconPictureBox.Image = Image.FromFile(IMGPath);
+ }
+ else
+ {
+ ItemIconPictureBox.Image = Properties.Resources.unknown512;
+ }
+
+ string nameToSave;
+ nameToSave = currentItem;
+
+ ItemIconPictureBox.Image.Save(docPath + "\\UpdateMode Icons\\Textures\\" + nameToSave + ".png", ImageFormat.Png);
+
+ AppendText("✔ ", Color.Green);
+ AppendText(nameToSave, Color.DarkRed);
+ AppendText(" successfully saved to ", Color.Black);
+ AppendText(docPath + "\\UpdateMode Icons\\Textures\\" + nameToSave + ".png", Color.SteelBlue, true);
+ } //ASSET IS A TEXTURE => LOAD TEXTURE
+ }
+ }
+ else
+ {
+ AppendText("✗ ", Color.Red);
+ AppendText("No serialized file found", Color.Black, true);
+ }
+ }
+ catch (JsonSerializationException)
+ {
+ AppendText("", Color.Black, true);
+ AppendText("✗ ", Color.Red);
+ AppendText("Error, json file too large to be fully displayed", Color.Black, true);
+ }
+ }
+ }
+ }
+ ExtractAssetButton.Enabled = true;
+ OpenImageButton.Enabled = true;
+
stopWatch.Stop();
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);
@@ -785,6 +3758,21 @@ namespace FModel
if (updateModeToolStripMenuItem.Checked == true)
updateModeToolStripMenuItem.Checked = false;
}
+ if (updateModeToolStripMenuItem.Checked == false && enablePAKsDiffToolStripMenuItem.Checked == false)
+ {
+ loadAllPAKsToolStripMenuItem.Text = "Load All PAKs";
+ }
+ }
+ private void updateModeToolStripMenuItem_CheckedChanged(object sender, EventArgs e)
+ {
+ if (updateModeToolStripMenuItem.Checked == true)
+ {
+ loadAllPAKsToolStripMenuItem.Text = "Load And Extract Difference";
+ }
+ if (updateModeToolStripMenuItem.Checked == false)
+ {
+ loadAllPAKsToolStripMenuItem.Text = "Load Difference";
+ }
}
public static IEnumerable GetAncestors(TItem item, Func getParentFunc)
@@ -3655,7 +6643,7 @@ namespace FModel
if (File.Exists(itemIconPath))
{
Image ItemIcon = Image.FromFile(itemIconPath);
- g.DrawImage(ItemIcon, new Point(5, 5));
+ g.DrawImage(ResizeImage(ItemIcon, 512, 512), new Point(5, 5));
}
else
{
@@ -3964,7 +6952,7 @@ namespace FModel
if (File.Exists(itemIconPath))
{
Image ItemIcon = Image.FromFile(itemIconPath);
- g.DrawImage(ItemIcon, new Point(5, 5));
+ g.DrawImage(ResizeImage(ItemIcon, 512, 512), new Point(5, 5));
}
else
{
@@ -4237,7 +7225,7 @@ namespace FModel
if (File.Exists(itemIconPath))
{
Image ItemIcon = Image.FromFile(itemIconPath);
- g.DrawImage(ItemIcon, new Point(5, 5));
+ g.DrawImage(ResizeImage(ItemIcon, 512, 512), new Point(5, 5));
}
else
{
@@ -4887,5 +7875,26 @@ namespace FModel
optionForm.Show();
}
}
+
+ private void updateModeToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (updateModeToolStripMenuItem.Checked == false)
+ {
+ if ((Application.OpenForms["UpdateModeOption"] as UpdateModeOption) != null)
+ {
+ Application.OpenForms["UpdateModeOption"].Focus();
+ }
+ else
+ {
+ var optionForm = new UpdateModeOption();
+ optionForm.Show();
+ }
+ updateModeToolStripMenuItem.Checked = true;
+ }
+ else
+ {
+ updateModeToolStripMenuItem.Checked = false;
+ }
+ }
}
}
diff --git a/FModel/PAKWindow.resx b/FModel/PAKWindow.resx
index 93806a9c..31cd9b08 100644
--- a/FModel/PAKWindow.resx
+++ b/FModel/PAKWindow.resx
@@ -117,9 +117,6 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- True
-
277, 17
@@ -133,40 +130,40 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
- ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACc
- BwAAAk1TRnQBSQFMAgEBAgEAAYgBAAGIAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
- AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
- AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
- AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
- AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
- AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
- AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
- ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
- AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
- AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
- AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
- AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
- AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
- AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
- AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
- AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
- ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
- Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
- AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
- AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
- AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
- ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
- Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
- AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
- AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
- AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
- AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
- AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
- AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/wEAEP8wABuuBJYBriAA
- Gq4GliAAB64B6gESEa4ClgHxAfQCliAABq4B6gFtAhIQrgSWAboBliAABq4BbQGuARIBrgFtD64ElgG7
- AZYgAAiuARISrgSWAa4gAAiuARIXriAACK4BEheuIAAgriAAIK4gAAiuCBQIrggUIAAHrgHsCBQHrgHq
- CBQgAAauAe0JAAauAQcpAAauCgAGrmoAAUIBTQE+BwABPgMAASgDAAFAAwABEAMAAQEBAAEBBQABgBcA
- A/8DAAL/ZAABAQH/AQEB/wQAAQMB/wEDAf8EAAT/BAAL
+ ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACa
+ BwAAAk1TRnQBSQFMAgEBAgIAAQEBAAEBARABAAEQAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMA
+ AUADAAEQAwABAQEAAQgGAAEEGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEA
+ AfABygGmAQABMwUAATMBAAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEA
+ AYABfAH/AQACUAH/AQABkwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFm
+ AwABmQMAAcwCAAEzAwACMwIAATMBZgIAATMBmQIAATMBzAIAATMB/wIAAWYDAAFmATMCAAJmAgABZgGZ
+ AgABZgHMAgABZgH/AgABmQMAAZkBMwIAAZkBZgIAApkCAAGZAcwCAAGZAf8CAAHMAwABzAEzAgABzAFm
+ AgABzAGZAgACzAIAAcwB/wIAAf8BZgIAAf8BmQIAAf8BzAEAATMB/wIAAf8BAAEzAQABMwEAAWYBAAEz
+ AQABmQEAATMBAAHMAQABMwEAAf8BAAH/ATMCAAMzAQACMwFmAQACMwGZAQACMwHMAQACMwH/AQABMwFm
+ AgABMwFmATMBAAEzAmYBAAEzAWYBmQEAATMBZgHMAQABMwFmAf8BAAEzAZkCAAEzAZkBMwEAATMBmQFm
+ AQABMwKZAQABMwGZAcwBAAEzAZkB/wEAATMBzAIAATMBzAEzAQABMwHMAWYBAAEzAcwBmQEAATMCzAEA
+ ATMBzAH/AQABMwH/ATMBAAEzAf8BZgEAATMB/wGZAQABMwH/AcwBAAEzAv8BAAFmAwABZgEAATMBAAFm
+ AQABZgEAAWYBAAGZAQABZgEAAcwBAAFmAQAB/wEAAWYBMwIAAWYCMwEAAWYBMwFmAQABZgEzAZkBAAFm
+ ATMBzAEAAWYBMwH/AQACZgIAAmYBMwEAA2YBAAJmAZkBAAJmAcwBAAFmAZkCAAFmAZkBMwEAAWYBmQFm
+ AQABZgKZAQABZgGZAcwBAAFmAZkB/wEAAWYBzAIAAWYBzAEzAQABZgHMAZkBAAFmAswBAAFmAcwB/wEA
+ AWYB/wIAAWYB/wEzAQABZgH/AZkBAAFmAf8BzAEAAcwBAAH/AQAB/wEAAcwBAAKZAgABmQEzAZkBAAGZ
+ AQABmQEAAZkBAAHMAQABmQMAAZkCMwEAAZkBAAFmAQABmQEzAcwBAAGZAQAB/wEAAZkBZgIAAZkBZgEz
+ AQABmQEzAWYBAAGZAWYBmQEAAZkBZgHMAQABmQEzAf8BAAKZATMBAAKZAWYBAAOZAQACmQHMAQACmQH/
+ AQABmQHMAgABmQHMATMBAAFmAcwBZgEAAZkBzAGZAQABmQLMAQABmQHMAf8BAAGZAf8CAAGZAf8BMwEA
+ AZkBzAFmAQABmQH/AZkBAAGZAf8BzAEAAZkC/wEAAcwDAAGZAQABMwEAAcwBAAFmAQABzAEAAZkBAAHM
+ AQABzAEAAZkBMwIAAcwCMwEAAcwBMwFmAQABzAEzAZkBAAHMATMBzAEAAcwBMwH/AQABzAFmAgABzAFm
+ ATMBAAGZAmYBAAHMAWYBmQEAAcwBZgHMAQABmQFmAf8BAAHMAZkCAAHMAZkBMwEAAcwBmQFmAQABzAKZ
+ AQABzAGZAcwBAAHMAZkB/wEAAswCAALMATMBAALMAWYBAALMAZkBAAPMAQACzAH/AQABzAH/AgABzAH/
+ ATMBAAGZAf8BZgEAAcwB/wGZAQABzAH/AcwBAAHMAv8BAAHMAQABMwEAAf8BAAFmAQAB/wEAAZkBAAHM
+ ATMCAAH/AjMBAAH/ATMBZgEAAf8BMwGZAQAB/wEzAcwBAAH/ATMB/wEAAf8BZgIAAf8BZgEzAQABzAJm
+ AQAB/wFmAZkBAAH/AWYBzAEAAcwBZgH/AQAB/wGZAgAB/wGZATMBAAH/AZkBZgEAAf8CmQEAAf8BmQHM
+ AQAB/wGZAf8BAAH/AcwCAAH/AcwBMwEAAf8BzAFmAQAB/wHMAZkBAAH/AswBAAH/AcwB/wEAAv8BMwEA
+ AcwB/wFmAQAC/wGZAQAC/wHMAQACZgH/AQABZgH/AWYBAAFmAv8BAAH/AmYBAAH/AWYB/wEAAv8BZgEA
+ ASEBAAGlAQADXwEAA3cBAAOGAQADlgEAA8sBAAOyAQAD1wEAA90BAAPjAQAD6gEAA/EBAAP4AQAB8AH7
+ Af8BAAGkAqABAAOAAwAB/wIAAf8DAAL/AQAB/wMAAf8BAAH/AQAC/wIAA/8BABD/MAAbrgSWAa4gABqu
+ BpYgAAeuAeoBEhGuApYB8QH0ApYgAAauAeoBbQISEK4ElgG6AZYgAAauAW0BrgESAa4BbQ+uBJYBuwGW
+ IAAIrgESEq4ElgGuIAAIrgESF64gAAiuARIXriAAIK4gACCuIAAIrggUCK4IFCAAB64B7AgUB64B6ggU
+ IAAGrgHtCQAGrgEHKQAGrgoABq5qAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEBAQABAQUAAYAXAAP/
+ AwAC/2QAAQEB/wEBAf8EAAEDAf8BAwH/BAAE/wQACw==
diff --git a/FModel/Properties/Settings.Designer.cs b/FModel/Properties/Settings.Designer.cs
index 37a258bc..77c9d0a9 100644
--- a/FModel/Properties/Settings.Designer.cs
+++ b/FModel/Properties/Settings.Designer.cs
@@ -213,5 +213,221 @@ namespace FModel.Properties {
this["loadFeaturedImage"] = value;
}
}
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool UMCosmetics {
+ get {
+ return ((bool)(this["UMCosmetics"]));
+ }
+ set {
+ this["UMCosmetics"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool UMVariants {
+ get {
+ return ((bool)(this["UMVariants"]));
+ }
+ set {
+ this["UMVariants"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool UMConsumablesWeapons {
+ get {
+ return ((bool)(this["UMConsumablesWeapons"]));
+ }
+ set {
+ this["UMConsumablesWeapons"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool UMTraps {
+ get {
+ return ((bool)(this["UMTraps"]));
+ }
+ set {
+ this["UMTraps"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool UMChallenges {
+ get {
+ return ((bool)(this["UMChallenges"]));
+ }
+ set {
+ this["UMChallenges"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("1")]
+ public int UMSize {
+ get {
+ return ((int)(this["UMSize"]));
+ }
+ set {
+ this["UMSize"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("0")]
+ public int UMOpacity {
+ get {
+ return ((int)(this["UMOpacity"]));
+ }
+ set {
+ this["UMOpacity"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool UMWatermark {
+ get {
+ return ((bool)(this["UMWatermark"]));
+ }
+ set {
+ this["UMWatermark"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool UMFeatured {
+ get {
+ return ((bool)(this["UMFeatured"]));
+ }
+ set {
+ this["UMFeatured"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool UMTCosmeticsVariants {
+ get {
+ return ((bool)(this["UMTCosmeticsVariants"]));
+ }
+ set {
+ this["UMTCosmeticsVariants"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool UMTLoading {
+ get {
+ return ((bool)(this["UMTLoading"]));
+ }
+ set {
+ this["UMTLoading"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool UMTWeapons {
+ get {
+ return ((bool)(this["UMTWeapons"]));
+ }
+ set {
+ this["UMTWeapons"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool UMTBanners {
+ get {
+ return ((bool)(this["UMTBanners"]));
+ }
+ set {
+ this["UMTBanners"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool UMTFeaturedIMGs {
+ get {
+ return ((bool)(this["UMTFeaturedIMGs"]));
+ }
+ set {
+ this["UMTFeaturedIMGs"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool UMTAthena {
+ get {
+ return ((bool)(this["UMTAthena"]));
+ }
+ set {
+ this["UMTAthena"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool UMTDevices {
+ get {
+ return ((bool)(this["UMTDevices"]));
+ }
+ set {
+ this["UMTDevices"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool UMTVehicles {
+ get {
+ return ((bool)(this["UMTVehicles"]));
+ }
+ set {
+ this["UMTVehicles"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("")]
+ public string UMFilename {
+ get {
+ return ((string)(this["UMFilename"]));
+ }
+ set {
+ this["UMFilename"] = value;
+ }
+ }
}
}
diff --git a/FModel/Properties/Settings.settings b/FModel/Properties/Settings.settings
index bbe110dd..9bda4b0b 100644
--- a/FModel/Properties/Settings.settings
+++ b/FModel/Properties/Settings.settings
@@ -50,5 +50,59 @@
False
+
+ True
+
+
+ True
+
+
+ False
+
+
+ False
+
+
+ True
+
+
+ 1
+
+
+ 0
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+ True
+
+
+ False
+
+
+ True
+
+
+ True
+
+
+ False
+
+
+ False
+
+
+ False
+
+
+
+
\ No newline at end of file
diff --git a/FModel/UpdateModeOption.Designer.cs b/FModel/UpdateModeOption.Designer.cs
new file mode 100644
index 00000000..d195cd03
--- /dev/null
+++ b/FModel/UpdateModeOption.Designer.cs
@@ -0,0 +1,508 @@
+namespace FModel
+{
+ partial class UpdateModeOption
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UpdateModeOption));
+ this.optionsOKButton = new System.Windows.Forms.Button();
+ this.label1 = new System.Windows.Forms.Label();
+ this.label2 = new System.Windows.Forms.Label();
+ this.groupBox4 = new System.Windows.Forms.GroupBox();
+ this.checkBox8 = new System.Windows.Forms.CheckBox();
+ this.checkBox7 = new System.Windows.Forms.CheckBox();
+ this.filenameLabel = new System.Windows.Forms.Label();
+ this.trackBar1 = new System.Windows.Forms.TrackBar();
+ this.label9 = new System.Windows.Forms.Label();
+ this.trackBar2 = new System.Windows.Forms.TrackBar();
+ this.label8 = new System.Windows.Forms.Label();
+ this.button1 = new System.Windows.Forms.Button();
+ this.wPictureBox = new System.Windows.Forms.PictureBox();
+ this.checkBox6 = new System.Windows.Forms.CheckBox();
+ this.checkBox5 = new System.Windows.Forms.CheckBox();
+ this.checkBox4 = new System.Windows.Forms.CheckBox();
+ this.checkBox3 = new System.Windows.Forms.CheckBox();
+ this.checkBox2 = new System.Windows.Forms.CheckBox();
+ this.label6 = new System.Windows.Forms.Label();
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.checkBox15 = new System.Windows.Forms.CheckBox();
+ this.checkBox13 = new System.Windows.Forms.CheckBox();
+ this.checkBox12 = new System.Windows.Forms.CheckBox();
+ this.checkBox11 = new System.Windows.Forms.CheckBox();
+ this.checkBox10 = new System.Windows.Forms.CheckBox();
+ this.checkBox9 = new System.Windows.Forms.CheckBox();
+ this.checkBox1 = new System.Windows.Forms.CheckBox();
+ this.checkBox14 = new System.Windows.Forms.CheckBox();
+ this.label7 = new System.Windows.Forms.Label();
+ this.panel1 = new System.Windows.Forms.Panel();
+ this.label3 = new System.Windows.Forms.Label();
+ this.panel2 = new System.Windows.Forms.Panel();
+ this.label4 = new System.Windows.Forms.Label();
+ this.groupBox4.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.trackBar2)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.wPictureBox)).BeginInit();
+ this.groupBox1.SuspendLayout();
+ this.panel1.SuspendLayout();
+ this.panel2.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // optionsOKButton
+ //
+ this.optionsOKButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
+ this.optionsOKButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.optionsOKButton.Location = new System.Drawing.Point(476, 311);
+ this.optionsOKButton.Name = "optionsOKButton";
+ this.optionsOKButton.Size = new System.Drawing.Size(97, 21);
+ this.optionsOKButton.TabIndex = 4;
+ this.optionsOKButton.Text = "OK";
+ this.optionsOKButton.UseVisualStyleBackColor = true;
+ this.optionsOKButton.Click += new System.EventHandler(this.optionsOKButton_Click);
+ //
+ // label1
+ //
+ this.label1.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
+ this.label1.AutoSize = true;
+ this.label1.ForeColor = System.Drawing.Color.Red;
+ this.label1.Location = new System.Drawing.Point(132, 314);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(19, 13);
+ this.label1.TabIndex = 5;
+ this.label1.Text = "⚠️";
+ //
+ // label2
+ //
+ this.label2.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
+ this.label2.AutoSize = true;
+ this.label2.ForeColor = System.Drawing.Color.Red;
+ this.label2.Location = new System.Drawing.Point(148, 315);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(320, 13);
+ this.label2.TabIndex = 6;
+ this.label2.Text = "The more Assets you choose, the more time it will take to complete";
+ //
+ // groupBox4
+ //
+ this.groupBox4.Controls.Add(this.checkBox8);
+ this.groupBox4.Controls.Add(this.checkBox7);
+ this.groupBox4.Controls.Add(this.filenameLabel);
+ this.groupBox4.Controls.Add(this.trackBar1);
+ this.groupBox4.Controls.Add(this.label9);
+ this.groupBox4.Controls.Add(this.trackBar2);
+ this.groupBox4.Controls.Add(this.label8);
+ this.groupBox4.Controls.Add(this.button1);
+ this.groupBox4.Controls.Add(this.wPictureBox);
+ this.groupBox4.Controls.Add(this.checkBox6);
+ this.groupBox4.Controls.Add(this.checkBox5);
+ this.groupBox4.Controls.Add(this.checkBox4);
+ this.groupBox4.Controls.Add(this.checkBox3);
+ this.groupBox4.Controls.Add(this.checkBox2);
+ this.groupBox4.Controls.Add(this.label6);
+ this.groupBox4.Location = new System.Drawing.Point(12, 12);
+ this.groupBox4.Name = "groupBox4";
+ this.groupBox4.Size = new System.Drawing.Size(560, 213);
+ this.groupBox4.TabIndex = 14;
+ this.groupBox4.TabStop = false;
+ this.groupBox4.Text = "Icon Creation";
+ //
+ // checkBox8
+ //
+ this.checkBox8.AutoSize = true;
+ this.checkBox8.Location = new System.Drawing.Point(6, 57);
+ this.checkBox8.Name = "checkBox8";
+ this.checkBox8.Size = new System.Drawing.Size(233, 17);
+ this.checkBox8.TabIndex = 26;
+ this.checkBox8.Text = "Use Characters\' Featured Image If Available";
+ this.checkBox8.UseVisualStyleBackColor = true;
+ this.checkBox8.CheckedChanged += new System.EventHandler(this.checkBox8_CheckedChanged);
+ //
+ // checkBox7
+ //
+ this.checkBox7.AutoSize = true;
+ this.checkBox7.Location = new System.Drawing.Point(6, 105);
+ this.checkBox7.Name = "checkBox7";
+ this.checkBox7.Size = new System.Drawing.Size(15, 14);
+ this.checkBox7.TabIndex = 25;
+ this.checkBox7.UseVisualStyleBackColor = true;
+ this.checkBox7.CheckedChanged += new System.EventHandler(this.checkBox7_CheckedChanged);
+ //
+ // filenameLabel
+ //
+ this.filenameLabel.AutoSize = true;
+ this.filenameLabel.Location = new System.Drawing.Point(115, 106);
+ this.filenameLabel.Name = "filenameLabel";
+ this.filenameLabel.Size = new System.Drawing.Size(60, 13);
+ this.filenameLabel.TabIndex = 24;
+ this.filenameLabel.Text = "File Name: ";
+ //
+ // trackBar1
+ //
+ this.trackBar1.Location = new System.Drawing.Point(58, 158);
+ this.trackBar1.Maximum = 100;
+ this.trackBar1.Name = "trackBar1";
+ this.trackBar1.Size = new System.Drawing.Size(325, 45);
+ this.trackBar1.TabIndex = 20;
+ this.trackBar1.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.trackBar1.ValueChanged += new System.EventHandler(this.trackBar1_ValueChanged);
+ //
+ // label9
+ //
+ this.label9.AutoSize = true;
+ this.label9.Location = new System.Drawing.Point(22, 129);
+ this.label9.Name = "label9";
+ this.label9.Size = new System.Drawing.Size(30, 13);
+ this.label9.TabIndex = 23;
+ this.label9.Text = "Size:";
+ //
+ // trackBar2
+ //
+ this.trackBar2.Location = new System.Drawing.Point(58, 129);
+ this.trackBar2.Maximum = 1000;
+ this.trackBar2.Minimum = 1;
+ this.trackBar2.Name = "trackBar2";
+ this.trackBar2.Size = new System.Drawing.Size(325, 45);
+ this.trackBar2.TabIndex = 22;
+ this.trackBar2.TickFrequency = 25;
+ this.trackBar2.TickStyle = System.Windows.Forms.TickStyle.None;
+ this.trackBar2.Value = 1;
+ this.trackBar2.ValueChanged += new System.EventHandler(this.trackBar2_ValueChanged);
+ //
+ // label8
+ //
+ this.label8.AutoSize = true;
+ this.label8.Location = new System.Drawing.Point(6, 161);
+ this.label8.Name = "label8";
+ this.label8.Size = new System.Drawing.Size(46, 13);
+ this.label8.TabIndex = 21;
+ this.label8.Text = "Opacity:";
+ //
+ // button1
+ //
+ this.button1.Location = new System.Drawing.Point(27, 99);
+ this.button1.Name = "button1";
+ this.button1.Size = new System.Drawing.Size(82, 24);
+ this.button1.TabIndex = 19;
+ this.button1.Text = "Watermark";
+ this.button1.UseVisualStyleBackColor = true;
+ this.button1.Click += new System.EventHandler(this.button1_Click);
+ //
+ // wPictureBox
+ //
+ this.wPictureBox.Image = global::FModel.Properties.Resources.wTemplate;
+ this.wPictureBox.Location = new System.Drawing.Point(389, 42);
+ this.wPictureBox.Name = "wPictureBox";
+ this.wPictureBox.Size = new System.Drawing.Size(165, 165);
+ this.wPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
+ this.wPictureBox.TabIndex = 18;
+ this.wPictureBox.TabStop = false;
+ //
+ // checkBox6
+ //
+ this.checkBox6.AutoSize = true;
+ this.checkBox6.Location = new System.Drawing.Point(476, 19);
+ this.checkBox6.Name = "checkBox6";
+ this.checkBox6.Size = new System.Drawing.Size(78, 17);
+ this.checkBox6.TabIndex = 14;
+ this.checkBox6.Text = "Challenges";
+ this.checkBox6.UseVisualStyleBackColor = true;
+ //
+ // checkBox5
+ //
+ this.checkBox5.AutoSize = true;
+ this.checkBox5.Location = new System.Drawing.Point(189, 19);
+ this.checkBox5.Name = "checkBox5";
+ this.checkBox5.Size = new System.Drawing.Size(64, 17);
+ this.checkBox5.TabIndex = 4;
+ this.checkBox5.Text = "Variants";
+ this.checkBox5.UseVisualStyleBackColor = true;
+ //
+ // checkBox4
+ //
+ this.checkBox4.AutoSize = true;
+ this.checkBox4.Location = new System.Drawing.Point(415, 19);
+ this.checkBox4.Name = "checkBox4";
+ this.checkBox4.Size = new System.Drawing.Size(53, 17);
+ this.checkBox4.TabIndex = 3;
+ this.checkBox4.Text = "Traps";
+ this.checkBox4.UseVisualStyleBackColor = true;
+ //
+ // checkBox3
+ //
+ this.checkBox3.AutoSize = true;
+ this.checkBox3.Location = new System.Drawing.Point(261, 19);
+ this.checkBox3.Name = "checkBox3";
+ this.checkBox3.Size = new System.Drawing.Size(147, 17);
+ this.checkBox3.TabIndex = 2;
+ this.checkBox3.Text = "Consumables && Weapons";
+ this.checkBox3.UseVisualStyleBackColor = true;
+ this.checkBox3.MouseEnter += new System.EventHandler(this.checkBox3_MouseEnter);
+ this.checkBox3.MouseLeave += new System.EventHandler(this.checkBox3_MouseLeave);
+ this.checkBox3.MouseMove += new System.Windows.Forms.MouseEventHandler(this.checkBox3_MouseMove);
+ //
+ // checkBox2
+ //
+ this.checkBox2.AutoSize = true;
+ this.checkBox2.Location = new System.Drawing.Point(108, 19);
+ this.checkBox2.Name = "checkBox2";
+ this.checkBox2.Size = new System.Drawing.Size(74, 17);
+ this.checkBox2.TabIndex = 1;
+ this.checkBox2.Text = "Cosmetics";
+ this.checkBox2.UseVisualStyleBackColor = true;
+ //
+ // label6
+ //
+ this.label6.AutoSize = true;
+ this.label6.Location = new System.Drawing.Point(6, 20);
+ this.label6.Name = "label6";
+ this.label6.Size = new System.Drawing.Size(96, 13);
+ this.label6.TabIndex = 0;
+ this.label6.Text = "Supported Folders:";
+ //
+ // groupBox1
+ //
+ this.groupBox1.Controls.Add(this.checkBox15);
+ this.groupBox1.Controls.Add(this.checkBox13);
+ this.groupBox1.Controls.Add(this.checkBox12);
+ this.groupBox1.Controls.Add(this.checkBox11);
+ this.groupBox1.Controls.Add(this.checkBox10);
+ this.groupBox1.Controls.Add(this.checkBox9);
+ this.groupBox1.Controls.Add(this.checkBox1);
+ this.groupBox1.Controls.Add(this.checkBox14);
+ this.groupBox1.Controls.Add(this.label7);
+ this.groupBox1.Location = new System.Drawing.Point(12, 231);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Size = new System.Drawing.Size(560, 68);
+ this.groupBox1.TabIndex = 15;
+ this.groupBox1.TabStop = false;
+ this.groupBox1.Text = "Texture Extraction";
+ //
+ // checkBox15
+ //
+ this.checkBox15.AutoSize = true;
+ this.checkBox15.Location = new System.Drawing.Point(482, 42);
+ this.checkBox15.Name = "checkBox15";
+ this.checkBox15.Size = new System.Drawing.Size(66, 17);
+ this.checkBox15.TabIndex = 8;
+ this.checkBox15.Text = "Vehicles";
+ this.checkBox15.UseVisualStyleBackColor = true;
+ //
+ // checkBox13
+ //
+ this.checkBox13.AutoSize = true;
+ this.checkBox13.Location = new System.Drawing.Point(344, 42);
+ this.checkBox13.Name = "checkBox13";
+ this.checkBox13.Size = new System.Drawing.Size(107, 17);
+ this.checkBox13.TabIndex = 7;
+ this.checkBox13.Text = "Creative Devices";
+ this.checkBox13.UseVisualStyleBackColor = true;
+ //
+ // checkBox12
+ //
+ this.checkBox12.AutoSize = true;
+ this.checkBox12.Location = new System.Drawing.Point(248, 42);
+ this.checkBox12.Name = "checkBox12";
+ this.checkBox12.Size = new System.Drawing.Size(60, 17);
+ this.checkBox12.TabIndex = 6;
+ this.checkBox12.Text = "Athena";
+ this.checkBox12.UseVisualStyleBackColor = true;
+ //
+ // checkBox11
+ //
+ this.checkBox11.AutoSize = true;
+ this.checkBox11.Location = new System.Drawing.Point(108, 42);
+ this.checkBox11.Name = "checkBox11";
+ this.checkBox11.Size = new System.Drawing.Size(105, 17);
+ this.checkBox11.TabIndex = 5;
+ this.checkBox11.Text = "Featured Images";
+ this.checkBox11.UseVisualStyleBackColor = true;
+ //
+ // checkBox10
+ //
+ this.checkBox10.AutoSize = true;
+ this.checkBox10.Location = new System.Drawing.Point(482, 20);
+ this.checkBox10.Name = "checkBox10";
+ this.checkBox10.Size = new System.Drawing.Size(72, 17);
+ this.checkBox10.TabIndex = 4;
+ this.checkBox10.Text = "2d Assets";
+ this.checkBox10.UseVisualStyleBackColor = true;
+ this.checkBox10.MouseEnter += new System.EventHandler(this.checkBox10_MouseEnter);
+ this.checkBox10.MouseLeave += new System.EventHandler(this.checkBox10_MouseLeave);
+ this.checkBox10.MouseMove += new System.Windows.Forms.MouseEventHandler(this.checkBox10_MouseMove);
+ //
+ // checkBox9
+ //
+ this.checkBox9.AutoSize = true;
+ this.checkBox9.Location = new System.Drawing.Point(108, 19);
+ this.checkBox9.Name = "checkBox9";
+ this.checkBox9.Size = new System.Drawing.Size(124, 17);
+ this.checkBox9.TabIndex = 3;
+ this.checkBox9.Text = "Cosmetics && Variants";
+ this.checkBox9.UseVisualStyleBackColor = true;
+ //
+ // checkBox1
+ //
+ this.checkBox1.AutoSize = true;
+ this.checkBox1.Location = new System.Drawing.Point(386, 19);
+ this.checkBox1.Name = "checkBox1";
+ this.checkBox1.Size = new System.Drawing.Size(72, 17);
+ this.checkBox1.TabIndex = 2;
+ this.checkBox1.Text = "Weapons";
+ this.checkBox1.UseVisualStyleBackColor = true;
+ //
+ // checkBox14
+ //
+ this.checkBox14.AutoSize = true;
+ this.checkBox14.Location = new System.Drawing.Point(253, 19);
+ this.checkBox14.Name = "checkBox14";
+ this.checkBox14.Size = new System.Drawing.Size(106, 17);
+ this.checkBox14.TabIndex = 1;
+ this.checkBox14.Text = "Loading Screens";
+ this.checkBox14.UseVisualStyleBackColor = true;
+ //
+ // label7
+ //
+ this.label7.AutoSize = true;
+ this.label7.Location = new System.Drawing.Point(6, 20);
+ this.label7.Name = "label7";
+ this.label7.Size = new System.Drawing.Size(96, 13);
+ this.label7.TabIndex = 0;
+ this.label7.Text = "Supported Folders:";
+ //
+ // panel1
+ //
+ this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(181)))), ((int)(((byte)(215)))), ((int)(((byte)(243)))));
+ this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.panel1.Controls.Add(this.label3);
+ this.panel1.Location = new System.Drawing.Point(12, 310);
+ this.panel1.Name = "panel1";
+ this.panel1.Size = new System.Drawing.Size(274, 22);
+ this.panel1.TabIndex = 16;
+ this.panel1.Visible = false;
+ //
+ // label3
+ //
+ this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.label3.Location = new System.Drawing.Point(3, 3);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(266, 13);
+ this.label3.TabIndex = 0;
+ this.label3.Text = "v8.20: - Include All New Creative Devices Textures";
+ this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // panel2
+ //
+ this.panel2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(181)))), ((int)(((byte)(215)))), ((int)(((byte)(243)))));
+ this.panel2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.panel2.Controls.Add(this.label4);
+ this.panel2.Location = new System.Drawing.Point(12, 296);
+ this.panel2.Name = "panel2";
+ this.panel2.Size = new System.Drawing.Size(253, 22);
+ this.panel2.TabIndex = 17;
+ this.panel2.Visible = false;
+ //
+ // label4
+ //
+ this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.label4.Location = new System.Drawing.Point(3, 3);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(245, 13);
+ this.label4.TabIndex = 0;
+ this.label4.Text = "- Include Sprays, Banners, Emojis, Musics, Toys";
+ this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ //
+ // UpdateModeOption
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(584, 344);
+ this.Controls.Add(this.panel2);
+ this.Controls.Add(this.panel1);
+ this.Controls.Add(this.groupBox1);
+ this.Controls.Add(this.groupBox4);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.optionsOKButton);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MaximizeBox = false;
+ this.Name = "UpdateModeOption";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "Update Mode Options";
+ this.groupBox4.ResumeLayout(false);
+ this.groupBox4.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.trackBar2)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.wPictureBox)).EndInit();
+ this.groupBox1.ResumeLayout(false);
+ this.groupBox1.PerformLayout();
+ this.panel1.ResumeLayout(false);
+ this.panel2.ResumeLayout(false);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+ private System.Windows.Forms.Button optionsOKButton;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.GroupBox groupBox4;
+ private System.Windows.Forms.CheckBox checkBox8;
+ private System.Windows.Forms.CheckBox checkBox7;
+ private System.Windows.Forms.Label filenameLabel;
+ private System.Windows.Forms.TrackBar trackBar1;
+ private System.Windows.Forms.Label label9;
+ private System.Windows.Forms.TrackBar trackBar2;
+ private System.Windows.Forms.Label label8;
+ private System.Windows.Forms.Button button1;
+ private System.Windows.Forms.PictureBox wPictureBox;
+ private System.Windows.Forms.CheckBox checkBox6;
+ private System.Windows.Forms.CheckBox checkBox5;
+ private System.Windows.Forms.CheckBox checkBox4;
+ private System.Windows.Forms.CheckBox checkBox3;
+ private System.Windows.Forms.CheckBox checkBox2;
+ private System.Windows.Forms.Label label6;
+ private System.Windows.Forms.GroupBox groupBox1;
+ private System.Windows.Forms.CheckBox checkBox1;
+ private System.Windows.Forms.CheckBox checkBox14;
+ private System.Windows.Forms.Label label7;
+ private System.Windows.Forms.CheckBox checkBox9;
+ private System.Windows.Forms.CheckBox checkBox11;
+ private System.Windows.Forms.CheckBox checkBox10;
+ private System.Windows.Forms.CheckBox checkBox12;
+ private System.Windows.Forms.CheckBox checkBox13;
+ private System.Windows.Forms.CheckBox checkBox15;
+ private System.Windows.Forms.Panel panel1;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Panel panel2;
+ private System.Windows.Forms.Label label4;
+ }
+}
\ No newline at end of file
diff --git a/FModel/UpdateModeOption.cs b/FModel/UpdateModeOption.cs
new file mode 100644
index 00000000..3e05776b
--- /dev/null
+++ b/FModel/UpdateModeOption.cs
@@ -0,0 +1,394 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Drawing.Imaging;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace FModel
+{
+ public partial class UpdateModeOption : Form
+ {
+ public static Bitmap ResizeImage(Image image, int width, int height)
+ {
+ var destRect = new Rectangle(0, 0, width, height);
+ var destImage = new Bitmap(width, height);
+
+ destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);
+
+ using (var graphics = Graphics.FromImage(destImage))
+ {
+ graphics.CompositingMode = CompositingMode.SourceCopy;
+ graphics.CompositingQuality = CompositingQuality.HighQuality;
+ graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
+ graphics.SmoothingMode = SmoothingMode.HighQuality;
+ graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
+
+ using (var wrapMode = new ImageAttributes())
+ {
+ wrapMode.SetWrapMode(WrapMode.TileFlipXY);
+ graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);
+ }
+ }
+
+ return destImage;
+ }
+ 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;
+ }
+ }
+
+ public UpdateModeOption()
+ {
+ InitializeComponent();
+
+ checkBox2.Checked = Properties.Settings.Default.UMCosmetics;
+ checkBox5.Checked = Properties.Settings.Default.UMVariants;
+ checkBox3.Checked = Properties.Settings.Default.UMConsumablesWeapons;
+ checkBox4.Checked = Properties.Settings.Default.UMTraps;
+ checkBox6.Checked = Properties.Settings.Default.UMChallenges;
+
+ checkBox8.Checked = Properties.Settings.Default.UMFeatured;
+ checkBox7.Checked = Properties.Settings.Default.UMWatermark;
+
+ trackBar2.Value = Properties.Settings.Default.UMSize;
+ trackBar1.Value = Properties.Settings.Default.UMOpacity;
+
+ checkBox9.Checked = Properties.Settings.Default.UMTCosmeticsVariants;
+ checkBox14.Checked = Properties.Settings.Default.UMTLoading;
+ checkBox1.Checked = Properties.Settings.Default.UMTWeapons;
+ checkBox10.Checked = Properties.Settings.Default.UMTBanners;
+ checkBox11.Checked = Properties.Settings.Default.UMTFeaturedIMGs;
+ checkBox12.Checked = Properties.Settings.Default.UMTAthena;
+ checkBox13.Checked = Properties.Settings.Default.UMTDevices;
+ checkBox15.Checked = Properties.Settings.Default.UMTVehicles;
+
+ button1.Enabled = Properties.Settings.Default.UMWatermark;
+ trackBar1.Enabled = Properties.Settings.Default.UMWatermark;
+ trackBar2.Enabled = Properties.Settings.Default.UMWatermark;
+
+ if (Properties.Settings.Default.UMFeatured == false)
+ {
+ if (!string.IsNullOrEmpty(Properties.Settings.Default.UMFilename))
+ {
+ filenameLabel.Text = "File Name: " + Path.GetFileName(Properties.Settings.Default.UMFilename);
+
+ Bitmap bmp = new Bitmap(Properties.Resources.wTemplate);
+ Graphics g = Graphics.FromImage(bmp);
+
+ Image watermark = Image.FromFile(Properties.Settings.Default.UMFilename);
+ var opacityImage = SetImageOpacity(watermark, (float)Properties.Settings.Default.UMOpacity / 100);
+ g.DrawImage(ResizeImage(opacityImage, Properties.Settings.Default.UMSize, Properties.Settings.Default.UMSize), (522 - Properties.Settings.Default.UMSize) / 2, (522 - Properties.Settings.Default.UMSize) / 2, Properties.Settings.Default.UMSize, Properties.Settings.Default.UMSize);
+
+ wPictureBox.Image = bmp;
+ }
+ }
+ if (Properties.Settings.Default.UMFeatured == true)
+ {
+ if (!string.IsNullOrEmpty(Properties.Settings.Default.UMFilename))
+ {
+ filenameLabel.Text = "File Name: " + Path.GetFileName(Properties.Settings.Default.UMFilename);
+
+ Bitmap bmp = new Bitmap(Properties.Resources.wTemplateF);
+ Graphics g = Graphics.FromImage(bmp);
+
+ Image watermark = Image.FromFile(Properties.Settings.Default.UMFilename);
+ var opacityImage = SetImageOpacity(watermark, (float)Properties.Settings.Default.UMOpacity / 100);
+ g.DrawImage(ResizeImage(opacityImage, Properties.Settings.Default.UMSize, Properties.Settings.Default.UMSize), (522 - Properties.Settings.Default.UMSize) / 2, (522 - Properties.Settings.Default.UMSize) / 2, Properties.Settings.Default.UMSize, Properties.Settings.Default.UMSize);
+
+ wPictureBox.Image = bmp;
+ }
+ }
+ }
+
+ private void optionsOKButton_Click(object sender, EventArgs e)
+ {
+ if (checkBox2.Checked == true)
+ Properties.Settings.Default.UMCosmetics = true;
+ if (checkBox2.Checked == false)
+ Properties.Settings.Default.UMCosmetics = false;
+ if (checkBox5.Checked == true)
+ Properties.Settings.Default.UMVariants = true;
+ if (checkBox5.Checked == false)
+ Properties.Settings.Default.UMVariants = false;
+ if (checkBox3.Checked == true)
+ Properties.Settings.Default.UMConsumablesWeapons = true;
+ if (checkBox3.Checked == false)
+ Properties.Settings.Default.UMConsumablesWeapons = false;
+ if (checkBox4.Checked == true)
+ Properties.Settings.Default.UMTraps = true;
+ if (checkBox4.Checked == false)
+ Properties.Settings.Default.UMTraps = false;
+ if (checkBox6.Checked == true)
+ Properties.Settings.Default.UMChallenges = true;
+ if (checkBox6.Checked == false)
+ Properties.Settings.Default.UMChallenges = false;
+ if (checkBox8.Checked == true)
+ Properties.Settings.Default.UMFeatured = true;
+ if (checkBox8.Checked == false)
+ Properties.Settings.Default.UMFeatured = false;
+ if (checkBox7.Checked == true)
+ Properties.Settings.Default.UMWatermark = true;
+ if (checkBox7.Checked == false)
+ Properties.Settings.Default.UMWatermark = false;
+ if (checkBox9.Checked == true)
+ Properties.Settings.Default.UMTCosmeticsVariants = true;
+ if (checkBox9.Checked == false)
+ Properties.Settings.Default.UMTCosmeticsVariants = false;
+ if (checkBox14.Checked == true)
+ Properties.Settings.Default.UMTLoading = true;
+ if (checkBox14.Checked == false)
+ Properties.Settings.Default.UMTLoading = false;
+ if (checkBox1.Checked == true)
+ Properties.Settings.Default.UMTWeapons = true;
+ if (checkBox1.Checked == false)
+ Properties.Settings.Default.UMTWeapons = false;
+ if (checkBox10.Checked == true)
+ Properties.Settings.Default.UMTBanners = true;
+ if (checkBox10.Checked == false)
+ Properties.Settings.Default.UMTBanners = false;
+ if (checkBox11.Checked == true)
+ Properties.Settings.Default.UMTFeaturedIMGs = true;
+ if (checkBox11.Checked == false)
+ Properties.Settings.Default.UMTFeaturedIMGs = false;
+ if (checkBox12.Checked == true)
+ Properties.Settings.Default.UMTAthena = true;
+ if (checkBox12.Checked == false)
+ Properties.Settings.Default.UMTAthena = false;
+ if (checkBox13.Checked == true)
+ Properties.Settings.Default.UMTDevices = true;
+ if (checkBox13.Checked == false)
+ Properties.Settings.Default.UMTDevices = false;
+ if (checkBox15.Checked == true)
+ Properties.Settings.Default.UMTVehicles = true;
+ if (checkBox15.Checked == false)
+ Properties.Settings.Default.UMTVehicles = false;
+
+ Properties.Settings.Default.UMSize = trackBar2.Value;
+ Properties.Settings.Default.UMOpacity = trackBar1.Value;
+
+ Properties.Settings.Default.Save();
+ Close();
+ }
+
+ private void button1_Click(object sender, EventArgs e)
+ {
+ OpenFileDialog theDialog = new OpenFileDialog();
+ theDialog.Title = "Choose your watermark";
+ theDialog.Multiselect = false;
+ theDialog.Filter = "PNG Files (*.png)|*.png|JPG Files (*.jpg)|*.jpg|DDS Files (*.dds)|*.dds|All Files (*.*)|*.*";
+
+ if (theDialog.ShowDialog() == DialogResult.OK)
+ {
+ Properties.Settings.Default.UMFilename = theDialog.FileName;
+ Properties.Settings.Default.Save();
+ filenameLabel.Text = "File Name: " + Path.GetFileName(Properties.Settings.Default.UMFilename);
+
+ if (checkBox8.Checked == false)
+ {
+ if (!string.IsNullOrEmpty(Properties.Settings.Default.UMFilename))
+ {
+ Bitmap bmp = new Bitmap(Properties.Resources.wTemplate);
+ Graphics g = Graphics.FromImage(bmp);
+
+ Image watermark = Image.FromFile(Properties.Settings.Default.UMFilename);
+ var opacityImage = SetImageOpacity(watermark, (float)trackBar1.Value / 100);
+ g.DrawImage(ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value);
+
+ wPictureBox.Image = bmp;
+ }
+ }
+ if (checkBox8.Checked == true)
+ {
+ if (!string.IsNullOrEmpty(Properties.Settings.Default.UMFilename))
+ {
+ Bitmap bmp = new Bitmap(Properties.Resources.wTemplateF);
+ Graphics g = Graphics.FromImage(bmp);
+
+ Image watermark = Image.FromFile(Properties.Settings.Default.UMFilename);
+ var opacityImage = SetImageOpacity(watermark, (float)trackBar1.Value / 100);
+ g.DrawImage(ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value);
+
+ wPictureBox.Image = bmp;
+ }
+ }
+ }
+ }
+
+ private void trackBar2_ValueChanged(object sender, EventArgs e)
+ {
+ if (checkBox8.Checked == false)
+ {
+ if (!string.IsNullOrEmpty(Properties.Settings.Default.UMFilename))
+ {
+ Bitmap bmp = new Bitmap(Properties.Resources.wTemplate);
+ Graphics g = Graphics.FromImage(bmp);
+
+ Image watermark = Image.FromFile(Properties.Settings.Default.UMFilename);
+ var opacityImage = SetImageOpacity(watermark, (float)trackBar1.Value / 100);
+ g.DrawImage(ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value);
+
+ wPictureBox.Image = bmp;
+ wPictureBox.Refresh();
+ }
+ }
+ if (checkBox8.Checked == true)
+ {
+ if (!string.IsNullOrEmpty(Properties.Settings.Default.UMFilename))
+ {
+ Bitmap bmp = new Bitmap(Properties.Resources.wTemplateF);
+ Graphics g = Graphics.FromImage(bmp);
+
+ Image watermark = Image.FromFile(Properties.Settings.Default.UMFilename);
+ var opacityImage = SetImageOpacity(watermark, (float)trackBar1.Value / 100);
+ g.DrawImage(ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value);
+
+ wPictureBox.Image = bmp;
+ wPictureBox.Refresh();
+ }
+ }
+ }
+
+ private void trackBar1_ValueChanged(object sender, EventArgs e)
+ {
+ if (checkBox8.Checked == false)
+ {
+ if (!string.IsNullOrEmpty(Properties.Settings.Default.UMFilename))
+ {
+ Bitmap bmp = new Bitmap(Properties.Resources.wTemplate);
+ Graphics g = Graphics.FromImage(bmp);
+
+ Image watermark = Image.FromFile(Properties.Settings.Default.UMFilename);
+ var opacityImage = SetImageOpacity(watermark, (float)trackBar1.Value / 100);
+ g.DrawImage(ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value);
+
+ wPictureBox.Image = bmp;
+ wPictureBox.Refresh();
+ }
+ }
+ if (checkBox8.Checked == true)
+ {
+ if (!string.IsNullOrEmpty(Properties.Settings.Default.UMFilename))
+ {
+ Bitmap bmp = new Bitmap(Properties.Resources.wTemplateF);
+ Graphics g = Graphics.FromImage(bmp);
+
+ Image watermark = Image.FromFile(Properties.Settings.Default.UMFilename);
+ var opacityImage = SetImageOpacity(watermark, (float)trackBar1.Value / 100);
+ g.DrawImage(ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value);
+
+ wPictureBox.Image = bmp;
+ wPictureBox.Refresh();
+ }
+ }
+ }
+
+ private void checkBox7_CheckedChanged(object sender, EventArgs e)
+ {
+ if (checkBox7.Checked == false)
+ {
+ button1.Enabled = false;
+ trackBar1.Enabled = false;
+ trackBar2.Enabled = false;
+ }
+ if (checkBox7.Checked == true)
+ {
+ button1.Enabled = true;
+ trackBar1.Enabled = true;
+ trackBar2.Enabled = true;
+ }
+ }
+
+ private void checkBox8_CheckedChanged(object sender, EventArgs e)
+ {
+ if (checkBox8.Checked == false)
+ {
+ Bitmap bmp = new Bitmap(Properties.Resources.wTemplate);
+ Graphics g = Graphics.FromImage(bmp);
+ if (!string.IsNullOrEmpty(Properties.Settings.Default.UMFilename))
+ {
+ Image watermark = Image.FromFile(Properties.Settings.Default.UMFilename);
+ var opacityImage = SetImageOpacity(watermark, (float)trackBar1.Value / 100);
+ g.DrawImage(ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value);
+ }
+ wPictureBox.Image = bmp;
+ }
+ if (checkBox8.Checked == true)
+ {
+ Bitmap bmp = new Bitmap(Properties.Resources.wTemplateF);
+ Graphics g = Graphics.FromImage(bmp);
+ if (!string.IsNullOrEmpty(Properties.Settings.Default.UMFilename))
+ {
+ Image watermark = Image.FromFile(Properties.Settings.Default.UMFilename);
+ var opacityImage = SetImageOpacity(watermark, (float)trackBar1.Value / 100);
+ g.DrawImage(ResizeImage(opacityImage, trackBar2.Value, trackBar2.Value), (522 - trackBar2.Value) / 2, (522 - trackBar2.Value) / 2, trackBar2.Value, trackBar2.Value);
+ }
+ wPictureBox.Image = bmp;
+ }
+ }
+
+ private void checkBox3_MouseEnter(object sender, EventArgs e)
+ {
+ panel1.Visible = true;
+ }
+ private void checkBox3_MouseLeave(object sender, EventArgs e)
+ {
+ panel1.Visible = false;
+ }
+ private void checkBox3_MouseMove(object sender, MouseEventArgs e)
+ {
+ panel1.Left = e.X;
+ panel1.Top = e.Y;
+ }
+
+ private void checkBox10_MouseEnter(object sender, EventArgs e)
+ {
+ panel2.Visible = true;
+ }
+ private void checkBox10_MouseLeave(object sender, EventArgs e)
+ {
+ panel2.Visible = false;
+ }
+ private void checkBox10_MouseMove(object sender, MouseEventArgs e)
+ {
+ panel2.Left = e.X + 225;
+ panel2.Top = e.Y + 225;
+ }
+ }
+}
diff --git a/FModel/UpdateModeOption.resx b/FModel/UpdateModeOption.resx
new file mode 100644
index 00000000..668416be
--- /dev/null
+++ b/FModel/UpdateModeOption.resx
@@ -0,0 +1,878 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ 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
+ Jv81Jif/NCcn/zMoKP8yKCj/MSgo/jAoKFwwKCgAMikpADEoKF0zKCj+NCgo/zQnJ/81Jib/NiYm/zYl
+ Jv89LC3/yMTE////////////4N3d/009Pv82JCX/NyYm/zclJv82JSb/NSYm/zQnJ/80KCj/Migo/jEo
+ KFwyKCgAMigoADEnJ10yKCj+NCgo/zUmJ/81JSb/NiUm/zcmJv8+LS3/yMPD////////////5ePj/08/
+ QP82JCT/NyUm/zgmJ/83Jif/NiUm/zUmJ/8zJyj/Migo/jIoKFwyKCgAMigoADInJ10zKCj+NSgo/zYm
+ J/83Jib/NyYm/zglJv8/LS3/yMPD////////////5OLi/1A+P/84JCX/OSYm/zgmJv84Jif/NyYm/zYm
+ J/80Jyj/Mygo/jMoKFwzKCgAMicnADInKF0zKCj+NScn/zYmJv83JSb/NyUm/zglJv8/LC3/yMPD////
+ ////////5OHi/1E+Pv85JCX/OSUm/zkmJ/83JSb/NiUm/zYmJv81Jyf/Mygo/jIoKFwyKCgAMygoADMo
+ KF00KCj+NSYn/zYlJv83JSb/OCUm/zsnJ/9ALC3/yMPD////////////4+Hh/1A9Pv85JCT/OiUm/zwn
+ KP84Jif/NiUm/zYmJv81Jif/Mycn/jInJ1wyJycAMycnADInJ100Jyj+NSYn/zcmJv83Jib/OCUm/zom
+ J/9ALC3/ycPD////////////4+Hh/1NAQP89Jyj/Oycn/zsmJ/84Jib/NyUm/zYmJv81Jif/Mycn/jMo
+ KFwzKCgAMicnADInJ100KCj+NSYn/zYmJv83Jib/OCUm/zklJv9ALC3/ycPE////////////9vX1/8bA
+ wP++t7f/bF1e/zcjJP84Jib/OCYn/zYlJv82Jif/NCcn/jMoKFwzKCgAMicnADInJ10zJyf+NSYm/zYl
+ Jv83Jif/NyUm/zglJv8/LC3/yMPD////////////////////////////hXl6/zUiIv84JSb/NyYm/zYl
+ Jv81Jif/Mycn/jInJ1wyJycAMygoADIoKF00KCj+NScn/zYlJv83Jif/NyUm/zglJv8/LC3/yMPE////
+ ////////////////////////iX9//zUiI/84Jib/NyYm/zYlJv81Jyf/Mygo/jInJ1wyJycAMykpADMo
+ KF00KCj+NSgo/zUmJv82Jib/NyYm/zclJv8+LC3/yMPD////////////+vr6/9fT0//Qzc3/e3Bw/zUj
+ JP83JSb/NiUm/zUmJv81KCj/NCgo/jIoKFwzKCgAMigoADIoKF0yKCj+NCgo/zUmJ/81JSb/NiUm/zcl
+ Jv8+LS3/yMPD////////////6ejo/1tLTP8/LS7/PCor/zcmJv83Jif/NiUm/zUmJ/80KCj/Migo/jIo
+ KFwyKCgAMSgoADAnJ10yKCj+Mygo/zQoKP81Jif/NiYn/zclJv8+LS3/yMPD////////////5+Xl/04+
+ P/8zICH/NSMk/zcmJv83Jif/NSYn/zQnKP8zKCj/Migo/jEoKFwyKCgAMCcnADAnJ10wKCj+Migo/zMo
+ KP80Jyf/NSYm/zUlJv88LC3/x8PD////////////7evr/3xxcf9nWlv/XE9P/zkpKf81Jib/NCcn/zMn
+ KP8yKCj/MSgo/jAoKFwwKCgALygoAC8oKF0wKCj+MCcn/zInJ/8zJyf/NCcn/zYnKP88LC3/x8PD////
+ /////////v7+//j4+P/4+Pj/1tPU/0g6O/8zJib/Mycn/zIoKP8xKCj/Lycn/i8nJ1wvJycALycoAC8o
+ KF0vKCj+MCcn/zEoKP8yKCj/Mycn/zUoKP86Li7/x8TE////////////////////////////6+rq/1RK
+ Sv8xJib/Micn/zEnKP8wJyj/Lycn/i8oKFwvKCgALicnAC4nJ14vKCj+Lygo/zAoKP8wKCj/MScn/zEn
+ J/85Li7/x8XF////////////////////////////9fX1/2JbW/8vJSX/MSgo/y8nJ/8wKCj/Lygo/i8o
+ KFwvKCgALigoAC4oKFkuJyj9Licn/y8nJ/8wKCj/MCcn/zAnJ/80Kyv/gHp6/6Cbm/+empr/npqa/56a
+ mv+fmpr/m5eX/1BJSf8uJib/MCgo/y8nJ/8uJyf/Licn/S4oKFcuKCgAMCoqADErKyouKCnXLicn/y4n
+ J/8wKCj/Lycn/y8nJ/8wKCj/LyYm/y4lJf8uJSX/LiUl/y4lJf8vJib/LSUl/y8nJ/8vKCj/Lygo/y4n
+ J/8uKCj/Ligo1jArKykvKioA/wD/APwAPwDgAAcAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAA
+ AQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAgAABAIAAAQCAAAEAKAAAACAA
+ AABAAAAAAQAgAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAABQSUkAMSgoADgwMAo1LCxEMyoqpjEoKPUwKCj0MikppTQsLEM5MDEKMSgoAFNO
+ TgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAABMQEAAc2RjADowMBc0KipaMikpsTIoKO0xJyf/LyUl/y8lJf8wJib/Migo7TIp
+ KbA0KipZOS8vFnVnZwBNQUEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP///wA4Li8AOjIyBDYsLCw2Kyt9NSoqzzInJ/ovJSX/MSYm/0E3N/5kXFz9XlZW/T0z
+ M/4xJib/MCUl/zEnJ/o0KirPNiwsfDYsLCw8NDQEOTAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAFBKSgAWDQ0AODAwDjQrK0gzKSmgMigo5jIoKP4zKCj/PDIy/mBXV/2YkpL8z83N/fHx
+ 8f7u7u7+ycfH/ZOOjvxeVVX9PDEx/jMoKP8yKCj+Migo5TMpKZ80KytHNi8vDh4VFQBMRkYAAAAAAAAA
+ AAAAAAAAAAAAADs0NABDPj4BNCwsHjIqKmoyKSnAMigo9DIoKP8yJyf/Mycn/zUpKf5KQED7bWRk/Hty
+ c/18c3T9e3Jy/Xtxcv19c3T9e3Jy/WtiY/xKQED7NSkp/jMnJ/8zKCj/Mygo/zIoKPQxKCi/MioqaTQt
+ LR1FP0ABOzQ0AAAAAAA/OjoAKR8fADMrK1AwKCjWMCcn/TEnJ/8xJyf/Mycn/zMnJ/80Jyf/NCYn/zQl
+ Jv8xISL/MSAh/zIhIv8yIiP/MiIj/zIiI/8yIiP/MyMk/zQlJv80Jif/Mycn/zMnJ/8zJyf/Micn/zEn
+ J/8wKCj8MCgo1TIqK04qICAAQDo7ADIrKwAzLCwHMCgotTAnJ/8xJyf/MScn/zMoKP81KCn/NCcn/zUm
+ Jv81JSb/Nyco/1FDRP9NPj//PCwt/zUkJf8zIiP/NSQl/zcmJ/83Jyf/NiYm/zUlJv81Jib/NSco/zQo
+ KP8yJyf/Micn/zEnJ/8wJyf/MCgoszMsLAYyKysALycnAC8nJwoxKCi/Migo/zIoKP8zJyj/Mycn/zQn
+ J/81Jib/NSUm/zYlJv85KCn/sqys/+Ti4v/Ev7//oZma/3xxcv9IOTr/NiQl/zcmJv83JSb/NiUm/zUl
+ Jv81Jib/NCcn/zMnJ/8zKCj/Mygo/zEoKP8wKCi+LycnCS8nJwAvJycALycnCjIoKL8zKCj/Mygo/zQo
+ KP8zJyf/NiYn/zYmJ/82JSb/NiUm/zkoKf+7trb/////////////////+vr6/3pub/80IiP/OCYm/zgm
+ J/83JSb/NiUm/zUlJv81Jib/NCcn/zQoKP8zKCj/Mygo/zEoKL0uJycJLycnADAnJwAwJycKMigovzIo
+ KP80KCj/NCco/zUmJv81JSb/NiUm/zclJv83Jib/Oikp/7u2tv/////////////////9/f3/fHFx/zQh
+ Iv83JSb/NyUm/zclJv83Jif/NyYm/zUlJv81Jib/NCgo/zMoKP8yKCj/MigovS8nJwkwJycAMScnADEn
+ JwoxJye/Micn/zMnJ/81Jyf/NSUm/zYlJv83Jib/NyYm/zknJ/88KSr/u7a2//////////////////z8
+ /P98cHD/NiIj/zkmJv84Jib/OCUm/zknJ/84Jif/NiYm/zYmJv80Jyf/Mycn/zInJ/8yKCi9MigoCTIo
+ KAAxJycAMCYmCjIoKL80KCj/NSgo/zYnJ/82Jib/NyYm/zcmJ/83JSb/OCYm/zwpKf+8trb/////////
+ /////////Pz8/3xvcP83IiP/OiYm/zomJ/84JSb/OCYn/zgmJ/83Jib/NiYm/zYmJ/80KCj/NCgo/zMo
+ Kb0zKCgJMygoADInJwAxJycKMicnvzMnJ/80Jyf/NiYm/zYlJv83JSb/NyUm/zglJv85JSb/PCgp/7y2
+ tv/////////////////8/Pz/fG5v/zgiI/86JSb/OSUm/zklJv84Jib/NyUm/zYlJv82JSb/NSUm/zQn
+ J/8zKCj/MigovTEoKAkyKCgAMygoADIoKAozKCi/NCgo/zQmJ/81JSb/NiYm/zclJv83JSb/OSYn/zsm
+ J/88KCn/vLa2//////////////////z8/P97bW7/OSIj/zolJv85JSb/OyYn/zomJ/84Jib/NiUm/zcm
+ Jv82Jib/NScn/zMnJ/8yJye9MSgoCTIoKAAzKCgAMigoCjMoKL80KCj/NSYn/zYlJv83Jib/NyUm/zcl
+ Jv87Jyj/PSco/zwoKf+8trb/////////////////+/v7/3psbf85IiP/OyUm/zolJv88Jyj/PCgo/zgm
+ Jv82JSb/NiYm/zYmJv81Jif/Mycn/zMnJ70xKCgJMicnADInJwAxJycKMycnvzQnKP81Jib/NiYm/zcm
+ Jv83Jib/NyUm/zomJ/86Jib/PSgp/7y2tv/////////////////7+/v/emtr/zgiIv87JSb/OiUm/zsm
+ J/85Jif/OCYm/zclJv83Jib/NiUm/zUmJ/8zJyf/MygovTEoKAkyKCgAMScnADAnJwoyJye/NSgo/zUm
+ J/82Jib/NyYm/zcmJv84JSb/OSYm/zklJv89KSn/vba2//////////////////7+/v/Jw8P/raWl/6+n
+ p/9xZGT/OCQl/zglJv84Jif/OCYn/zcmJv81JSb/Nicn/zQnJ/8zKCi9MSgoCTIoKAAxJycAMCcnCjIn
+ J780Jyf/NSYm/zUlJv82JSb/NyUm/zclJv84JSb/OSUm/zwoKf+8trb/////////////////////////
+ /////////////5mQkP83IyP/OCUm/zclJv83Jib/NyYm/zUlJv81Jif/Mycn/zInJ70wJycJMScnADEn
+ JwAwJycKMicnvzMnJ/81Jif/NSUm/zcmJv84Jif/OCYm/zclJv85JSb/PSkp/7y2tv//////////////
+ ////////////////////////m5KS/zYjI/84JSb/OCYn/zcmJv82JSb/NiUm/zUmJ/8zJyf/MicnvTAn
+ JwkxJycAMScnADAnJwozKCi/NCgo/zQnJ/81JSb/NiUm/zcmJ/83JSb/NyUm/zglJv88KCn/vLa2////
+ //////////////////////////////////+hmJn/NiMk/zglJv83JSb/NyYm/zYlJv82Jib/NScn/zMo
+ KP8yJye9MCcnCTEnJwAxJycAMScnCjMoKL80KCj/NSgo/zYmJ/81JSb/NyYn/zcmJ/83JSb/OCUm/zso
+ Kf+8trb///////////////////////b19f/v7e7/8fHx/6CYmf83JSX/NyUm/zYlJv82JSb/NSUm/zYm
+ J/81KCj/NCgo/zMoKL0xJycJMScnADEnJwAxJycKMigovzMoKP80KCj/NScn/zUlJv82JSb/NiUm/zcm
+ Jv84Jib/Oigp/7u2tv/////////////////+////m5KS/1lKS/9cTU7/TT4+/zgmJv83Jif/NyYm/zYl
+ Jv81JSb/NScn/zQoKP8zKCj/MigovTEnJwkxJycAMCcnAC8nJwoxJye/Micn/zMnJ/80Jyf/NSYm/zUl
+ Jv82JSb/NyUm/zgmJ/87KSr/u7a2//////////////////7+/v+AdXb/Mh8g/zUjJP82JCX/NyUm/zgn
+ J/83Jif/NiUm/zUmJ/80Jyf/Mycn/zInJ/8yKCi9MCgoCTEoKAAvJycALSYmCjEoKL8yKCj/Mygo/zUo
+ KP80Jyf/NiYn/zYmJ/82JSb/NyYn/zopKf+7trb//////////////////f39/4B0df8zISH/NyUl/zcl
+ Jv82JSb/NyYn/zYmJ/82Jif/NSco/zQoKP8zKCj/Migo/zIoKL0wKCgJMSgoAC8nJwAvJycKLycnvzEn
+ J/8yKCj/Mygo/zQnJ/80Jyf/NSUm/zUlJv82JSb/OSgp/7u2tv/////////////////9/f3/i4GC/0Y2
+ N/9IODn/RTY3/zkpKv81JSb/NSYm/zQnJ/8zJyf/Micn/zInJ/8xKCj/MSgovTAoKAkwKCgAMCgoADEo
+ KAowKCi/MCgo/zEnJ/8xJyf/Mycn/zMnJ/80Jyf/Nicn/zYmJ/84KCn/u7a2////////////////////
+ ///q6en/3dvb/93a2v/T0ND/XlJS/zQkJf80Jyf/Mycn/zMoKP8yKCj/Migo/zAnJ/8vJye9MCgoCTAo
+ KAAvKCgALygoCi8oKL8wKCj/MCcn/zEnJ/8yKCj/Micn/zMnJ/82KSn/Nygp/zgpKf+6trb/////////
+ //////////////////////////////z8/P95cHD/MyYm/zQoKP8yJyf/Mico/zEoKP8wKCj/Lycn/y8n
+ J70vJycJLycnAC8oKAAvKCgKLycovy8nJ/8vJyf/MCgo/zIoKP8yKCj/Micn/zQoKP81KCj/Nioq/7q2
+ tv///////////////////////////////////////////4yFhf8xJSX/Migo/zEnJ/8xJyf/MCcn/zAn
+ J/8vJyf/LygovS8oKAkvJygALicnAC0nJwouJye/MCgo/y8oKP8wKCj/MCgo/zEoKP8xJyf/Micn/zIn
+ J/82Kyv/ure3////////////////////////////////////////////oZyd/zAmJv8yKCj/Migo/zAo
+ KP8vJyf/MCgo/y8oKP8vKCi9LigoCS4oKAAtJycALScnCi0nJ78uKCj/Licn/y8nJ/8vJyf/MCcn/zAn
+ J/8xJyf/MScn/zQqKv+sqKj/7e3t/+rq6v/q6ur/6urq/+rq6v/q6en/6urp/+3t7f+no6P/Mikp/zAn
+ J/8wKCj/MCgo/y8nJ/8vKCj/Licn/y4nJ74uKCgJLigoADMtLQA1LzAFLykprS4nJ/8uJyf/Licn/y8o
+ KP8wKCj/MCcn/y8nJ/8wJyf/MSgo/0Y+Pv9RSUn/UUhI/1FISf9RSEn/UEhI/1FJSf9RSUn/UElJ/0U+
+ Pv8wKCj/MCgo/y8oKP8vJyf/Licn/y4nJ/8tJyf/LigoqzQvLwQyLC0AQTw9ACslJQAxKytRLygp5S4n
+ J/8uJyf/Lygo/zAoKP8vKCj/Lycn/zAnJ/8wKCj/LyYm/y0lJf8uJSX/LiUl/y4lJf8tJSX/LiUl/y8m
+ Jv8tJSX/LiYm/y8nJ/8vKCj/Lygo/y4nJ/8uKCj/Ligo/y4oKOQwKytPKyQkAEM/PwD/8A///8AD//4A
+ AH/4AAAfwAAAA8AAAAOAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABwAAAAygA
+ AAAwAAAAYAAAAAEAIAAAAAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFP0AAAAAAADsz
+ MxQ1LS1bMioqwDAoKPwwKCj8MSkpvzMsLFk4MTIUAAAAAEQ/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPzc3AEQ8
+ PAM4Li4kNCsrcDQqKsQyKSn1Migo/zIoKP8xKCj/MCcn/zEoKPUzKirDNCsrbjcuLyNDPDwCPjY2AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd29vAC4j
+ IwBDODgKNy0tPzQqKpMyKCjeMScn/TIoKP8yJyf/MScn/zEnJ/8xJyf/MScn/zEnJ/8xJyf/Migo/TIo
+ KN00KiqRNy0tPUE3NwoqICEAioODAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEU9
+ PgBUT08BOjExGTkuL144LS21Mykp8DInJ/8xJyf/MScn/zEnJ/8wJSX/Mygo/kE3N/08MzP9MCYm/zAl
+ Jf8xJyf/Migo/zEnJ/8xJyf/Mykp7zcsLLM6Ly9cOjExGF1XWAFHP0AAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMPf
+ 3wA4Ly8AQDo6BTcuLi80KiqANCkp0TMpKfozKSn/Mygo/zEnJ/8wJSX/Micn/kI3N/1oYGD8oJub/NHP
+ z/3Ixsb8lI6O/GFYWPw/NDT9Micn/zAlJf8xJib/Migo/zMoKf80KSn6NCoq0DQrK343Li8uPDY2BTcw
+ MAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AABMRkYAAAAAADozMw81LS1LMyoqojIoKOcxJyf+MScn/zIoKP8yJyf/NCkp/kE2Nv1kXFz8mpaW+9DP
+ z/zz8/P+/////////////////v7+/+/v7/7KyMj8lpGR+2JaWvxANTX9NCkp/jMoKP8yJyf/MScn/zIo
+ KP4yKCjmNCoqoDQsLEk5MjIPEAUFAE1ISAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAPzg4AEY/PwI2Ly8iNCwsbDIqKsEyKCj1Migo/zInJ/8yJyf/Mygo/zMoKP8zJyf/PTMz+mJb
+ W/mGgID7lpCQ+5eRkfyWj5D8lo+P/JaPj/yWj4/8lo+P/JeQkPyYkZL8lY+P+4R/f/thWlr5PzU1+jQo
+ KP4zJyf/Micn/zMpKf8zKCj/Mygo/zEoKPQxKSnANCwsazkwMSFHQkECQDk5AAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAD03OABPTE4BNS0uLTIqKo0wKCjbMCcn/DEnJ/8yJyf/Micn/zInJ/8yJyf/Mycn/zMn
+ J/80KCj/NCcn/zUnJ/80JSb/NCQl/zMjJP8zIyT/MyMk/zMjJP8zIyT/MyMk/zMjJP8zIyT/MyQk/zQl
+ Jf80Jyf/NCgo/zMnJ/80KCj/Mycn/zMoKP8zKCj/Migo/zInJ/8wJyf/MCgo/DEpKdoyKiqMNS4uLFZV
+ VAE+ODgAAAAAAAAAAAAAAAAAQj09ADEpKQA1LS09MSkp2zAnJ/8wJyf/MCcn/zEnJ/8xJyf/Micn/zMo
+ KP8zJyf/Mycn/zQnJ/80Jif/NSUm/zUlJv81JSb/NSUm/zYlJv82JSb/NiUm/zYlJv82JSb/NSUm/zUl
+ Jv81JSb/NSUm/zYmJv81JSb/NSYm/zQmJ/8zJyf/Mycn/zMnJ/8zJyf/Micn/zIoKP8xJyf/MScn/y8n
+ J/8wJyf/MSkp2TQtLTowKSkARUBAAAAAAAAAAAAAODExAJ2oqAAxKSmXMCcn/zAnJ/8xJyf/Micn/zEn
+ J/8yJyj/NSkp/zUpKf80KCj/NCYn/zUlJv81JSb/NiUm/zcmJ/85Kir/Nycn/zQiI/80IiP/NSQl/zYl
+ Jv82JSb/NiUm/zYlJv82Jib/OCcn/zcnJ/82Jif/NSUm/zUlJv81Jib/NCcn/zUoKP80KCj/Mygo/zIn
+ J/8xJyf/Micn/zEnJ/8wJyf/MCcn/zEpKZMAAAAAODExAAAAAAAAAAAALycnAC4mJgMwKCirMCgo/zAn
+ J/8xJyf/MScn/zInJ/8zJyf/NSgo/zQoKP81Jyf/NSUm/zUlJv82Jib/NiUm/zYlJv+BeHj/raen/4d+
+ f/9nWlv/Tj9A/z0tLv81JCX/NCIj/zYlJv83Jib/OCYn/zcmJ/83Jib/NSUm/zUlJv82Jib/NSUm/zUn
+ J/80KCj/Mycn/zMnJ/8yJyf/Migo/zEnJ/8wJyf/Lycn/y8nJ6kvJycDLycnAAAAAAAAAAAALycnACwl
+ JQMxKCirMikp/zIoKP8zKCj/Mygo/zMoKP8zJyf/Mycn/zUmJ/81Jib/NSUm/zUlJv82Jib/NiUm/zUk
+ Jf+hm5v///////39/f/z8vL/397e/8O/v/+hmpv/dmxs/z4tLv82JCX/NiUm/zcmJv83JSb/NiUm/zYl
+ Jv82Jib/NSUm/zUlJv81Jyf/NCcn/zMnJ/80KCj/NCkp/zMoKP8yKCj/MSgo/zAoKKgsJSUDLycnAAAA
+ AAAAAAAALycnACwlJQMxKCirMigp/zMoKP8zKCj/NCgo/zQoKP8zJyf/NCYn/zcnJ/82Jif/NiYm/zYl
+ Jv83Jib/NiUm/zUkJf+gmpr/////////////////////////////////4N7e/09AQP81IyT/NyUm/zgn
+ J/84Jif/NyYm/zYlJv83Jib/NSUm/zUlJv81JSb/NCYn/zMnJ/80KCj/NCgp/zMoKP8zKCj/Migo/zAo
+ KKgqJCQDLycnAAAAAAAAAAAALycnAColJQMyKCirMygp/zMoKP8zKCj/NSgo/zQoKP80Jif/NSUm/zUl
+ Jv82Jib/NiYm/zcmJv83Jib/NyUm/zYkJf+hmpr/////////////////////////////////4uDh/09A
+ Qf81IyT/NyUm/zclJv84Jib/NyYm/zcmJv83Jib/NiUm/zYlJv82Jib/NSUm/zQmJ/80KCj/NSgo/zMo
+ KP8zKCj/Mygo/zEoKKgpJCQDLycnAAAAAAAAAAAAMCcnAC0mJgMyKCirMigo/zIoKP80KCj/NCgo/zQn
+ J/81JSb/NSUm/zUlJv82JSb/NiUm/zclJv84Jif/OSYn/zckJf+gmZr/////////////////////////
+ ////////4uDg/08/QP82IyT/NyUm/zclJv83JSb/NyUm/zclJv83Jif/OCYn/zcmJv81JSb/NiUm/zUl
+ Jv80Jyf/NCgo/zMoKP8yKCj/Migo/zEoKKgtJiYDMCcnAAAAAAAAAAAAMScnADEnJwMxJyerMScn/zIn
+ J/8zJyf/NCcn/zUmJ/82JSb/NSUm/zYlJv83Jib/NiUm/zcmJv85Jyf/Oicn/zglJf+hmZr/////////
+ ////////////////////////4d/f/1A/QP84JCX/OCUm/zglJv84Jib/NyUm/zgmJv85Jyf/OCcn/zgm
+ J/82JSb/NSUm/zUlJv80Jib/Mycn/zMnJ/8yJyf/Micn/zIoKKgyKCgDMigoAAAAAAAAAAAAMScnADAm
+ JgMxJyerMykp/zMoKP80Jyj/NSgo/zYmJ/82Jib/NSUm/zgmJ/85Jyf/NyUm/zgmJv86Jyf/Oicn/zgl
+ Jf+hmZr/////////////////////////////////4d/f/1A/P/84JCX/OSUm/zsmJ/87Jyf/NyUm/zgm
+ Jv85Jyf/OCcn/zgmJ/83Jif/NyYn/zcnJ/81Jib/NSgo/zQoKP8zKCj/Mygo/zMoKKgyJycDMigoAAAA
+ AAAAAAAAMScnADAmJgMxJyerMygo/zQoKP80KCj/Nigo/zcmJ/82Jib/NiUm/zcmJv83Jib/NyUm/zgl
+ Jv84Jib/OSYm/zklJf+hmZr/////////////////////////////////4N7e/1A/P/85JCX/OSUm/zom
+ Jv86Jib/OCUm/zglJv84Jib/OCYm/zcmJ/82JSb/NiUm/zUlJv81JSb/Nigo/zQoKP80KCj/NCkp/zMo
+ KKgzKSkDMykpAAAAAAAAAAAAMScnADEnJwMxJyerMicn/zMnJ/80Jyf/Nicn/zYmJv82JSb/NyUm/zYl
+ Jv82JSb/NyUm/zclJv84JSb/OSUm/zgkJf+impr/////////////////////////////////4N3d/1A+
+ Pv85JCX/OiUm/zklJv85JSb/OSUm/zglJv84JSb/NyUm/zclJv83JSb/NiUm/zYlJv81JSb/NSYm/zMn
+ J/80Jyj/Mygo/zIoKKgxJycDMigoAAAAAAAAAAAAMygoADQpKQMzKCirMygo/zQoKP80Jyf/NSUm/zUl
+ Jv82JSb/NyYm/zcmJv83JSb/OCUm/zkmJ/86Jif/OiYn/zgkJf+impr/////////////////////////
+ ////////393d/1A9Pf86JCX/OyYm/zomJv85JSb/OiUm/zomJ/85Jif/OCYn/zclJv82JSb/NiUm/zcm
+ J/82Jif/NiYn/zUoKP80Jyf/Micn/zEnJ6gzKCgDMigoAAAAAAAAAAAAMigoADMpKQMyJyerMycn/zQo
+ KP80Jyf/NSUm/zUlJv83Jib/NyYm/zYlJv83JSb/OCYm/zomJ/87Jif/OyYn/zgkJf+imZr/////////
+ ////////////////////////3tzc/088Pf87JCX/PCYm/zolJv85JSb/OiYm/zsmJ/85Jif/OSYn/zgl
+ Jv82JSb/NiUm/zcmJ/82Jib/NSUm/zUnJ/8zJyf/Mycn/zInJ6g0KSkDMygoAAAAAAAAAAAAMygoADIp
+ KQMyKCirNCgo/zQoKP80Jif/NSUm/zUlJv82JSb/NyYm/zYlJv83JSb/OCYm/z0oKP8/KSn/OyYn/zgk
+ Jf+imZr/////////////////////////////////3tvc/088PP86JCX/PCYm/zslJv85JSb/OiYm/z4o
+ KP8+KSn/OSYn/zglJv83JSb/NiUm/zcmJv82Jib/NiYm/zUnJ/8zJyf/Mycn/zInJ6gvJycDMScnAAAA
+ AAAAAAAAMygoADIoKQMzKCirNCgo/zQoKP81Jif/NSUm/zYmJ/84Jif/OCYn/zclJv83JSb/OCYn/zsn
+ J/89Jyj/OyYn/zkkJf+impr/////////////////////////////////3tvb/088PP87JSX/PCYn/zsl
+ Jv86JSb/OiYm/zwnJ/88Jyj/OSYn/zglJv83JSb/NiUm/zcmJv82Jib/NiYn/zUmJ/8zJyf/Myco/zMo
+ KKgvKCcDMigoAAAAAAAAAAAAMScnAC8nJwMyJyerMycn/zQnJ/81Jib/NSUm/zYmJv82JSb/NyYm/zcl
+ Jv83JSb/OCUm/zomJ/86Jib/OiYm/zkkJf+impr/////////////////////////////////3dra/0w4
+ OP83ISL/OSMj/zkiI/84IyT/OiUm/zomJ/85Jib/OCYm/zglJv83JSb/NyYm/zcmJv81JSb/NSUm/zUm
+ J/8zJyf/Mygo/zMoKKgsJSUDMScnAAAAAAAAAAAAMScnAC8nJwMyJyerNCgo/zYpKf81Jif/NSUm/zYm
+ J/83Jib/NyYn/zclJv84JSb/OCYm/zkmJv85JSb/OSUm/zslJf+jmpr/////////////////////////
+ ////////7Ovr/5mOj/+MgIH/jYGC/46Cg/9yZWX/PCgp/zolJv84JSb/NyUm/zkmJ/84Jif/OCYn/zYl
+ Jv81JSb/NiYn/zcoKP80KCj/Mygo/zMoKKguJiYDMicnAAAAAAAAAAAAMScnAC8nJwMyJyerNCgo/zQo
+ KP81Jif/NSUm/zYmJ/83Jib/NyYn/zclJv83JSb/OCUm/zklJv86Jib/OSUm/zolJf+jmpr/////////
+ ///////////////////////////////////+//7//v////////+/urr/Pisr/zklJv85Jib/NyUm/zkm
+ J/84Jif/OCYn/zYlJv81JSb/NiYm/zUnJ/8zJyf/Mycn/zMoKKguJycDMicoAAAAAAAAAAAAMScnADAn
+ JwMyJyerMycn/zMnJ/80Jif/NSUm/zUlJv82JSb/NiUm/zclJv83JSb/OCUm/zglJv85JSb/OSUm/zgk
+ Jf+imZr////////////////////////////////////////////////////////////Au7v/Piss/zkl
+ Jv84JSb/NyUm/zclJv83JSb/NiUm/zclJv81JSb/NSUm/zQmJ/8zJyf/Mycn/zEnJ6gvJycDMScnAAAA
+ AAAAAAAAMScnADAnJwMyJyerMycn/zQoJ/80Jyf/NiUm/zUlJv82JSb/OCYn/zgmJ/84Jib/NyUm/zcl
+ Jv85JSb/OSUm/zklJf+impr/////////////////////////////////////////////////////////
+ ///Cvb7/Piss/zglJv83JSb/OCUm/zgmJ/83Jib/NiUm/zYlJv81JSb/NiYm/zQnJ/80KCj/Mycn/zEn
+ J6gwJycDMScnAAAAAAAAAAAAMScnAC8mJgMyJyerMygo/zMnJ/80Jyf/NSUm/zUlJv82Jib/OCcn/zgn
+ J/84Jif/NyUm/zclJv85Jib/OiUm/zolJf+impr/////////////////////////////////////////
+ ///////////////////GwsL/QC0u/zglJv84Jib/OCUm/zkmJ/83Jif/NyYm/zYlJv81JSb/NiYm/zQn
+ J/8zJyf/Micn/zEnJ6gxJycDMScnAAAAAAAAAAAAMScnAC4lJQMyKCirNCkp/zQoKP80KCj/NSYn/zUl
+ Jv81JSb/NiUm/zYlJv83JSb/NyUm/zclJv84Jib/OSUm/zgkJf+impr/////////////////////////
+ ///////////////////////////////////MyMj/Qi8w/zclJf84Jib/NyUm/zclJv83JSb/NiUm/zYl
+ Jv82Jib/Nicn/zQoKP80KCj/Mygo/zIoKKgvJiYDMScnAAAAAAAAAAAAMScnAC4lJQMzKCirNCkp/zUo
+ KP81KCj/Nico/zYmJv81JSb/NiUm/zgmJ/83Jif/OCYm/zclJv84Jib/OCUm/zgkJf+impr/////////
+ ///////////////////////////////////////////////////V0tL/RjU1/zckJf84Jib/NyUm/zYl
+ Jv83JSb/NiUm/zUlJv82Jib/Nigo/zUoKP80KCj/Mygo/zIoKKguJSUDMScnAAAAAAAAAAAAMScnAC4l
+ JQMzKCirMygo/zQoKP80KCj/NSgo/zYmJ/81JSb/NSUm/zcmJv83Jif/NyYm/zglJv84Jib/NyUm/zck
+ Jf+hmpr/////////////////////////////////+Pf3/8G8vP+yrK3/s62t/7Surv+dlpb/QzMz/zcl
+ Jf84Jib/NyUm/zclJv82JSb/NSUm/zUlJv82Jif/NSgo/zUoKP80KCj/Mygo/zIoKKgtJCQDMScnAAAA
+ AAAAAAAAMScnAC8mJQMyKCirMigo/zMoKP80KCj/NCgo/zUmJ/81JSb/NSUm/zYlJv82JSb/NiUm/zcm
+ Jv84Jib/OCYn/zYkJf+hmZr/////////////////////////////////6ejo/1lJSv84JSb/OSco/zkn
+ KP85Jyj/OCYm/zglJv84Jif/NyYn/zcmJv82JSb/NSUm/zUlJv81Jyf/NCgo/zQoKP8zKCj/Migo/zIo
+ KKgvJSUDMScnAAAAAAAAAAAAMCcnAC8nJwMxJyerMScn/zEnJ/8zJyf/Mycn/zQnJ/81Jib/NSUm/zUl
+ Jv82JSb/NiUm/zcmJv84Jyf/OScn/zclJf+gmZr/////////////////////////////////5+bm/1VG
+ R/82IyT/NyUm/zclJv83JSb/NyUm/zcmJv84Jif/OCcn/zcmJ/81JSb/NSUm/zUmJv8zJyf/Mycn/zMn
+ J/8xJyf/MScn/zEoKKgvKCcDMSgoAAAAAAAAAAAALycnAC0nJgMwJyerMigo/zInJ/8yJyf/NCgo/zQo
+ KP80Jyf/NSUm/zYmJ/83Jyf/NiUm/zcmJv84Jyf/OScn/zclJf+gmZr/////////////////////////
+ ////////5uXl/1RFRv82IyT/NyUm/zkmJ/85Jyf/NyUm/zcmJv84Jyf/OCcn/zcmJ/82Jif/NiYn/zUo
+ KP8zJyf/NCgo/zInJ/8xJyf/Migo/zEoKKguKCgDMCgoAAAAAAAAAAAALycnAC0mJgMvJyerMykp/zIo
+ KP8yKCj/NCkp/zUoKP80KCj/NCYn/zYmJ/83Jyf/NSUm/zYmJv83Jif/NyYm/zYlJf+gmZr/////////
+ ////////////////////////5eTk/1RERf82JCX/NyUm/zgmJ/84Jyf/NiUm/zcmJv83Jif/NiYm/zYm
+ J/81Jib/NScn/zQoKP80Jyf/NSkp/zIoKP8yKCj/Mykp/zEoKKgwKCgDMSgoAAAAAAAAAAAALycnAC8n
+ JwMvJyerMCcn/zEnJ/8yKCj/Mygp/zQoKP80KCj/Mycn/zQmJ/81JSb/NSUm/zUlJv82JSb/NyUm/zUk
+ Jf+gmZr/////////////////////////////////5OLi/09AQf8yISH/NCIj/zMiI/8zIiP/NCMk/zYl
+ Jv81JSb/NSUm/zUmJv80Jif/Mycn/zMnJ/8zJyf/Micn/zEnJ/8yKCj/MSgo/zEoKKgwKCgDMSgoAAAA
+ AAAAAAAAMCgoADEoKAMwKCirMCgo/zEoKP8xJyf/MScn/zInJ/8zJyf/NCgo/zQnJ/80Jif/NSUm/zYm
+ J/82Jif/NiUm/zUkJf+gmpr/////////////////////////////////8O/v/5uTlP+If3//h35//4V8
+ ff+Ee3z/aV5f/zgoKf82Jif/NSUm/zQmJ/80Jyf/Mycn/zQoKP8yKCj/Migo/zIoKP8wJyf/Lycn/y8n
+ J6gvJycDLycnAAAAAAAAAAAAMCgpADIpKgMwKCirMCgo/zEoKP8xKCj/MScn/zInJ/8yKCj/Mycn/zMn
+ J/8zJyf/NScn/zYnJ/82Jif/NiYn/zQkJf+gmZr/////////////////////////////////////////
+ ///+/v7//v7+//3+/v//////yMXF/z8wMf81Jib/NSgo/zQnJ/8zJyf/Mycn/zMoKP8yKCj/Migo/zIo
+ KP8wJyf/Lycn/y8nJ6gzKioDMSgpAAAAAAAAAAAALygoAC8oKAMvJyerLycn/zAnJ/8vJyf/MCcn/zEn
+ J/8xJyf/Micn/zInJ/8zJyf/NCgo/zcpKf84KSn/NiYn/zQkJf+gmZr/////////////////////////
+ ////////////////////////////////////////2tjY/0k8Pf82KSn/NCgo/zQnJ/8zJyf/Micn/zIo
+ KP8yJyf/MCcn/zAoKP8vJyf/Lycn/y4nJ6guJycDLicnAAAAAAAAAAAAMCgpADEpKgMwKCirMCgo/zAo
+ KP8vJyf/MCcn/zEoKP8yKCj/Mygo/zInJ/8yJyf/NCgo/zYpKv83Kir/NSgo/zMlJf+gmpr/////////
+ ////////////////////////////////////////////////////////6Ofn/1VLS/81KCj/NCgo/zMn
+ J/8xJyf/MScn/zInKP8yKCj/MSgo/zAoKP8vJyf/Lycn/y8oKKguJycDLygoAAAAAAAAAAAALicnAC4n
+ JwMuJyerLicn/y8nJ/8vJyf/MCcn/zAoKP8xKCj/Migo/zInJ/8xJyf/Mygo/zQoKP80KCj/NCgo/zIm
+ Jv+fmpr/////////////////////////////////////////////////////////////////8vLy/2Na
+ Wv8xJSX/Mygo/zEnJ/8yJyf/Micn/zEoKP8vJyf/Lycn/y8nJ/8uJyf/Lygo/y8oKKgtJiYDLycnAAAA
+ AAAAAAAALicnAC0nJwMuJyerLygo/zApKf8vKCj/MCcn/zAoKP8wJyf/MSgo/zEnJ/8xJyf/Micn/zIo
+ KP8yJyf/Mycn/zMnJ/+fmpr/////////////////////////////////////////////////////////
+ ////////+vr6/3Rubv8uJCT/MScn/zIoKP8yKCj/MSgo/zAnJ/8vJyf/MCgo/zApKf8vKCj/Lygo/y8o
+ KKgsJiYDLicnAAAAAAAAAAAALScnAC0nJwMtJyerLygo/zApKf8vKCj/Lycn/zAoKP8wKCj/MCgo/zAn
+ J/8xJyf/Micn/zInJ/8yJyf/MScn/zInJ/+gm5v/////////////////////////////////////////
+ /////////////////////////////4mEhP8vJCT/MScn/zIoKf8yKSn/MSgo/zAnJ/8vJyf/Lygo/zAp
+ Kf8vKCj/Lico/y8oKKgsJycDLigoAAAAAAAAAAAALScnAC0nJwQtJyerLScn/y4nJ/8uJyf/Licn/y4n
+ J/8vJyf/Lycn/zAnJ/8vJyf/MCcn/zEnJ/8xJyf/MScn/zAmJv+UkJD/7e3t/+zr6//r6+v/6+vr/+vr
+ 6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/7e3t/5KOjv8wJib/Lycn/y8nJ/8wKCj/MCgo/y8o
+ KP8uJyf/Licn/y4nJ/8uJyf/LScn/y0nJ6ktJycDLScnAAAAAAAAAAAANC8vAEM/PwEvKSmgLigo/y4n
+ J/8uJyf/Lycn/y4nJ/8uJyf/Lygo/zAoKP8wJyf/Lycn/y8nJ/8vJyf/MCcn/zEnJ/9EPDz/Vk5O/1ZN
+ Tf9VTU3/Vk1N/1VNTf9WTU3/Vk1N/1VNTf9VTU3/Vk5O/1ZOTv9VTU3/VE1N/0Q9Pf8vJyf/Lycn/zAn
+ J/8vJyf/Lycn/y8oKP8uJyf/Lygo/y4nJ/8uJyf/LScn/y4oKJ1PTU0BMy4uAAAAAAAAAAAAWlhZACsk
+ JAAyLCxfLigo+C0nJ/8uJyf/Licn/y4nJ/8vKCj/MCkp/zApKf8wKCj/Lycn/y8nJ/8wJyf/MCgo/zEo
+ KP8wJyf/LiUl/y4lJf8uJSX/LyUl/y8lJf8vJSX/LiUl/y4lJf8vJSX/MCYn/zAmJv8uJib/LSUl/y4m
+ Jv8wJyf/MCgo/zAoKP8vKCj/Lygo/y4nJ/8uJyf/Lico/y0nJ/8tJyf/Ligo9zErLFwrJSUAWVdYAAAA
+ AAAAAAAAAAAAADYxMQA5NDQOMSssiy8pKe0uKCj/LScn/y4nJ/8uJyf/Lygo/y8oKP8vKCj/Licn/y8n
+ J/8wKCj/Lycn/zAoKP8wKCj/Lycn/zAnJ/8wJyf/MCgo/zAoKP8wJyf/MCcn/y8nJ/8wJyf/MCgo/zAo
+ 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
+ AElFTkSuQmCC
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
index e0c12b5a..3502f225 100644
--- a/README.md
+++ b/README.md
@@ -12,10 +12,10 @@
### Prerequisites
[.NET Framework 4.6.1](https://dotnet.microsoft.com/download/dotnet-framework-runtime/net461)
### Download
-[](https://github.com/iAmAsval/FModel/releases/tag/1.4)
+[](https://github.com/iAmAsval/FModel/releases/tag/1.5)
### How does it works
**1.** Once you start the executable, you'll be asked to set your path to your Fortnite .PAK files. Meanwhile a `FModel` subfolder will be created in your `Documents` folder and it'll automatically download the latest version of the modded Fortnite Asset Parser in this subfolder.
-
+
**2.** Restart the executable, select your .PAK file, enter the AES key and click **Load**
- It will parse all Assets contained in the selected .PAK file with their respective path
@@ -40,7 +40,15 @@
**2.** Enable PAKs Diff
**3.** Click `Load Difference`
-
+
+
+### Update Mode
+**1.** Enable Update Mode
+
+**2.** Choose your Assets to extract
+
+**3.** Click `Load Difference`
+
@@ -53,7 +61,8 @@
5. Save Icon
6. Icons Merger
7. Backup current PAK files
-8. Load only difference between current PAK files and backup file
+8. Load difference between current PAK files and backup file
+9. Load and extract Assets automatically between current PAK files and backup file
### What i'm using
- [Fortnite Asset Parser](https://github.com/SirWaddles/JohnWickParse) - Modded Version With Output Control
- [JSON Parser](https://app.quicktype.io/)
@@ -64,16 +73,17 @@ This project is mainly based on what [UModel](https://github.com/gildor2/UModel)
I'd highly suggest you to use [UModel](https://github.com/gildor2/UModel) instead if you wanna use something made professionnaly.
## TODO
+- [ ] Clean code
+- [x] Update mode (auto extraction and icon creation of every useful thing)
+- [ ] Shop loader ?
+- [ ] Stop button while extracting
+- [ ] Support for meshes
+- [ ] Support for animations
- [x] Improve speed
- [x] Multithreading - Need improvements
- [x] Filter for the items ListBox
- [x] Quest viewer or something
- [x] Load all paks
-- [ ] Shop loader ?
-- [ ] Update mode (auto extraction and icon creation of every useful thing)
- [x] Load only difference between 2 paks version
- [x] Custom watermark option on icons
- [x] Choose between extracted filename or displayName for icons file name
-- [ ] Stop button while extracting
-- [ ] Support for meshes
-- [ ] Support for animations