FModel 2.2

This commit is contained in:
AsvalGTA 2019-05-04 01:25:54 +02:00
parent 3d0e15d8a4
commit 8792e478cc
16 changed files with 457 additions and 67 deletions

View File

@ -1,20 +1,32 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.28307.136
# Visual Studio Version 16
VisualStudioVersion = 16.0.28803.202
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FModel", "FModel\FModel.csproj", "{8FABCD3A-9D55-4B54-B237-B259D815DEB8}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{8FABCD3A-9D55-4B54-B237-B259D815DEB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8FABCD3A-9D55-4B54-B237-B259D815DEB8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8FABCD3A-9D55-4B54-B237-B259D815DEB8}.Debug|x64.ActiveCfg = Debug|x64
{8FABCD3A-9D55-4B54-B237-B259D815DEB8}.Debug|x64.Build.0 = Debug|x64
{8FABCD3A-9D55-4B54-B237-B259D815DEB8}.Debug|x86.ActiveCfg = Debug|x86
{8FABCD3A-9D55-4B54-B237-B259D815DEB8}.Debug|x86.Build.0 = Debug|x86
{8FABCD3A-9D55-4B54-B237-B259D815DEB8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8FABCD3A-9D55-4B54-B237-B259D815DEB8}.Release|Any CPU.Build.0 = Release|Any CPU
{8FABCD3A-9D55-4B54-B237-B259D815DEB8}.Release|x64.ActiveCfg = Release|x64
{8FABCD3A-9D55-4B54-B237-B259D815DEB8}.Release|x64.Build.0 = Release|x64
{8FABCD3A-9D55-4B54-B237-B259D815DEB8}.Release|x86.ActiveCfg = Release|x86
{8FABCD3A-9D55-4B54-B237-B259D815DEB8}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@ -109,6 +109,9 @@
<setting name="UMFilename" serializeAs="String">
<value />
</setting>
<setting name="UpdateSettings" serializeAs="String">
<value>True</value>
</setting>
</FModel.Properties.Settings>
</userSettings>
</configuration>

View File

@ -0,0 +1,41 @@
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FModel
{
public static class JsonExtensions
{
public static List<JToken> FindTokens(this JToken containerToken, string name)
{
List<JToken> matches = new List<JToken>();
FindTokens(containerToken, name, matches);
return matches;
}
private static void FindTokens(JToken containerToken, string name, List<JToken> matches)
{
if (containerToken.Type == JTokenType.Object)
{
foreach (JProperty child in containerToken.Children<JProperty>())
{
if (string.Equals(child.Name, name, StringComparison.CurrentCultureIgnoreCase))
{
matches.Add(child.Value);
}
FindTokens(child.Value, name, matches);
}
}
else if (containerToken.Type == JTokenType.Array)
{
foreach (JToken child in containerToken.Children())
{
FindTokens(child, name, matches);
}
}
}
}
}

View File

@ -38,7 +38,53 @@
<PropertyGroup>
<StartupObject>FModel.Program</StartupObject>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x64\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<OutputPath>bin\x64\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\x86\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="AutoUpdater.NET, Version=1.5.1.0, Culture=neutral, PublicKeyToken=501435c91b35f4bc, processorArchitecture=MSIL">
<HintPath>..\packages\Autoupdater.NET.Official.1.5.1\lib\net40\AutoUpdater.NET.dll</HintPath>
</Reference>
<Reference Include="csharp-wick">
<HintPath>..\..\..\csharp-wick\platform\csharp-wick\bin\Release\netstandard1.4\csharp-wick.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
@ -63,6 +109,7 @@
</ItemGroup>
<ItemGroup>
<Compile Include="Converter\UnrealEngineDataToOGG.cs" />
<Compile Include="Custom\JsonExtensions.cs" />
<Compile Include="Custom\TypeAssistant.cs" />
<Compile Include="Forms\About.cs">
<SubType>Form</SubType>
@ -94,6 +141,7 @@
<Compile Include="MainWindow.Designer.cs">
<DependentUpon>MainWindow.cs</DependentUpon>
</Compile>
<Compile Include="Parser\Banners\BannersParser.cs" />
<Compile Include="Parser\Challenges\ChallengeBundleIdParser.cs" />
<Compile Include="Parser\Challenges\QuestParser.cs" />
<Compile Include="Parser\FeaturedParser.cs" />
@ -142,6 +190,9 @@
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<Content Include="csharp_wick.dll">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="DLLs\ScintillaNET FindReplaceDialog.dll" />
<Content Include="FModel.ico" />
<None Include="Resources\Challenges_Slider.png" />

View File

@ -15,6 +15,8 @@ namespace FModel.Forms
public About()
{
InitializeComponent();
label2.Text += " " + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString().Substring(0, 5);
}
private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)

View File

@ -97,15 +97,15 @@
this.toolStripStatusLabel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(200)))), ((int)(((byte)(200)))), ((int)(((byte)(200)))));
this.toolStripStatusLabel1.Margin = new System.Windows.Forms.Padding(1, 3, 50, 2);
this.toolStripStatusLabel1.Name = "toolStripStatusLabel1";
this.toolStripStatusLabel1.Size = new System.Drawing.Size(74, 17);
this.toolStripStatusLabel1.Text = "FModel 2.1.1";
this.toolStripStatusLabel1.Size = new System.Drawing.Size(65, 17);
this.toolStripStatusLabel1.Text = "FModel 2.2";
//
// toolStripStatusLabel2
//
this.toolStripStatusLabel2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(200)))), ((int)(((byte)(200)))), ((int)(((byte)(200)))));
this.toolStripStatusLabel2.Margin = new System.Windows.Forms.Padding(0, 3, 50, 2);
this.toolStripStatusLabel2.Name = "toolStripStatusLabel2";
this.toolStripStatusLabel2.Size = new System.Drawing.Size(936, 17);
this.toolStripStatusLabel2.Size = new System.Drawing.Size(945, 17);
this.toolStripStatusLabel2.Spring = true;
//
// toolStripStatusLabel3

