diff --git a/FModel/Forms/AESManager.Designer.cs b/FModel/Forms/AESManager.Designer.cs index 7e7caf11..a2451f53 100644 --- a/FModel/Forms/AESManager.Designer.cs +++ b/FModel/Forms/AESManager.Designer.cs @@ -73,7 +73,7 @@ // this.OKButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.OKButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.OKButton.Location = new System.Drawing.Point(480, 249); + this.OKButton.Location = new System.Drawing.Point(480, 292); this.OKButton.Name = "OKButton"; this.OKButton.Size = new System.Drawing.Size(97, 21); this.OKButton.TabIndex = 16; @@ -83,12 +83,13 @@ // // groupBox1 // - this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + this.groupBox1.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.groupBox1.Controls.Add(this.panel1); this.groupBox1.Location = new System.Drawing.Point(12, 67); this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(565, 176); + this.groupBox1.Size = new System.Drawing.Size(565, 219); this.groupBox1.TabIndex = 17; this.groupBox1.TabStop = false; this.groupBox1.Text = "Dynamic Keys:"; @@ -99,14 +100,14 @@ this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; this.panel1.Location = new System.Drawing.Point(3, 16); this.panel1.Name = "panel1"; - this.panel1.Size = new System.Drawing.Size(559, 157); + this.panel1.Size = new System.Drawing.Size(559, 200); this.panel1.TabIndex = 0; // // AESManager // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(589, 282); + this.ClientSize = new System.Drawing.Size(589, 325); this.Controls.Add(this.groupBox1); this.Controls.Add(this.OKButton); this.Controls.Add(this.groupBox3); diff --git a/FModel/Forms/About.Designer.cs b/FModel/Forms/About.Designer.cs index ccbd4b68..bc37b556 100644 --- a/FModel/Forms/About.Designer.cs +++ b/FModel/Forms/About.Designer.cs @@ -48,7 +48,7 @@ this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; this.pictureBox1.TabIndex = 0; this.pictureBox1.TabStop = false; - // + // // linkLabel1 // this.linkLabel1.AutoSize = true; @@ -77,7 +77,8 @@ this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(360, 40); this.label1.TabIndex = 3; - this.label1.Text = "FModel is a Fortnite .PAK file explorer built in C#\r\nIf you find this project useful, feel free to give it a star on GitHub\r\n⊂(◕‿◕)つ"; + this.label1.Text = "FModel is a Fortnite .PAK file explorer built in C#\r\nIf you find this project use" + + "ful, feel free to give it a star on GitHub\r\n⊂(◕‿◕)つ"; this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // // label2 @@ -109,9 +110,9 @@ this.label4.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label4.Location = new System.Drawing.Point(53, 124); this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(71, 12); + this.label4.Size = new System.Drawing.Size(277, 13); this.label4.TabIndex = 11; - this.label4.Text = "• Asval • Waddlesworth • AyeTSG • FireMonkey"; + this.label4.Text = "• Asval • Waddlesworth • AyeTSG • FireMonkey • Maiky M"; this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // // About diff --git a/FModel/MainWindow.Designer.cs b/FModel/MainWindow.Designer.cs index 70442654..07952a28 100644 --- a/FModel/MainWindow.Designer.cs +++ b/FModel/MainWindow.Designer.cs @@ -70,6 +70,7 @@ this.pictureBox1 = new System.Windows.Forms.PictureBox(); this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker(); this.backgroundWorker2 = new System.ComponentModel.BackgroundWorker(); + this.copySelectedFilePathToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.statusStrip1.SuspendLayout(); this.menuStrip1.SuspendLayout(); this.panel1.SuspendLayout(); @@ -146,26 +147,26 @@ // loadOneToolStripMenuItem // this.loadOneToolStripMenuItem.Name = "loadOneToolStripMenuItem"; - this.loadOneToolStripMenuItem.Size = new System.Drawing.Size(162, 22); + this.loadOneToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.loadOneToolStripMenuItem.Text = "Load One PAK"; this.loadOneToolStripMenuItem.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.loadOneToolStripMenuItem_DropDownItemClicked); // // loadAllToolStripMenuItem // this.loadAllToolStripMenuItem.Name = "loadAllToolStripMenuItem"; - this.loadAllToolStripMenuItem.Size = new System.Drawing.Size(162, 22); + this.loadAllToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.loadAllToolStripMenuItem.Text = "Load All PAKs"; this.loadAllToolStripMenuItem.Click += new System.EventHandler(this.loadAllToolStripMenuItem_Click); // // toolStripSeparator1 // this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(159, 6); + this.toolStripSeparator1.Size = new System.Drawing.Size(177, 6); // // backupPAKsToolStripMenuItem // this.backupPAKsToolStripMenuItem.Name = "backupPAKsToolStripMenuItem"; - this.backupPAKsToolStripMenuItem.Size = new System.Drawing.Size(162, 22); + this.backupPAKsToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.backupPAKsToolStripMenuItem.Text = "Backup PAKs"; this.backupPAKsToolStripMenuItem.Click += new System.EventHandler(this.backupPAKsToolStripMenuItem_Click); // @@ -173,7 +174,7 @@ // this.differenceModeToolStripMenuItem.CheckOnClick = true; this.differenceModeToolStripMenuItem.Name = "differenceModeToolStripMenuItem"; - this.differenceModeToolStripMenuItem.Size = new System.Drawing.Size(162, 22); + this.differenceModeToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.differenceModeToolStripMenuItem.Text = "Difference Mode"; this.differenceModeToolStripMenuItem.CheckedChanged += new System.EventHandler(this.differenceModeToolStripMenuItem_CheckedChanged); // @@ -182,27 +183,29 @@ this.updateModeToolStripMenuItem.CheckOnClick = true; this.updateModeToolStripMenuItem.Enabled = false; this.updateModeToolStripMenuItem.Name = "updateModeToolStripMenuItem"; - this.updateModeToolStripMenuItem.Size = new System.Drawing.Size(162, 22); + this.updateModeToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.updateModeToolStripMenuItem.Text = "Update Mode"; this.updateModeToolStripMenuItem.CheckedChanged += new System.EventHandler(this.updateModeToolStripMenuItem_CheckedChanged); // // toolStripSeparator2 // this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(159, 6); + this.toolStripSeparator2.Size = new System.Drawing.Size(177, 6); // // settingsToolStripMenuItem // this.settingsToolStripMenuItem.Image = global::FModel.Properties.Resources.properties_16xLG; this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem"; - this.settingsToolStripMenuItem.Size = new System.Drawing.Size(162, 22); + this.settingsToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.F4))); + this.settingsToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.settingsToolStripMenuItem.Text = "Settings"; this.settingsToolStripMenuItem.Click += new System.EventHandler(this.settingsToolStripMenuItem_Click); // // filesToolStripMenuItem // this.filesToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.searchToolStripMenuItem}); + this.searchToolStripMenuItem, + this.copySelectedFilePathToolStripMenuItem}); this.filesToolStripMenuItem.Name = "filesToolStripMenuItem"; this.filesToolStripMenuItem.Size = new System.Drawing.Size(42, 20); this.filesToolStripMenuItem.Text = "Files"; @@ -210,7 +213,8 @@ // searchToolStripMenuItem // this.searchToolStripMenuItem.Name = "searchToolStripMenuItem"; - this.searchToolStripMenuItem.Size = new System.Drawing.Size(109, 22); + this.searchToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F1; + this.searchToolStripMenuItem.Size = new System.Drawing.Size(216, 22); this.searchToolStripMenuItem.Text = "Search"; this.searchToolStripMenuItem.Click += new System.EventHandler(this.searchToolStripMenuItem_Click); // @@ -228,7 +232,7 @@ // saveImageToolStripMenuItem // this.saveImageToolStripMenuItem.Name = "saveImageToolStripMenuItem"; - this.saveImageToolStripMenuItem.Size = new System.Drawing.Size(168, 22); + this.saveImageToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.saveImageToolStripMenuItem.Text = "Save Image"; this.saveImageToolStripMenuItem.Click += new System.EventHandler(this.saveImageToolStripMenuItem_Click); // @@ -236,18 +240,18 @@ // this.autoSaveImagesToolStripMenuItem.CheckOnClick = true; this.autoSaveImagesToolStripMenuItem.Name = "autoSaveImagesToolStripMenuItem"; - this.autoSaveImagesToolStripMenuItem.Size = new System.Drawing.Size(168, 22); + this.autoSaveImagesToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.autoSaveImagesToolStripMenuItem.Text = "Auto Save Images"; // // toolStripSeparator3 // this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(165, 6); + this.toolStripSeparator3.Size = new System.Drawing.Size(177, 6); // // mergeImagesToolStripMenuItem // this.mergeImagesToolStripMenuItem.Name = "mergeImagesToolStripMenuItem"; - this.mergeImagesToolStripMenuItem.Size = new System.Drawing.Size(168, 22); + this.mergeImagesToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.mergeImagesToolStripMenuItem.Text = "Merge Images"; this.mergeImagesToolStripMenuItem.Click += new System.EventHandler(this.mergeImagesToolStripMenuItem_Click); // @@ -460,6 +464,14 @@ this.backgroundWorker2.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker2_DoWork); this.backgroundWorker2.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker2_RunWorkerCompleted); // + // copySelectedFilePathToolStripMenuItem + // + this.copySelectedFilePathToolStripMenuItem.Name = "copySelectedFilePathToolStripMenuItem"; + this.copySelectedFilePathToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F2; + this.copySelectedFilePathToolStripMenuItem.Size = new System.Drawing.Size(216, 22); + this.copySelectedFilePathToolStripMenuItem.Text = "Copy Selected File Path"; + this.copySelectedFilePathToolStripMenuItem.Click += new System.EventHandler(this.CopySelectedFilePathToolStripMenuItem_Click); + // // MainWindow // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -533,6 +545,7 @@ private System.Windows.Forms.ToolStripMenuItem filesToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem searchToolStripMenuItem; private System.Windows.Forms.Button button1; + private System.Windows.Forms.ToolStripMenuItem copySelectedFilePathToolStripMenuItem; } } diff --git a/FModel/MainWindow.cs b/FModel/MainWindow.cs index 77772cc8..ce654f99 100644 --- a/FModel/MainWindow.cs +++ b/FModel/MainWindow.cs @@ -1545,5 +1545,25 @@ namespace FModel ImagesMerger.AskMergeImages(); } #endregion + + private void CopySelectedFilePathToolStripMenuItem_Click(object sender, EventArgs e) + { + if (listBox1.SelectedItem != null) + { + string treeviewPath = treeView1.SelectedNode.FullPath; + if (treeviewPath.StartsWith("..\\")) { treeviewPath = treeviewPath.Substring(3); } //if loading all paks + + string path = treeviewPath + "\\" + listBox1.SelectedItem; + if (!path.Contains(".")) //if file uasset/uexp/ubulk + { + Clipboard.SetText(path.Replace("\\", "/") + ".uasset"); + } + else + { + Clipboard.SetText(path.Replace("\\", "/")); + } + AppendText("Copied!", Color.Green, true); + } + } } } diff --git a/FModel/MainWindow.resx b/FModel/MainWindow.resx index 0b178330..dd0273af 100644 --- a/FModel/MainWindow.resx +++ b/FModel/MainWindow.resx @@ -131,7 +131,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABa - CAAAAk1TRnQBSQFMAgEBAgEAASgBAQEoAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + CAAAAk1TRnQBSQFMAgEBAgEAATABAQEwAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA diff --git a/FModel/Methods/AESManager/DynamicKeysManager.cs b/FModel/Methods/AESManager/DynamicKeysManager.cs index db2773f9..4d7968f8 100644 --- a/FModel/Methods/AESManager/DynamicKeysManager.cs +++ b/FModel/Methods/AESManager/DynamicKeysManager.cs @@ -39,6 +39,7 @@ namespace FModel } AESEntries = outputList; } + else { throw new Exception("Fail to locate AESManager.xml"); } } } } diff --git a/FModel/Methods/BackPAKs/DynamicPAKs.cs b/FModel/Methods/BackPAKs/DynamicPAKs.cs index c6f296b0..58674b90 100644 --- a/FModel/Methods/BackPAKs/DynamicPAKs.cs +++ b/FModel/Methods/BackPAKs/DynamicPAKs.cs @@ -36,7 +36,7 @@ namespace FModel } catch (Exception ex) { - Console.WriteLine(ex.Message); + throw new Exception(ex.Message); } return content; } diff --git a/FModel/Methods/IconGenerator/Translations/AssetNameMap.cs b/FModel/Methods/IconGenerator/Translations/AssetNameMap.cs index 566f735c..b1504326 100644 --- a/FModel/Methods/IconGenerator/Translations/AssetNameMap.cs +++ b/FModel/Methods/IconGenerator/Translations/AssetNameMap.cs @@ -62,7 +62,8 @@ namespace FModel { int index = listBeforeData.IndexOf(str); - //Console.WriteLine("DName: " + listBeforeData[index - 3]); + Console.WriteLine("DName: " + listBeforeData[index - 3]); + Console.WriteLine("Description: " + listBeforeData[index - 1]); myNamespacesList.Add(listBeforeData[index - 3]); myNamespacesList.Add(listBeforeData[index - 1]); @@ -83,7 +84,7 @@ namespace FModel reader.ReadBytes(24); int AssetLength = reader.ReadInt32(); - Console.WriteLine(AssetLength); + //Console.WriteLine(AssetLength); reader.ReadBytes(13); int NamespaceCount = reader.ReadInt32(); diff --git a/FModel/Methods/JohnWick/JohnWick.cs b/FModel/Methods/JohnWick/JohnWick.cs index 67e6ac3f..95635c79 100644 --- a/FModel/Methods/JohnWick/JohnWick.cs +++ b/FModel/Methods/JohnWick/JohnWick.cs @@ -99,9 +99,16 @@ namespace FModel } currentPakToCheck = currentPak; - /*if (File.Exists(AssetPath.Substring(0, AssetPath.LastIndexOf(".")) + ".uasset")) //TEST + /*if (AssetPath.Contains("Athena\\Items\\") && File.Exists(AssetPath.Substring(0, AssetPath.LastIndexOf(".")) + ".uexp")) //TEST { - AssetNameMap.getNameMap(AssetPath.Substring(0, AssetPath.LastIndexOf(".")) + ".uasset"); + try + { + AssetNameMap.searchStringsInUexp(AssetPath.Substring(0, AssetPath.LastIndexOf(".")) + ".uexp"); + } + catch (Exception ex) + { + throw new Exception(ex.Message); + } }*/ return AssetPath; diff --git a/FModel/Methods/Serializer/LocRes/LocResSerializer.cs b/FModel/Methods/Serializer/LocRes/LocResSerializer.cs index 12781937..fb45e03a 100644 --- a/FModel/Methods/Serializer/LocRes/LocResSerializer.cs +++ b/FModel/Methods/Serializer/LocRes/LocResSerializer.cs @@ -1,6 +1,8 @@ using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Text; namespace FModel @@ -12,6 +14,7 @@ namespace FModel * */ static class LocResSerializer { + private static byte[] LocResMagic = { 0x0E, 0x14, 0x74, 0x75, 0x67, 0x4A, 0x03, 0xFC, 0x4A, 0x15, 0x90, 0x9D, 0xC3, 0x37, 0x7F, 0x1B }; private static long LocalizedStringArrayOffset { get; set; } private static string[] LocalizedStringArray { get; set; } private static string NamespacesString { get; set; } @@ -28,36 +31,42 @@ namespace FModel using (BinaryReader reader = new BinaryReader(File.Open(filepath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), Encoding.GetEncoding(1252))) { byte[] MagicNumber = reader.ReadBytes(16); - - byte VersionNumber = reader.ReadByte(); - - LocalizedStringArrayOffset = reader.ReadInt64(); - if (LocalizedStringArrayOffset != -1) + if (MagicNumber.SequenceEqual(LocResMagic)) { - long CurrentFileOffset = reader.BaseStream.Position; - - reader.BaseStream.Seek(LocalizedStringArrayOffset, SeekOrigin.Begin); - int arrayLength = reader.ReadInt32(); - - reader.BaseStream.Seek(LocalizedStringArrayOffset, SeekOrigin.Begin); - - LocalizedStringArray = new string[arrayLength]; - for (int i = 0; i < LocalizedStringArray.Length; i++) + byte VersionNumber = reader.ReadByte(); + if (VersionNumber == 2) //optimized { - LocalizedStringArray[i] = AssetReader.readCleanString(reader); - } - - reader.BaseStream.Seek(CurrentFileOffset, SeekOrigin.Begin); - - uint NamespaceCount = reader.ReadUInt32(); - reader.ReadBytes(17); - - for (uint i = 0; i < NamespaceCount; i++) - { - reader.ReadInt32(); - readNamespaces(reader); + LocalizedStringArrayOffset = reader.ReadInt64(); + if (LocalizedStringArrayOffset != -1) + { + long CurrentFileOffset = reader.BaseStream.Position; + + reader.BaseStream.Seek(LocalizedStringArrayOffset, SeekOrigin.Begin); + int arrayLength = reader.ReadInt32(); + + reader.BaseStream.Seek(LocalizedStringArrayOffset, SeekOrigin.Begin); + + LocalizedStringArray = new string[arrayLength]; + for (int i = 0; i < LocalizedStringArray.Length; i++) + { + LocalizedStringArray[i] = AssetReader.readCleanString(reader); + } + + reader.BaseStream.Seek(CurrentFileOffset, SeekOrigin.Begin); + + uint NamespaceCount = reader.ReadUInt32(); + reader.ReadBytes(17); + + for (uint i = 0; i < NamespaceCount; i++) + { + reader.ReadInt32(); + readNamespaces(reader); + } + } } + else { throw new Exception("Unsupported LocRes version."); } } + else { throw new Exception("Wrong LocResMagic number."); } } return JsonConvert.SerializeObject(LocResDict, Formatting.Indented); diff --git a/README.md b/README.md index d19e0ea8..0fcd053d 100644 --- a/README.md +++ b/README.md @@ -74,10 +74,10 @@ Also if you find this project useful, feel free to give it a :star: thank you :k - [Find & Replace for ScintillaNET](https://www.nuget.org/packages/snt.ScintillaNet.FindReplaceDialog/) - [Newtonsoft.Json](https://github.com/JamesNK/Newtonsoft.Json) ### Contributors -| **Waddlesworth** | **AyeTSG** | **FireMonkey** | -| :---: | :---: | :---: | -| [![Waddlesworth](https://avatars1.githubusercontent.com/u/769399?s=200&v=4)](https://github.com/SirWaddles) | [![AyeTSG](https://avatars1.githubusercontent.com/u/49595354?s=200&v=4)](https://github.com/AyeTSG) | [![FireMonkey](https://avatars2.githubusercontent.com/u/38590471?s=200&v=4)](https://github.com/ItsFireMonkey) | -| `https://github.com/SirWaddles` | `https://twitter.com/AyeTSG` | `https://twitter.com/FireMonkeyFN` | +| **Waddlesworth** | **AyeTSG** | **FireMonkey** | **Maiky M** | +| :---: | :---: | :---: | :---: | +| [![Waddlesworth](https://avatars1.githubusercontent.com/u/769399?s=200&v=4)](https://github.com/SirWaddles) | [![AyeTSG](https://avatars1.githubusercontent.com/u/49595354?s=200&v=4)](https://github.com/AyeTSG) | [![FireMonkey](https://avatars2.githubusercontent.com/u/38590471?s=200&v=4)](https://github.com/ItsFireMonkey) | [![Maiky M](https://avatars3.githubusercontent.com/u/51415805?s=200&v=4)](https://github.com/MaikyM) | +| `https://github.com/SirWaddles` | `https://twitter.com/AyeTSG` | `https://twitter.com/FireMonkeyFN` |`https://twitter.com/Mikey_Bad05` | ### Why FModel This project is mainly based on what [UModel](https://github.com/gildor2/UModel) can do, in a personalized way, in case UModel doesn't work, as a temporary rescue solution. I'd highly suggest you to use [UModel](https://github.com/gildor2/UModel) instead if you wanna use something made professionnaly.