View File

@ -19,6 +19,9 @@ using ScintillaNET_FindReplaceDialog;
using System.Security.Principal;
using System.Security.AccessControl;
using System.Drawing.Drawing2D;
using AutoUpdaterDotNET;
using csharp_wick;
using System.Reflection;
namespace FModel
{
@ -27,6 +30,7 @@ namespace FModel
#region EVERYTHING WE NEED
FindReplace MyFindReplace;
Stopwatch stopWatch;
PakAsset myAsset;
private static string[] PAKsArray;
public static string[] PAKasTXT;
public static Dictionary<string, string> AllPAKsDictionary;
@ -355,9 +359,19 @@ namespace FModel
//EVENTS
private async void MainWindow_Load(object sender, EventArgs e)
{
AutoUpdater.Start("https://dl.dropbox.com/s/3kv2pukqu6tj1r0/FModel.xml?dl=0");
SetTreeViewTheme(treeView1.Handle);
BackupFileName = "\\FortniteGame_" + DateTime.Now.ToString("MMddyyyy") + ".txt";
// Copy user settings from previous application version if necessary
if (Properties.Settings.Default.UpdateSettings)
{
Properties.Settings.Default.Upgrade();
Properties.Settings.Default.UpdateSettings = false;
Properties.Settings.Default.Save();
}
await Task.Run(() => {
setScintillaStyle();
setFont();
@ -1294,7 +1308,7 @@ namespace FModel
updateConsole(currentUsedItem + " successfully extracted", Color.FromArgb(255, 66, 244, 66), "Success");
if (extractedFilePath.Contains(".uasset") || extractedFilePath.Contains(".uexp") || extractedFilePath.Contains(".ubulk"))
{
jwpmProcess("serialize \"" + extractedFilePath.Substring(0, extractedFilePath.LastIndexOf('.')) + "\"");
myAsset = new PakAsset(extractedFilePath.Substring(0, extractedFilePath.LastIndexOf('.')));
jsonParseFile();
}
if (extractedFilePath.Contains(".ufont"))
@ -1315,18 +1329,16 @@ namespace FModel
{
try
{
string jsonExtractedFilePath = Directory.GetFiles(DefaultOutputPath, currentUsedItem + ".json", SearchOption.AllDirectories).FirstOrDefault();
if (jsonExtractedFilePath != null)
if (myAsset.GetSerialized() != null)
{
updateConsole(currentUsedItem + " successfully serialized", Color.FromArgb(255, 66, 244, 66), "Success");
string parsedJson = JToken.Parse(File.ReadAllText(jsonExtractedFilePath)).ToString();
File.Delete(jsonExtractedFilePath);
string parsedJson = JToken.Parse(myAsset.GetSerialized()).ToString();
Invoke(new Action(() =>
{
scintilla1.Text = parsedJson;
}));
navigateThroughJSON(parsedJson, jsonExtractedFilePath);
navigateThroughJSON(parsedJson, extractedFilePath);
}
else
updateConsole("No serialized file found", Color.FromArgb(255, 244, 66, 66), "Error");
@ -1681,16 +1693,14 @@ namespace FModel
updateConsole(theItem.HeroDefinition + " successfully extracted", Color.FromArgb(255, 66, 244, 66), "Success");
if (HeroFilePath.Contains(".uasset") || HeroFilePath.Contains(".uexp") || HeroFilePath.Contains(".ubulk"))
{
jwpmProcess("serialize \"" + HeroFilePath.Substring(0, HeroFilePath.LastIndexOf('.')) + "\"");
myAsset = new PakAsset(HeroFilePath.Substring(0, HeroFilePath.LastIndexOf('.')));
try
{
string jsonExtractedFilePath = Directory.GetFiles(DefaultOutputPath, theItem.HeroDefinition + ".json", SearchOption.AllDirectories).FirstOrDefault();
if (jsonExtractedFilePath != null)
if (myAsset.GetSerialized() != null)
{
updateConsole(theItem.HeroDefinition + " successfully serialized", Color.FromArgb(255, 66, 244, 66), "Success");
string parsedJson = JToken.Parse(File.ReadAllText(jsonExtractedFilePath)).ToString();
File.Delete(jsonExtractedFilePath);
string parsedJson = JToken.Parse(myAsset.GetSerialized()).ToString();
var ItemID = Parser.Items.ItemsIDParser.FromJson(parsedJson);
updateConsole("Parsing " + theItem.HeroDefinition + "...", Color.FromArgb(255, 244, 132, 66), "Waiting");
for (int i = 0; i < ItemID.Length; i++)
@ -1707,7 +1717,8 @@ namespace FModel
if (textureFilePath != null)
{
jwpmProcess("texture \"" + textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile + "\"");
myAsset = new PakAsset(textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile);
myAsset.SaveTexture(textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile + ".png");
itemIconPath = textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile + ".png";
updateConsole(textureFile + " successfully converted to .PNG", Color.FromArgb(255, 66, 244, 66), "Success");
}
@ -1747,16 +1758,14 @@ namespace FModel
updateConsole(theItem.WeaponDefinition + " successfully extracted", Color.FromArgb(255, 66, 244, 66), "Success");
if (WeaponFilePath.Contains(".uasset") || WeaponFilePath.Contains(".uexp") || WeaponFilePath.Contains(".ubulk"))
{
jwpmProcess("serialize \"" + WeaponFilePath.Substring(0, WeaponFilePath.LastIndexOf('.')) + "\"");
myAsset = new PakAsset(WeaponFilePath.Substring(0, WeaponFilePath.LastIndexOf('.')));
try
{
string jsonExtractedFilePath = Directory.GetFiles(DefaultOutputPath, theItem.WeaponDefinition + ".json", SearchOption.AllDirectories).FirstOrDefault();
if (jsonExtractedFilePath != null)
if (myAsset.GetSerialized() != null)
{
updateConsole(theItem.WeaponDefinition + " successfully serialized", Color.FromArgb(255, 66, 244, 66), "Success");
string parsedJson = JToken.Parse(File.ReadAllText(jsonExtractedFilePath)).ToString();
File.Delete(jsonExtractedFilePath);
string parsedJson = JToken.Parse(myAsset.GetSerialized()).ToString();
var ItemID = Parser.Items.ItemsIDParser.FromJson(parsedJson);
updateConsole("Parsing " + theItem.WeaponDefinition + "...", Color.FromArgb(255, 244, 132, 66), "Waiting");
for (int i = 0; i < ItemID.Length; i++)
@ -1773,7 +1782,8 @@ namespace FModel
if (textureFilePath != null)
{
jwpmProcess("texture \"" + textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile + "\"");
myAsset = new PakAsset(textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile);
myAsset.SaveTexture(textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile + ".png");
itemIconPath = textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile + ".png";
updateConsole(textureFile + " successfully converted to .PNG", Color.FromArgb(255, 66, 244, 66), "Success");
}
@ -1811,7 +1821,8 @@ namespace FModel
if (textureFilePath != null)
{
jwpmProcess("texture \"" + textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile + "\"");
myAsset = new PakAsset(textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile);
myAsset.SaveTexture(textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile + ".png");
itemIconPath = textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile + ".png";
updateConsole(textureFile + " successfully converted to .PNG", Color.FromArgb(255, 66, 244, 66), "Success");
}
@ -1830,7 +1841,8 @@ namespace FModel
if (textureFilePath != null)
{
jwpmProcess("texture \"" + textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile + "\"");
myAsset = new PakAsset(textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile);
myAsset.SaveTexture(textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile + ".png");
itemIconPath = textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile + ".png";
updateConsole(textureFile + " successfully converted to .PNG", Color.FromArgb(255, 66, 244, 66), "Success");
}
@ -1860,15 +1872,13 @@ namespace FModel
updateConsole(catName.Substring(catName.LastIndexOf('.') + 1) + " successfully extracted", Color.FromArgb(255, 66, 244, 66), "Success");
if (CatalogFilePath.Contains(".uasset") || CatalogFilePath.Contains(".uexp") || CatalogFilePath.Contains(".ubulk"))
{
jwpmProcess("serialize \"" + CatalogFilePath.Substring(0, CatalogFilePath.LastIndexOf('.')) + "\"");
myAsset = new PakAsset(CatalogFilePath.Substring(0, CatalogFilePath.LastIndexOf('.')));
try
{
string jsonExtractedFilePath = Directory.GetFiles(DefaultOutputPath, catName.Substring(catName.LastIndexOf('.') + 1) + ".json", SearchOption.AllDirectories).FirstOrDefault();
if (jsonExtractedFilePath != null)
if (myAsset.GetSerialized() != null)
{
updateConsole(catName.Substring(catName.LastIndexOf('.') + 1) + " successfully serialized", Color.FromArgb(255, 66, 244, 66), "Success");
string parsedJson = JToken.Parse(File.ReadAllText(jsonExtractedFilePath)).ToString();
File.Delete(jsonExtractedFilePath);
string parsedJson = JToken.Parse(myAsset.GetSerialized()).ToString();
var FeaturedID = Parser.Featured.FeaturedParser.FromJson(parsedJson);
updateConsole("Parsing " + catName.Substring(catName.LastIndexOf('.') + 1) + "...", Color.FromArgb(255, 244, 132, 66), "Waiting");
for (int i = 0; i < FeaturedID.Length; i++)
@ -1913,7 +1923,8 @@ namespace FModel
if (textureFilePath2 != null)
{
jwpmProcess("texture \"" + textureFilePath2.Substring(0, textureFilePath2.LastIndexOf('\\')) + "\\" + textureFile2 + "\"");
myAsset = new PakAsset(textureFilePath2.Substring(0, textureFilePath2.LastIndexOf('\\')) + "\\" + textureFile2);
myAsset.SaveTexture(textureFilePath2.Substring(0, textureFilePath2.LastIndexOf('\\')) + "\\" + textureFile2 + ".png");
itemIconPath = textureFilePath2.Substring(0, textureFilePath2.LastIndexOf('\\')) + "\\" + textureFile2 + ".png";
updateConsole(textureFile2 + " successfully converted to .PNG", Color.FromArgb(255, 66, 244, 66), "Success");
}
@ -1931,7 +1942,8 @@ namespace FModel
}
else if (textureFilePath != null && !textureFilePath.Contains("MI_UI_FeaturedRenderSwitch_"))
{
jwpmProcess("texture \"" + textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile + "\"");
myAsset = new PakAsset(textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile);
myAsset.SaveTexture(textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile + ".png");
itemIconPath = textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile + ".png";
updateConsole(textureFile + " successfully converted to .PNG", Color.FromArgb(255, 66, 244, 66), "Success");
}
@ -1972,15 +1984,13 @@ namespace FModel
updateConsole(catName + " successfully extracted", Color.FromArgb(255, 66, 244, 66), "Success");
if (CatalogFilePath.Contains(".uasset") || CatalogFilePath.Contains(".uexp") || CatalogFilePath.Contains(".ubulk"))
{
jwpmProcess("serialize \"" + CatalogFilePath.Substring(0, CatalogFilePath.LastIndexOf('.')) + "\"");
myAsset = new PakAsset(CatalogFilePath.Substring(0, CatalogFilePath.LastIndexOf('.')));
try
{
string jsonExtractedFilePath = Directory.GetFiles(DefaultOutputPath, catName + ".json", SearchOption.AllDirectories).FirstOrDefault();
if (jsonExtractedFilePath != null)
if (myAsset.GetSerialized() != null)
{
updateConsole(catName + " successfully serialized", Color.FromArgb(255, 66, 244, 66), "Success");
string parsedJson = JToken.Parse(File.ReadAllText(jsonExtractedFilePath)).ToString();
File.Delete(jsonExtractedFilePath);
string parsedJson = JToken.Parse(myAsset.GetSerialized()).ToString();
var FeaturedID = Parser.Featured.FeaturedParser.FromJson(parsedJson);
updateConsole("Parsing " + catName + "...", Color.FromArgb(255, 244, 132, 66), "Waiting");
for (int i = 0; i < FeaturedID.Length; i++)
@ -2000,7 +2010,8 @@ namespace FModel
if (textureFilePath != null)
{
jwpmProcess("texture \"" + textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile + "\"");
myAsset = new PakAsset(textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile);
myAsset.SaveTexture(textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile + ".png");
itemIconPath = textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile + ".png";
updateConsole(textureFile + " successfully converted to .PNG", Color.FromArgb(255, 66, 244, 66), "Success");
}
@ -2050,7 +2061,8 @@ namespace FModel
if (textureFilePath2 != null)
{
jwpmProcess("texture \"" + textureFilePath2.Substring(0, textureFilePath2.LastIndexOf('\\')) + "\\" + textureFile2 + "\"");
myAsset = new PakAsset(textureFilePath2.Substring(0, textureFilePath2.LastIndexOf('\\')) + "\\" + textureFile2);
myAsset.SaveTexture(textureFilePath2.Substring(0, textureFilePath2.LastIndexOf('\\')) + "\\" + textureFile2 + ".png");
itemIconPath = textureFilePath2.Substring(0, textureFilePath2.LastIndexOf('\\')) + "\\" + textureFile2 + ".png";
updateConsole(textureFile2 + " successfully converted to .PNG", Color.FromArgb(255, 66, 244, 66), "Success");
}
@ -2068,7 +2080,8 @@ namespace FModel
}
else if (textureFilePath != null && !textureFilePath.Contains("MI_UI_FeaturedRenderSwitch_"))
{
jwpmProcess("texture \"" + textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile + "\"");
myAsset = new PakAsset(textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile);
myAsset.SaveTexture(textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile + ".png");
itemIconPath = textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile + ".png";
updateConsole(textureFile + " successfully converted to .PNG", Color.FromArgb(255, 66, 244, 66), "Success");
}
@ -2174,7 +2187,8 @@ namespace FModel
if (textureFilePath != null)
{
jwpmProcess("texture \"" + textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile + "\"");
myAsset = new PakAsset(textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile);
myAsset.SaveTexture(textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile + ".png");
pngPATH = textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile + ".png";
updateConsole(textureFile + " successfully converted to .PNG", Color.FromArgb(255, 66, 244, 66), "Success");
@ -2205,6 +2219,8 @@ namespace FModel
//MANUAL FIX
if (SelectedChallengesArray[i2] == "Quest_BR_LevelUp_SeasonLevel")
SelectedChallengesArray[i2] = "Quest_BR_LevelUp_SeasonLevel_25";
if (SelectedChallengesArray[i2] == "Quest_BR_OT_Play_Featured_Creative")
SelectedChallengesArray[i2] = "Quest_BR_OT_play_featured_creative";
if (currentUsedPAKGUID != null && currentUsedPAKGUID != "0-0-0-0")
jwpmProcess("extract \"" + Properties.Settings.Default.PAKsPath + "\\" + currentUsedPAK + "\" \"" + SelectedChallengesArray[i2] + "\" \"" + DefaultOutputPath + "\" " + Properties.Settings.Default.AESKey);
@ -2217,16 +2233,14 @@ namespace FModel
updateConsole(SelectedChallengesArray[i2] + " successfully extracted", Color.FromArgb(255, 66, 244, 66), "Success");
if (ChallengeFilePath.Contains(".uasset") || ChallengeFilePath.Contains(".uexp") || ChallengeFilePath.Contains(".ubulk"))
{
jwpmProcess("serialize \"" + ChallengeFilePath.Substring(0, ChallengeFilePath.LastIndexOf('.')) + "\"");
myAsset = new PakAsset(ChallengeFilePath.Substring(0, ChallengeFilePath.LastIndexOf('.')));
try
{
string jsonExtractedFilePath = Directory.GetFiles(DefaultOutputPath, SelectedChallengesArray[i2] + ".json", SearchOption.AllDirectories).FirstOrDefault();
if (jsonExtractedFilePath != null)
if (myAsset.GetSerialized() != null)
{
updateConsole(SelectedChallengesArray[i2] + " successfully serialized", Color.FromArgb(255, 66, 244, 66), "Success");
string parsedJson = JToken.Parse(File.ReadAllText(jsonExtractedFilePath)).ToString();
File.Delete(jsonExtractedFilePath);
string parsedJson = JToken.Parse(myAsset.GetSerialized()).ToString();
var questParser = Parser.Quest.QuestParser.FromJson(parsedJson);
updateConsole("Parsing " + SelectedChallengesArray[i2] + "...", Color.FromArgb(255, 244, 132, 66), "Waiting");
for (int ii = 0; ii < questParser.Length; ii++)
@ -2247,7 +2261,6 @@ namespace FModel
Color.FromArgb(10, 255, 255, 255),
Color.FromArgb(75, 255, 255, 255));
g.TextRenderingHint = TextRenderingHint.AntiAlias;
justSkip += 1;
iamY += 140;
g.DrawString(questParser[ii].Objectives[ii2].Description, new Font(pfc.Families[1], 50), new SolidBrush(Color.White), new Point(100, iamY));
@ -2351,6 +2364,8 @@ namespace FModel
var partsofbruhreally = questParser[ii].HiddenRewards.FirstOrDefault().TemplateId.Split(':');
if (partsofbruhreally[0] != "HomebaseBannerIcon")
drawRewardIcon(partsofbruhreally[1], g, iamY);
else
drawRewardBanner(partsofbruhreally[1], g, iamY);
}
AppendText("\t\t" + questParser[ii].HiddenRewards.FirstOrDefault().TemplateId + ":"
@ -2403,6 +2418,96 @@ namespace FModel
AppendText(SelectedChallengesArray[i2], Color.SteelBlue, true);
}
}
iamY += 100;
//BundleCompletionRewards
try
{
for (int i2 = 0; i2 < BundleParser[i].BundleCompletionRewards.Length; i2++)
{
string itemReward = BundleParser[i].BundleCompletionRewards[i2].Rewards.FirstOrDefault().ItemDefinition.AssetPathName.Substring(BundleParser[i].BundleCompletionRewards[i2].Rewards.FirstOrDefault().ItemDefinition.AssetPathName.LastIndexOf(".") + 1);
string compCount = BundleParser[i].BundleCompletionRewards[i2].CompletionCount.ToString();
if (itemReward != "AthenaBattlePass_WeeklyChallenge_Token" && itemReward != "AthenaBattlePass_WeeklyBundle_Token")
{
justSkip += 1;
iamY += 140;
if (BundleParser[i].BundleCompletionRewards[i2].Rewards.FirstOrDefault().ItemDefinition.AssetPathName == "None")
{
var partsofbruhreally = BundleParser[i].BundleCompletionRewards[i2].Rewards.FirstOrDefault().TemplateId.Split(':');
drawRewardBanner(partsofbruhreally[1], g, iamY);
}
else if (string.Equals(itemReward, "athenabattlestar", StringComparison.CurrentCultureIgnoreCase))
{
#region DRAW ICON
Image RewardIcon = Properties.Resources.T_FNBR_BattlePoints_L;
g.DrawImage(Forms.Settings.ResizeImage(RewardIcon, 75, 75), new Point(2325, iamY + 22));
GraphicsPath p = new GraphicsPath();
p.AddString(
BundleParser[i].BundleCompletionRewards[i2].Rewards.FirstOrDefault().Quantity.ToString(),
pfc.Families[1],
(int)FontStyle.Regular,
60,
new Point(2322, iamY + 25), rightString);
g.DrawPath(new Pen(Color.FromArgb(255, 143, 74, 32), 5), p);
g.FillPath(new SolidBrush(Color.FromArgb(255, 255, 219, 103)), p);
#endregion
}
else if (string.Equals(itemReward, "AthenaSeasonalXP", StringComparison.CurrentCultureIgnoreCase))
{
#region DRAW ICON
Image RewardIcon = Properties.Resources.T_FNBR_SeasonalXP_L;
g.DrawImage(Forms.Settings.ResizeImage(RewardIcon, 75, 75), new Point(2325, iamY + 22));
GraphicsPath p = new GraphicsPath();
p.AddString(
BundleParser[i].BundleCompletionRewards[i2].Rewards.FirstOrDefault().Quantity.ToString(),
pfc.Families[1],
(int)FontStyle.Regular,
60,
new Point(2322, iamY + 25), rightString);
g.DrawPath(new Pen(Color.FromArgb(255, 81, 131, 15), 5), p);
g.FillPath(new SolidBrush(Color.FromArgb(255, 230, 253, 177)), p);
#endregion
}
else if (string.Equals(itemReward, "MtxGiveaway", StringComparison.CurrentCultureIgnoreCase))
{
#region DRAW ICON
Image RewardIcon = Properties.Resources.T_Items_MTX_L;
g.DrawImage(Forms.Settings.ResizeImage(RewardIcon, 75, 75), new Point(2325, iamY + 22));
GraphicsPath p = new GraphicsPath();
p.AddString(
BundleParser[i].BundleCompletionRewards[i2].Rewards.FirstOrDefault().Quantity.ToString(),
pfc.Families[1],
(int)FontStyle.Regular,
60,
new Point(2322, iamY + 25), rightString);
g.DrawPath(new Pen(Color.FromArgb(255, 100, 160, 175), 5), p);
g.FillPath(new SolidBrush(Color.FromArgb(255, 220, 230, 255)), p);
#endregion
}
else
drawRewardIcon(itemReward, g, iamY);
if (compCount == "-1")
g.DrawString("Complete ALL CHALLENGES to earn the reward item", new Font(pfc.Families[1], 50), new SolidBrush(Color.White), new Point(100, iamY + 22));
else
g.DrawString("Complete ANY " + compCount + " CHALLENGES to earn the reward item", new Font(pfc.Families[1], 50), new SolidBrush(Color.White), new Point(100, iamY + 22));
}
}
}
catch (Exception ex)
{
updateConsole(ex.Message, Color.FromArgb(255, 244, 66, 66), "Error");
iamY -= 100;
}
}
if (Properties.Settings.Default.createIconForChallenges == true)
@ -2482,16 +2587,14 @@ namespace FModel
updateConsole(qAssetName + " successfully extracted", Color.FromArgb(255, 66, 244, 66), "Success");
if (ChallengeFilePathLoop.Contains(".uasset") || ChallengeFilePathLoop.Contains(".uexp") || ChallengeFilePathLoop.Contains(".ubulk"))
{
jwpmProcess("serialize \"" + ChallengeFilePathLoop.Substring(0, ChallengeFilePathLoop.LastIndexOf('.')) + "\"");
myAsset = new PakAsset(ChallengeFilePathLoop.Substring(0, ChallengeFilePathLoop.LastIndexOf('.')));
try
{
string jsonExtractedFilePath = Directory.GetFiles(DefaultOutputPath, qAssetName + ".json", SearchOption.AllDirectories).FirstOrDefault();
if (jsonExtractedFilePath != null)
if (myAsset.GetSerialized() != null)
{
updateConsole(qAssetName + " successfully serialized", Color.FromArgb(255, 66, 244, 66), "Success");
string parsedJson = JToken.Parse(File.ReadAllText(jsonExtractedFilePath)).ToString();
File.Delete(jsonExtractedFilePath);
string parsedJson = JToken.Parse(myAsset.GetSerialized()).ToString();
var questParser = Parser.Quest.QuestParser.FromJson(parsedJson);
updateConsole("Parsing " + qAssetName + "...", Color.FromArgb(255, 244, 132, 66), "Waiting");
for (int i = 0; i < questParser.Length; i++)
@ -2500,7 +2603,7 @@ namespace FModel
string oldCount = string.Empty;
for (int ii = 0; ii < questParser[i].Objectives.Length; ii++)
{
if (currentUsedItem == "QuestBundle_S8_ExtraCredit")
if (currentUsedItem == "QuestBundle_S8_ExtraCredit" || currentUsedItem == "QuestBundle_S7_Overtime")
{
string newQuest = questParser[i].Objectives[ii].Description;
string newCount = questParser[i].Objectives[ii].Count.ToString();
@ -2661,7 +2764,6 @@ namespace FModel
Color.FromArgb(10, 255, 255, 255),
Color.FromArgb(75, 255, 255, 255));
toDrawOnLoop.TextRenderingHint = TextRenderingHint.AntiAlias;
lineLoop += 1;
yeayLoop += 140;
toDrawOnLoop.DrawString(questParser[i].Objectives[ii].Description, new Font(pfc.Families[1], 50), new SolidBrush(Color.White), new Point(100, yeayLoop));
@ -2766,6 +2868,8 @@ namespace FModel
var partsofbruhreally = questParser[i].HiddenRewards.FirstOrDefault().TemplateId.Split(':');
if (partsofbruhreally[0] != "HomebaseBannerIcon")
drawRewardIcon(partsofbruhreally[1], toDrawOnLoop, yeayLoop);
else
drawRewardBanner(partsofbruhreally[1], toDrawOnLoop, yeayLoop);
}
AppendText("\t\t" + questParser[i].HiddenRewards.FirstOrDefault().TemplateId + ":"
@ -2829,16 +2933,14 @@ namespace FModel
updateConsole(iconName + " successfully extracted", Color.FromArgb(255, 66, 244, 66), "Success");
if (extractedIconPath.Contains(".uasset") || extractedIconPath.Contains(".uexp") || extractedIconPath.Contains(".ubulk"))
{
jwpmProcess("serialize \"" + extractedIconPath.Substring(0, extractedIconPath.LastIndexOf('.')) + "\"");
myAsset = new PakAsset(extractedIconPath.Substring(0, extractedIconPath.LastIndexOf('.')));
try
{
string jsonExtractedFilePath = Directory.GetFiles(DefaultOutputPath, iconName + ".json", SearchOption.AllDirectories).FirstOrDefault();
if (jsonExtractedFilePath != null)
if (myAsset.GetSerialized() != null)
{
updateConsole(iconName + " successfully serialized", Color.FromArgb(255, 66, 244, 66), "Success");
string parsedJson = JToken.Parse(File.ReadAllText(jsonExtractedFilePath)).ToString();
File.Delete(jsonExtractedFilePath);
string parsedJson = JToken.Parse(myAsset.GetSerialized()).ToString();
var ItemID = Parser.Items.ItemsIDParser.FromJson(parsedJson);
updateConsole("Parsing " + iconName + "...", Color.FromArgb(255, 244, 132, 66), "Waiting");
for (int i = 0; i < ItemID.Length; i++)
@ -2873,12 +2975,102 @@ namespace FModel
Console.WriteLine(ex.Message);
}
}
private void drawRewardBanner(string bannerName, Graphics toDrawOn, int y)
{
itemIconPath = string.Empty;
jwpmProcess("extract \"" + Properties.Settings.Default.PAKsPath + "\\" + AllPAKsDictionary["BannerIcons"] + "\" \"BannerIcons\" \"" + DefaultOutputPath + "\" " + Properties.Settings.Default.AESKey);
string extractedBannerPath = Directory.GetFiles(DefaultOutputPath + "\\Extracted", "BannerIcons" + ".*", SearchOption.AllDirectories).Where(x => !x.EndsWith(".png")).FirstOrDefault();
if (extractedBannerPath != null)
{
updateConsole("BannerIcons successfully extracted", Color.FromArgb(255, 66, 244, 66), "Success");
if (extractedBannerPath.Contains(".uasset") || extractedBannerPath.Contains(".uexp") || extractedBannerPath.Contains(".ubulk"))
{
myAsset = new PakAsset(extractedBannerPath.Substring(0, extractedBannerPath.LastIndexOf('.')));
try
{
if (myAsset.GetSerialized() != null)
{
updateConsole("BannerIcons successfully serialized", Color.FromArgb(255, 66, 244, 66), "Success");
string parsedJson = JToken.Parse(myAsset.GetSerialized()).ToString();
parsedJson = parsedJson.TrimStart(new char[] { '[' }).TrimEnd(new char[] { ']' });
JObject jo = JObject.Parse(parsedJson);
foreach (JToken token in jo.FindTokens(bannerName))
{
var BannerID = Parser.Banners.BannersParser.FromJson(token.ToString());
updateConsole("Parsing " + token.Path + "...", Color.FromArgb(255, 244, 132, 66), "Waiting");
if (BannerID.LargeImage != null)
{
string textureFile = Path.GetFileName(BannerID.LargeImage.AssetPathName).Substring(0, Path.GetFileName(BannerID.LargeImage.AssetPathName).LastIndexOf('.'));
if (currentUsedPAKGUID != null && currentUsedPAKGUID != "0-0-0-0")
jwpmProcess("extract \"" + Properties.Settings.Default.PAKsPath + "\\" + currentUsedPAK + "\" \"" + textureFile + "\" \"" + DefaultOutputPath + "\" " + Properties.Settings.Default.AESKey);
else
jwpmProcess("extract \"" + Properties.Settings.Default.PAKsPath + "\\" + AllPAKsDictionary[textureFile] + "\" \"" + textureFile + "\" \"" + DefaultOutputPath + "\" " + Properties.Settings.Default.AESKey);
string textureFilePath = Directory.GetFiles(DefaultOutputPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).Where(x => !x.EndsWith(".png")).FirstOrDefault();
if (textureFilePath != null)
{
myAsset = new PakAsset(textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile);
myAsset.SaveTexture(textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile + ".png");
itemIconPath = textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile + ".png";
updateConsole(textureFile + " successfully converted to .PNG", Color.FromArgb(255, 66, 244, 66), "Success");
}
else
updateConsole("Error while extracting " + textureFile, Color.FromArgb(255, 244, 66, 66), "Error");
}
else if (BannerID.SmallImage != null)
{
string textureFile = Path.GetFileName(BannerID.SmallImage.AssetPathName).Substring(0, Path.GetFileName(BannerID.SmallImage.AssetPathName).LastIndexOf('.'));
if (currentUsedPAKGUID != null && currentUsedPAKGUID != "0-0-0-0")
jwpmProcess("extract \"" + Properties.Settings.Default.PAKsPath + "\\" + currentUsedPAK + "\" \"" + textureFile + "\" \"" + DefaultOutputPath + "\" " + Properties.Settings.Default.AESKey);
else
jwpmProcess("extract \"" + Properties.Settings.Default.PAKsPath + "\\" + AllPAKsDictionary[textureFile] + "\" \"" + textureFile + "\" \"" + DefaultOutputPath + "\" " + Properties.Settings.Default.AESKey);
string textureFilePath = Directory.GetFiles(DefaultOutputPath + "\\Extracted", textureFile + ".*", SearchOption.AllDirectories).Where(x => !x.EndsWith(".png")).FirstOrDefault();
if (textureFilePath != null)
{
myAsset = new PakAsset(textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile);
myAsset.SaveTexture(textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile + ".png");
itemIconPath = textureFilePath.Substring(0, textureFilePath.LastIndexOf('\\')) + "\\" + textureFile + ".png";
updateConsole(textureFile + " successfully converted to .PNG", Color.FromArgb(255, 66, 244, 66), "Success");
}
else
updateConsole("Error while extracting " + textureFile, Color.FromArgb(255, 244, 66, 66), "Error");
}
if (File.Exists(itemIconPath))
{
Image ItemIcon = Image.FromFile(itemIconPath);
toDrawOn.DrawImage(Forms.Settings.ResizeImage(ItemIcon, 110, 110), new Point(2300, y + 6));
}
else
{
Image ItemIcon = Properties.Resources.unknown512;
toDrawOn.DrawImage(Forms.Settings.ResizeImage(ItemIcon, 110, 110), new Point(2300, y + 6));
}
}
}
else
updateConsole("No serialized file found", Color.FromArgb(255, 244, 66, 66), "Error");
}
catch (JsonSerializationException)
{
updateConsole(".JSON file too large to be fully displayed", Color.FromArgb(255, 244, 66, 66), "Error");
}
}
}
}
private void convertTexture2D()
{
updateConsole(currentUsedItem + " is a Texture2D", Color.FromArgb(255, 66, 244, 66), "Success");
jwpmProcess("texture \"" + extractedFilePath.Substring(0, extractedFilePath.LastIndexOf('\\')) + "\\" + currentUsedItem + "\"");
myAsset = new PakAsset(extractedFilePath.Substring(0, extractedFilePath.LastIndexOf('\\')) + "\\" + currentUsedItem);
myAsset.SaveTexture(extractedFilePath.Substring(0, extractedFilePath.LastIndexOf('\\')) + "\\" + currentUsedItem + ".png");
string IMGPath = extractedFilePath.Substring(0, extractedFilePath.LastIndexOf('\\')) + "\\" + currentUsedItem + ".png";
if (File.Exists(IMGPath))

View File

@ -131,7 +131,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABa
CAAAAk1TRnQBSQFMAgEBAgEAAaABAAGgAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
CAAAAk1TRnQBSQFMAgEBAgEAAagBAAGoAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA

View File

@ -0,0 +1,73 @@
// <auto-generated />
//
// To parse this JSON data, add NuGet 'Newtonsoft.Json' then do:
//
// using FModel.Parser.Banners;
//
// var bannersParser = BannersParser.FromJson(jsonString);
namespace FModel.Parser.Banners
{
using System;
using System.Collections.Generic;
using System.Globalization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
public partial class BannersParser
{
[JsonProperty("export_type")]
public string ExportType { get; set; }
[JsonProperty("SmallImage")]
public Image SmallImage { get; set; }
[JsonProperty("LargeImage")]
public Image LargeImage { get; set; }
[JsonProperty("CategoryRowName")]
public string CategoryRowName { get; set; }
[JsonProperty("DisplayName")]
public string DisplayName { get; set; }
[JsonProperty("DisplayDescription")]
public string DisplayDescription { get; set; }
[JsonProperty("bFullUsageRights")]
public bool BFullUsageRights { get; set; }
}
public partial class Image
{
[JsonProperty("asset_path_name")]
public string AssetPathName { get; set; }
[JsonProperty("sub_path_string")]
public string SubPathString { get; set; }
}
public partial class BannersParser
{
public static BannersParser FromJson(string json) => JsonConvert.DeserializeObject<BannersParser>(json, FModel.Parser.Banners.Converter.Settings);
}
public static class Serialize
{
public static string ToJson(this BannersParser self) => JsonConvert.SerializeObject(self, FModel.Parser.Banners.Converter.Settings);
}
internal static class Converter
{
public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
{
MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
DateParseHandling = DateParseHandling.None,
Converters =
{
new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
},
};
}
}

View File

@ -33,7 +33,7 @@ using System.Runtime.InteropServices;
// Vous pouvez spécifier toutes les valeurs ou indiquer les numéros de build et de révision par défaut
// en utilisant '*', comme indiqué ci-dessous :
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("2.0.0.0")]
[assembly: AssemblyFileVersion("2.0.0.0")]
[assembly: AssemblyVersion("2.2.0.0")]
[assembly: AssemblyFileVersion("2.2.0.0")]
[assembly: NeutralResourcesLanguage("en")]

View File

@ -12,7 +12,7 @@ namespace FModel.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
@ -418,5 +418,17 @@ namespace FModel.Properties {
this["UMFilename"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool UpdateSettings {
get {
return ((bool)(this["UpdateSettings"]));
}
set {
this["UpdateSettings"] = value;
}
}
}
}

View File

@ -101,5 +101,8 @@
<Setting Name="UMFilename" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="UpdateSettings" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
</Settings>
</SettingsFile>

View File

@ -1 +0,0 @@
@FortOfFans is see you... https://twitter.com/FortOfFans/status/1116034206294056960?s=20

BIN
FModel/csharp_wick.dll Normal file

Binary file not shown.

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Autoupdater.NET.Official" version="1.5.1" targetFramework="net471" />
<package id="jacobslusser.ScintillaNET" version="3.6.3" targetFramework="net471" />
<package id="Newtonsoft.Json" version="12.0.1" targetFramework="net471" />
</packages>

View File

@ -12,7 +12,7 @@
### Prerequisites
[.NET Framework 4.7.1](https://dotnet.microsoft.com/download/dotnet-framework/net471)
### Download
[![](https://img.shields.io/badge/Release-Executable-orange.svg?logo=github)](https://github.com/iAmAsval/FModel/releases/tag/2.1.1)
[![](https://img.shields.io/badge/Release-Executable-orange.svg?logo=github)](https://github.com/iAmAsval/FModel/releases/tag/2.2)
### 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 custom [Fortnite Asset Parser](https://github.com/SirWaddles/JohnWickParse) in this subfolder.
@ -71,6 +71,7 @@ If somehow FModel crash because of permissions (on an administrator account for
8. Load, Extract and Save Assets automatically between current .PAK files and backup file
### What i'm using
- [Fortnite Asset Parser](https://github.com/SirWaddles/JohnWickParse) - Custom Version With Output Control And No `key.txt`
- [AutoUpdater.NET](https://github.com/ravibpatel/AutoUpdater.NET)
- [JSON Parser](https://app.quicktype.io/)
- [ScintillaNET](https://www.nuget.org/packages/jacobslusser.ScintillaNET)
- [Find & Replace for ScintillaNET](https://www.nuget.org/packages/snt.ScintillaNet.FindReplaceDialog/)
@ -80,13 +81,13 @@ 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
- [ ] Auto update
- [ ] Support for meshes
- [ ] Support for animations
- [ ] Display support for .locres files
- [x] Code refactoring
- [x] Multithreading
- [x] Stop button
- [x] Auto update
- [x] CTRL F, CTRL G, CTRL I for jsonTextBox
- [x] Update Mode
- [x] Search through PAKs