added valorant map icon support + no more FName crash + fixed dup keys

This commit is contained in:
iAmAsval 2020-07-04 01:42:10 +02:00
parent 5439fb8b13
commit 71b459fb67
83 changed files with 821 additions and 969 deletions

View File

@ -1,6 +1,6 @@
using FModel.Discord;
using FModel.Logger;
using FModel.Logger;
using FModel.Utils;
using FModel.ViewModels.ComboBox;
using FModel.ViewModels.StatusBar;
using FModel.Windows.DarkMessageBox;
using System;
@ -28,8 +28,7 @@ namespace FModel
DebugHelper.Init(LogsFilePath); // get old settings too
if (FModel.Properties.Settings.Default.UseEnglish) // use old settings here
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(ProgramLang.GetProgramLang());
DebugHelper.WriteLine("{0} {1}", "[FModel]", "");
DebugHelper.WriteLine("{0} {1} {2}", "[FModel]", "[Version]", Assembly.GetExecutingAssembly().GetName().Version.ToString());

View File

@ -1,4 +1,5 @@
using FModel.Creator.Texts;
using FModel.Creator.Fortnite;
using FModel.Creator.Texts;
using SkiaSharp;
using System;

View File

@ -1,4 +1,5 @@
using FModel.Creator.Texts;
using FModel.Creator.Fortnite;
using FModel.Creator.Texts;
using SkiaSharp;
namespace FModel.Creator.Bundles

View File

@ -1,4 +1,5 @@
using PakReader.Pak;
using FModel.Creator.Fortnite;
using PakReader.Pak;
using PakReader.Parsers.Class;
using PakReader.Parsers.PropertyTagData;
using SkiaSharp;

View File

@ -5,7 +5,7 @@ using PakReader.Parsers.Class;
using PakReader.Parsers.PropertyTagData;
using System.Collections.Generic;
namespace FModel.Creator
namespace FModel.Creator.Fortnite
{
public class BaseBundle
{

View File

@ -10,7 +10,7 @@ using System;
using System.Collections.Generic;
using System.Windows;
namespace FModel.Creator
namespace FModel.Creator.Fortnite
{
public class BaseIcon
{

View File

@ -5,7 +5,7 @@ using SkiaSharp;
using System;
using System.Windows;
namespace FModel.Creator
namespace FModel.Creator.Fortnite
{
public class BaseOffer
{

View File

@ -5,7 +5,7 @@ using PakReader.Parsers.PropertyTagData;
using SkiaSharp;
using System.Collections.Generic;
namespace FModel.Creator
namespace FModel.Creator.Fortnite
{
public class Options
{

View File

@ -1,4 +1,5 @@
using FModel.Creator.Bundles;
using FModel.Creator.Fortnite;
using FModel.Creator.Icons;
using FModel.Creator.Rarities;
using FModel.Creator.Stats;

View File

@ -1,4 +1,5 @@
using PakReader.Pak;
using FModel.Creator.Fortnite;
using PakReader.Pak;
using PakReader.Parsers.Class;
using PakReader.Parsers.PropertyTagData;

View File

@ -1,3 +1,4 @@
using FModel.Creator.Fortnite;
using PakReader.Pak;
using PakReader.Parsers.Class;
using PakReader.Parsers.PropertyTagData;

View File

@ -1,4 +1,5 @@
using PakReader.Pak;
using FModel.Creator.Fortnite;
using PakReader.Pak;
using PakReader.Parsers.Class;
using PakReader.Parsers.Objects;
using PakReader.Parsers.PropertyTagData;

View File

@ -0,0 +1,36 @@
using FModel.Creator.Valorant;
using PakReader.Pak;
using PakReader.Parsers.Class;
using PakReader.Parsers.PropertyTagData;
namespace FModel.Creator.Labels
{
static class ExplicitAsset
{
public static void GetAsset(BaseLabel icon, SoftObjectProperty s)
{
PakPackage p = Utils.GetPropertyPakPackage(s.Value.AssetPathName.String);
if (p.HasExport() && !p.Equals(default))
{
var obj = p.GetIndexedExport<UObject>(0);
if (obj != null)
{
if (obj.TryGetValue("UIData", out var t) && t is SoftObjectProperty sop)
{
p = Utils.GetPropertyPakPackage(sop.Value.AssetPathName.String);
if (p.HasExport() && !p.Equals(default))
{
obj = p.GetIndexedExport<UObject>(0);
if (obj != null)
{
var uiData = new BaseUIData(obj);
icon.IconImages.Add(uiData);
icon.Height += uiData.IconImage.Height;
}
}
}
}
}
}
}
}

View File

@ -1,4 +1,5 @@
using PakReader.Pak;
using FModel.Creator.Fortnite;
using PakReader.Pak;
using PakReader.Parsers.Class;
using PakReader.Parsers.Objects;
using PakReader.Parsers.PropertyTagData;

View File

@ -1,4 +1,4 @@
using FModel.Creator.Texts;
using FModel.Creator.Fortnite;
using PakReader.Pak;
using PakReader.Parsers.Class;
using PakReader.Parsers.Objects;

View File

@ -1,4 +1,5 @@
using FModel.Creator.Texts;
using FModel.Creator.Fortnite;
using FModel.Creator.Texts;
using FModel.Utils;
using PakReader.Pak;
using PakReader.Parsers.Class;

View File

@ -1,4 +1,5 @@
using FModel.Creator.Icons;
using FModel.Creator.Fortnite;
using FModel.Creator.Icons;
using FModel.Utils;
using PakReader.Pak;
using PakReader.Parsers.Class;

View File

@ -1,4 +1,5 @@
using SkiaSharp;
using FModel.Creator.Fortnite;
using SkiaSharp;
using System;
using System.Collections.Generic;
using System.Text;

View File

@ -1,4 +1,5 @@
using PakReader.Pak;
using FModel.Creator.Fortnite;
using PakReader.Pak;
using PakReader.Parsers.Class;
using PakReader.Parsers.Objects;
using PakReader.Parsers.PropertyTagData;

View File

@ -37,9 +37,10 @@ namespace FModel.Creator.Texts
private const string _BURBANK_SMALL_BLACK = "burbanksmall-black";
private const string _BURBANK_SMALL_BOLD = "burbanksmall-bold";
private const string _VALORANT_BASE_PATH = "/Game/UI/Fonts/FinalFonts/";
private const string _DINNEXT_W1G_BOLD = "DINNextW1G-Bold";
private const string _DINNEXT_W1G_REGULAR = "DINNextW1G-Regular";
private const string _VALORANT_BASE_PATH = "/Game/";
private const string _TUNGSTEN_BOLD = "Tungsten-Bold";
private const string _DINNEXT_W1G_LIGHT = "UI/Fonts/FinalFonts/DINNextW1G-Light";
private const string _DINNEXT_W1G_BOLD = "UI/Fonts/FinalFonts/DINNextW1G-Bold";
#pragma warning restore IDE0051
public SKTypeface DefaultTypeface; // used as default font for all untranslated strings (item source, ...)
@ -105,11 +106,15 @@ namespace FModel.Creator.Texts
}
else if (Globals.Game.ActualGame == EGame.Valorant)
{
ArraySegment<byte>[] t = Utils.GetPropertyArraySegmentByte(_VALORANT_BASE_PATH + _DINNEXT_W1G_BOLD);
ArraySegment<byte>[] t = Utils.GetPropertyArraySegmentByte(_VALORANT_BASE_PATH + _TUNGSTEN_BOLD);
if (t != null && t.Length == 3)
DisplayNameTypeface = SKTypeface.FromStream(t[2].AsStream());
t = Utils.GetPropertyArraySegmentByte(_VALORANT_BASE_PATH + _DINNEXT_W1G_REGULAR);
t = Utils.GetPropertyArraySegmentByte(_VALORANT_BASE_PATH + _DINNEXT_W1G_BOLD);
if (t != null && t.Length == 3)
BundleDefaultTypeface = SKTypeface.FromStream(t[2].AsStream());
t = Utils.GetPropertyArraySegmentByte(_VALORANT_BASE_PATH + _DINNEXT_W1G_LIGHT);
if (t != null && t.Length == 3)
DescriptionTypeface = SKTypeface.FromStream(t[2].AsStream());
}

View File

@ -0,0 +1,48 @@
using FModel.Creator.Labels;
using PakReader.Parsers.Class;
using PakReader.Parsers.PropertyTagData;
using SkiaSharp;
using System.Collections.Generic;
namespace FModel.Creator.Valorant
{
public class BaseLabel
{
public List<BaseUIData> IconImages;
public int Width = 512; // keep it 512 (or a multiple of 512) if you don't want blurry icons
public int Height = 512;
public int Margin = 4;
public BaseLabel()
{
IconImages = new List<BaseUIData>();
}
public BaseLabel(IUExport export) : this()
{
if (export.GetExport<ArrayProperty>("ExplicitAssets") is ArrayProperty explicitAssetsArray)
{
foreach (var o in explicitAssetsArray.Value)
{
if (o is SoftObjectProperty s)
ExplicitAsset.GetAsset(this, s);
}
}
}
public void Draw(SKCanvas c)
{
int yPos = Margin;
foreach (BaseUIData icon in IconImages)
{
if (icon.IconImage != null)
{
c.DrawBitmap(icon.IconImage, new SKRect(0, yPos, icon.Width, yPos + icon.Height),
new SKPaint { FilterQuality = SKFilterQuality.High, IsAntialias = true });
yPos += icon.Height;
}
}
}
}
}

View File

@ -0,0 +1,96 @@
using FModel.Creator.Texts;
using PakReader.Parsers.Class;
using PakReader.Parsers.PropertyTagData;
using SkiaSharp;
namespace FModel.Creator.Valorant
{
public class BaseMapUIData
{
public SKBitmap Splash;
public SKBitmap VLogo;
public string DisplayName;
public string Description;
public string Coordinates;
public int Width = 1920;
public int Height = 1080;
public BaseMapUIData()
{
Splash = null;
VLogo = null;
DisplayName = "";
Description = "";
Coordinates = "";
}
public BaseMapUIData(IUExport export) : this()
{
if (export.GetExport<TextProperty>("DisplayName") is TextProperty displayName)
DisplayName = Text.GetTextPropertyBase(displayName) ?? "";
if (export.GetExport<TextProperty>("Description") is TextProperty description)
Description = Text.GetTextPropertyBase(description) ?? "";
if (export.GetExport<TextProperty>("Coordinates") is TextProperty coordinates)
Coordinates = Text.GetTextPropertyBase(coordinates) ?? "";
if (export.GetExport<ObjectProperty>("Splash") is ObjectProperty icon)
Splash = Utils.GetObjectTexture(icon);
VLogo = Utils.GetTexture("/Game/UI/Shared/Icons/Valorant_logo_cutout").Resize(48, 48);
if (Splash != null)
{
Width = Splash.Width;
Height = Splash.Height;
}
}
public void Draw(SKCanvas c)
{
int paddingLR = 80;
int paddingTB = 35;
int nameSize = 200;
int descriptionSize = 30;
using var namePaint = new SKPaint
{
IsAntialias = true,
FilterQuality = SKFilterQuality.High,
Typeface = Text.TypeFaces.DisplayNameTypeface,
TextSize = nameSize,
TextAlign = SKTextAlign.Left,
Color = SKColor.Parse("FFFBFA")
};
while (namePaint.MeasureText(DisplayName) > Width - (paddingLR * 2))
{
namePaint.TextSize = nameSize -= 2;
}
using var descriptionPaint = new SKPaint
{
IsAntialias = true,
FilterQuality = SKFilterQuality.High,
Typeface = Text.TypeFaces.DescriptionTypeface,
TextSize = descriptionSize,
TextAlign = SKTextAlign.Left,
Color = SKColor.Parse("FFFBFA")
};
while (descriptionPaint.MeasureText(Description) > Width - (paddingLR * 2))
{
descriptionPaint.TextSize = descriptionSize -= 2;
}
c.DrawBitmap(Splash, new SKRect(0, 0, Width, Height), new SKPaint { FilterQuality = SKFilterQuality.High, IsAntialias = true });
c.DrawText(DisplayName.ToUpper(), paddingLR, paddingTB + namePaint.TextSize, namePaint);
c.DrawRect(new SKRect(paddingLR + 2.5f, paddingTB + 25 + namePaint.TextSize, paddingLR + 202.5f, paddingTB + 27.5f + namePaint.TextSize), new SKPaint { FilterQuality = SKFilterQuality.High, IsAntialias = true, Color = SKColor.Parse("5AFFFBFA") });
c.DrawText(Description, paddingLR + 2.5f, paddingTB + 40 + namePaint.TextSize + descriptionPaint.TextSize, descriptionPaint);
descriptionPaint.Typeface = Text.TypeFaces.BundleDefaultTypeface;
c.DrawText(Coordinates.ToUpper(), paddingLR, Height - paddingTB - descriptionPaint.TextSize, descriptionPaint);
if (VLogo != null)
{
c.DrawBitmap(VLogo, new SKRect(Width - VLogo.Width - paddingLR, paddingLR, Width - paddingLR, paddingLR + VLogo.Height), new SKPaint { FilterQuality = SKFilterQuality.High, IsAntialias = true });
c.DrawRect(new SKRect(Width - VLogo.Width - paddingLR, paddingLR + VLogo.Height + 5, Width - paddingLR, paddingLR + VLogo.Height + 7.5f), new SKPaint { FilterQuality = SKFilterQuality.High, IsAntialias = true, Color = SKColor.Parse("FFFBFA") });
}
}
}
}

View File

@ -3,7 +3,7 @@ using PakReader.Parsers.Class;
using PakReader.Parsers.PropertyTagData;
using SkiaSharp;
namespace FModel.Creator
namespace FModel.Creator.Valorant
{
public class BaseUIData
{
@ -37,6 +37,7 @@ namespace FModel.Creator
if (export.GetExport<TextProperty>("Description") is TextProperty description)
{
Description = Text.GetTextPropertyBase(description);
if (Description != null && Description.Equals(DisplayName)) Description = string.Empty;
if (!string.IsNullOrEmpty(Description))
{
Height += (int)descriptionPaint.TextSize * Helper.SplitLines(Description, descriptionPaint, Width - Margin).Length;
@ -44,7 +45,7 @@ namespace FModel.Creator
}
}
if (export.GetExport<ObjectProperty>("FullRender", "VerticalPromoImage", "LargeIcon", "DisplayIcon") is ObjectProperty icon)
if (export.GetExport<ObjectProperty>("ListViewIcon", "FullRender", "VerticalPromoImage", "LargeIcon", "DisplayIcon") is ObjectProperty icon)
{
SKBitmap raw = Utils.GetObjectTexture(icon);
if (raw != null)
@ -83,8 +84,9 @@ namespace FModel.Creator
Helper.DrawMultilineText(c, Description, Width, Margin, ETextSide.Left,
new SKRect(Margin, textSize + 25, Width - Margin, Height - 25), descriptionPaint, out var yPos);
c.DrawBitmap(IconImage, new SKRect(0, yPos, Width, Height),
new SKPaint { FilterQuality = SKFilterQuality.High, IsAntialias = true });
if (IconImage != null)
c.DrawBitmap(IconImage, new SKRect(0, yPos, Width, Height),
new SKPaint { FilterQuality = SKFilterQuality.High, IsAntialias = true });
}
}
}

View File

@ -1,5 +1,6 @@
using FModel.Creator.Icons;
using FModel.Creator.Texts;
using FModel.Creator.Valorant;
using FModel.ViewModels.ImageBox;
using PakReader.Parsers.Class;
using SkiaSharp;
@ -9,27 +10,65 @@ namespace FModel.Creator
{
static class ValorantCreator
{
public static bool TryDrawValorantIcon(string assetPath, IUExport export)
public static bool TryDrawValorantIcon(string assetPath, string exportType, IUExport export)
{
var d = new DirectoryInfo(assetPath);
string assetName = d.Name;
if (Text.TypeFaces.NeedReload(false))
Text.TypeFaces = new Typefaces(); // when opening bundle creator settings without loading paks first
Text.TypeFaces = new Typefaces();
BaseUIData icon = new BaseUIData(export);
if (icon.IconImage != null)
switch (exportType)
{
using (var ret = new SKBitmap(icon.Width, icon.Height, SKColorType.Rgba8888, SKAlphaType.Premul))
using (var c = new SKCanvas(ret))
{
icon.Draw(c);
case "MapUIData":
{
BaseMapUIData icon = new BaseMapUIData(export);
using (var ret = new SKBitmap(icon.Width, icon.Height, SKColorType.Rgba8888, SKAlphaType.Premul))
using (var c = new SKCanvas(ret))
{
icon.Draw(c);
ImageBoxVm.imageBoxViewModel.Set(ret, assetName);
}
return true;
}
case "ArmorUIData":
case "SprayUIData":
case "ThemeUIData":
case "SeasonUIData":
case "MissionUIData":
case "ContractUIData":
case "CurrencyUIData":
case "GameModeUIData":
case "ObjectiveUIData":
case "CharacterUIData":
case "SprayLevelUIData":
case "EquippableUIData":
case "PlayerCardUIData":
case "ContentTierUIData":
case "PlayerTitleUIData":
case "Gun_UIData_Base_C":
case "CharacterRoleUIData":
case "StorefrontItemUIData":
case "SprayEquipSlotUIData":
case "EquippableSkinUIData":
case "ContractChapterUIData":
case "EquippableCharmUIData":
case "EquippableSkinLevelUIData":
case "EquippableSkinChromaUIData":
case "EquippableAttachmentUIData":
case "EquippableCharmLevelUIData":
{
BaseUIData icon = new BaseUIData(export);
using (var ret = new SKBitmap(icon.Width, icon.Height, SKColorType.Rgba8888, SKAlphaType.Premul))
using (var c = new SKCanvas(ret))
{
icon.Draw(c);
Watermark.DrawWatermark(c); // watermark should only be applied on icons with width = 512
ImageBoxVm.imageBoxViewModel.Set(ret, assetName);
}
return true;
Watermark.DrawWatermark(c); // watermark should only be applied on icons with width = 512
ImageBoxVm.imageBoxViewModel.Set(ret, assetName);
}
return true;
}
}
return false;
}
}

View File

@ -1,11 +1,9 @@
using System;
using System.Collections.Generic;
using System;
using System.IO;
using Newtonsoft.Json;
using PakReader.Parsers;
using PakReader.Parsers.Class;
using PakReader.Parsers.Objects;
using PakReader.Parsers.PropertyTagData;
namespace PakReader.Pak
{
@ -29,7 +27,7 @@ namespace PakReader.Pak
ExportType = ExportTypes[i].String,
ExportValue = (FModel.EJsonType)FModel.Properties.Settings.Default.AssetsJsonType switch
{
FModel.EJsonType.Default => GetJsonDict(Exports[i]),
FModel.EJsonType.Default => Exports[i].GetJsonDict(),
_ => Exports[i]
}
};
@ -91,49 +89,6 @@ namespace PakReader.Pak
exports = new ExportList();
}
private Dictionary<string, object> GetJsonDict(IUExport export)
{
if (export != null)
{
var ret = new Dictionary<string, object>(export.Count);
foreach (KeyValuePair<string, object> KvP in export)
{
if (KvP.Value == null)
ret[KvP.Key] = null;
else
ret[KvP.Key] = KvP.Value.GetType().Name switch
{
"ByteProperty" => ((ByteProperty)KvP.Value).GetValue(),
"BoolProperty" => ((BoolProperty)KvP.Value).GetValue(),
"IntProperty" => ((IntProperty)KvP.Value).GetValue(),
"FloatProperty" => ((FloatProperty)KvP.Value).GetValue(),
"ObjectProperty" => ((ObjectProperty)KvP.Value).GetValue(),
"NameProperty" => ((NameProperty)KvP.Value).GetValue(),
"DoubleProperty" => ((DoubleProperty)KvP.Value).GetValue(),
"ArrayProperty" => ((ArrayProperty)KvP.Value).GetValue(),
"StructProperty" => ((StructProperty)KvP.Value).GetValue(),
"StrProperty" => ((StrProperty)KvP.Value).GetValue(),
"TextProperty" => ((TextProperty)KvP.Value).GetValue(),
"InterfaceProperty" => ((InterfaceProperty)KvP.Value).GetValue(),
"SoftObjectProperty" => ((SoftObjectProperty)KvP.Value).GetValue(),
"UInt64Property" => ((UInt64Property)KvP.Value).GetValue(),
"UInt32Property" => ((UInt32Property)KvP.Value).GetValue(),
"UInt16Property" => ((UInt16Property)KvP.Value).GetValue(),
"Int64Property" => ((Int64Property)KvP.Value).GetValue(),
"Int16Property" => ((Int16Property)KvP.Value).GetValue(),
"Int8Property" => ((Int8Property)KvP.Value).GetValue(),
"MapProperty" => ((MapProperty)KvP.Value).GetValue(),
"SetProperty" => ((SetProperty)KvP.Value).GetValue(),
"EnumProperty" => ((EnumProperty)KvP.Value).GetValue(),
"UObject" => ((UObject)KvP.Value).GetValue(),
_ => KvP.Value,
};
}
return ret;
}
return null;
}
public T GetExport<T>() where T : IUExport
{
var exports = Exports;

View File

@ -1,4 +1,5 @@
using System.Collections.Generic;
using PakReader.Parsers.PropertyTagData;
using System.Collections.Generic;
namespace PakReader.Parsers.Class
{
@ -22,5 +23,46 @@ namespace PakReader.Parsers.Class
}
return default;
}
public static Dictionary<string, object> GetJsonDict(this IUExport export)
{
if (export != null)
{
var ret = new Dictionary<string, object>(export.Count);
foreach (var (key, value) in export)
{
ret[key] = value switch
{
ByteProperty byteProperty => byteProperty.GetValue(),
BoolProperty boolProperty => boolProperty.GetValue(),
IntProperty intProperty => intProperty.GetValue(),
FloatProperty floatProperty => floatProperty.GetValue(),
ObjectProperty objectProperty => objectProperty.GetValue(),
NameProperty nameProperty => nameProperty.GetValue(),
DelegateProperty delegateProperty => delegateProperty.GetValue(),
DoubleProperty doubleProperty => doubleProperty.GetValue(),
ArrayProperty arrayProperty => arrayProperty.GetValue(),
StructProperty structProperty => structProperty.GetValue(),
StrProperty strProperty => strProperty.GetValue(),
TextProperty textProperty => textProperty.GetValue(),
InterfaceProperty interfaceProperty => interfaceProperty.GetValue(),
SoftObjectProperty softObjectProperty => softObjectProperty.GetValue(),
UInt64Property uInt64Property => uInt64Property.GetValue(),
UInt32Property uInt32Property => uInt32Property.GetValue(),
UInt16Property uInt16Property => uInt16Property.GetValue(),
Int64Property int64Property => int64Property.GetValue(),
Int16Property int16Property => int16Property.GetValue(),
Int8Property int8Property => int8Property.GetValue(),
MapProperty mapProperty => mapProperty.GetValue(),
SetProperty setProperty => setProperty.GetValue(),
EnumProperty enumProperty => enumProperty.GetValue(),
UObject uObject => uObject.GetJsonDict(),
_ => value,
};
}
return ret;
}
return null;
}
}
}

View File

@ -19,8 +19,15 @@ namespace PakReader.Parsers.Class
RowMap = new Dictionary<string, object>();
for (int i = 0; i < NumRows; i++)
{
var RowName = reader.ReadFName();
RowMap[RowName.String] = new UObject(reader, true);
int num = 1;
string RowName = reader.ReadFName().String;
string baseName = RowName;
while (RowMap.ContainsKey(RowName))
{
RowName = $"{baseName}_NK{num++:00}";
}
RowMap[RowName] = new UObject(reader, true);
}
}

View File

@ -17,8 +17,15 @@ namespace PakReader.Parsers.Class
RowMap = new Dictionary<string, object>();
for (int i = 0; i < NumRows; i++)
{
var RowName = reader.ReadFName();
RowMap[RowName.String] = new UObject(reader, true);
int num = 1;
string RowName = reader.ReadFName().String;
string baseName = RowName;
while (RowMap.ContainsKey(RowName))
{
RowName = $"{baseName}_NK{num++:00}";
}
RowMap[RowName] = new UObject(reader, true);
}
}

View File

@ -1,4 +1,4 @@
using System;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
@ -21,18 +21,18 @@ namespace PakReader.Parsers.Class
internal UObject(PackageReader reader, long maxSize, bool structFallback)
{
var properties = new Dictionary<string, object>();
int i = 1;
int num = 1;
while (true)
{
var Tag = new FPropertyTag(reader);
if (Tag.Name.IsNone)
if (Tag.Name.IsNone || Tag.Name.String == null)
break;
var pos = reader.Position;
var obj = BaseProperty.ReadAsObject(reader, Tag, Tag.Type, ReadType.NORMAL) ?? null;
var key = properties.ContainsKey(Tag.Name.String) ? $"{Tag.Name.String}_NK{i++}" : Tag.Name.String;
var key = properties.ContainsKey(Tag.Name.String) ? $"{Tag.Name.String}_NK{num++:00}" : Tag.Name.String;
properties[key] = obj;
if (obj == null) break;
@ -52,43 +52,6 @@ namespace PakReader.Parsers.Class
}
}
public Dictionary<string, object> GetValue()
{
var ret = new Dictionary<string, object>(Dict.Count);
foreach (KeyValuePair<string, object> KvP in Dict)
{
if (KvP.Value == null)
ret[KvP.Key] = null;
else
ret[KvP.Key] = KvP.Value.GetType().Name switch
{
"ByteProperty" => ((ByteProperty)KvP.Value).GetValue(),
"BoolProperty" => ((BoolProperty)KvP.Value).GetValue(),
"IntProperty" => ((IntProperty)KvP.Value).GetValue(),
"FloatProperty" => ((FloatProperty)KvP.Value).GetValue(),
"ObjectProperty" => ((ObjectProperty)KvP.Value).GetValue(),
"NameProperty" => ((NameProperty)KvP.Value).GetValue(),
"DoubleProperty" => ((DoubleProperty)KvP.Value).GetValue(),
"ArrayProperty" => ((ArrayProperty)KvP.Value).GetValue(),
"StructProperty" => ((StructProperty)KvP.Value).GetValue(),
"StrProperty" => ((StrProperty)KvP.Value).GetValue(),
"TextProperty" => ((TextProperty)KvP.Value).GetValue(),
"InterfaceProperty" => ((InterfaceProperty)KvP.Value).GetValue(),
"SoftObjectProperty" => ((SoftObjectProperty)KvP.Value).GetValue(),
"UInt64Property" => ((UInt64Property)KvP.Value).GetValue(),
"UInt32Property" => ((UInt32Property)KvP.Value).GetValue(),
"UInt16Property" => ((UInt16Property)KvP.Value).GetValue(),
"Int64Property" => ((Int64Property)KvP.Value).GetValue(),
"Int16Property" => ((Int16Property)KvP.Value).GetValue(),
"Int8Property" => ((Int8Property)KvP.Value).GetValue(),
"MapProperty" => ((MapProperty)KvP.Value).GetValue(),
"SetProperty" => ((SetProperty)KvP.Value).GetValue(),
"EnumProperty" => ((EnumProperty)KvP.Value).GetValue(),
_ => KvP.Value,
};
}
return ret;
}
public object this[string key] => Dict[key];
public IEnumerable<string> Keys => Dict.Keys;
public IEnumerable<object> Values => Dict.Values;

View File

@ -1,4 +1,6 @@
namespace PakReader.Parsers.Objects
using System.Collections.Generic;
namespace PakReader.Parsers.Objects
{
public readonly struct FAssetData : IUStruct
{
@ -32,5 +34,20 @@
ChunkIDs = reader.Loader.ReadTArray(() => reader.Loader.ReadInt32());
PackageFlags = reader.Loader.ReadInt32();
}
public Dictionary<string, object> GetValue()
{
return new Dictionary<string, object>
{
["ObjectPath"] = ObjectPath.String,
["PackageName"] = PackageName.String,
["PackagePath"] = PackagePath.String,
["AssetName"] = AssetName.String,
["AssetClass"] = AssetClass.String,
["TagsAndValues"] = TagsAndValues.Map,
["ChunkIDs"] = ChunkIDs,
["PackageFlags"] = PackageFlags
};
}
}
}

View File

@ -1,4 +1,6 @@
namespace PakReader.Parsers.Objects
using System.Collections.Generic;
namespace PakReader.Parsers.Objects
{
public readonly struct FAssetIdentifier : IUStruct
{
@ -36,5 +38,16 @@
ValueName = reader.ReadFName();
}
}
}
public Dictionary<string, string> GetValue()
{
return new Dictionary<string, string>
{
["PackageName"] = PackageName.String,
["PrimaryAssetType"] = PrimaryAssetType.String,
["ObjectName"] = ObjectName.String,
["ValueName"] = ValueName.String
};
}
}
}

View File

@ -1,4 +1,6 @@
namespace PakReader.Parsers.Objects
using System.Collections.Generic;
namespace PakReader.Parsers.Objects
{
public readonly struct FAssetPackageData : IUStruct
{
@ -20,5 +22,16 @@
else
CookedHash = default;
}
public Dictionary<string, object> GetValue()
{
return new Dictionary<string, object>
{
["PackageName"] = PackageName.String,
["DiskSize"] = DiskSize,
["PackageGuid"] = PackageGuid.Hex,
["CookedHash"] = CookedHash
};
}
}
}

View File

@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
namespace PakReader.Parsers.Objects
{
@ -20,5 +21,18 @@ namespace PakReader.Parsers.Objects
_ => throw new NotImplementedException(string.Format(FModel.Properties.Resources.ParsingNotSupported, Type)),
};
}
public Dictionary<string, object> GetValue()
{
return new Dictionary<string, object>
{
["Type"] = Type,
["Value"] = Value switch
{
FText fText => fText.GetValue(),
_ => Value,
}
};
}
}
}

View File

@ -11,6 +11,16 @@ namespace PakReader.Parsers.Objects
{
GameplayTags = reader.ReadTArray(() => reader.ReadFName());
}
public string[] GetValue()
{
var ret = new string[GameplayTags.Length];
for (int i = 0; i < ret.Length; i++)
{
ret[i] = GameplayTags[i].String;
}
return ret;
}
}
public static class FGameplayTagContainerExtension

View File

@ -13,7 +13,6 @@ namespace PakReader.Parsers.Objects
*/
public readonly struct FPackageIndex
{
[JsonIgnore]
public readonly int Index;
public FObjectResource Resource
{
@ -42,14 +41,13 @@ namespace PakReader.Parsers.Objects
{
if (Resource != null)
{
var ret = new Dictionary<string, object>
return new Dictionary<string, object>
{
["ObjectName"] = Resource.ObjectName.String,
["OuterIndex"] = Resource.OuterIndex.GetValue()
};
return ret;
}
return null;
return Index;
}
[JsonIgnore]

View File

@ -1,4 +1,6 @@
namespace PakReader.Parsers.Objects
using System.Collections.Generic;
namespace PakReader.Parsers.Objects
{
public readonly struct FSoftObjectPath : IUStruct
{
@ -12,5 +14,14 @@
AssetPathName = reader.ReadFName();
SubPathString = reader.ReadFString();
}
public Dictionary<string, string> GetValue()
{
return new Dictionary<string, string>
{
["AssetPathName"] = AssetPathName.String,
["SubPathString"] = SubPathString
};
}
}
}

View File

@ -56,5 +56,18 @@ namespace PakReader.Parsers.Objects
break;
}
}
public object GetValue()
{
return Text switch
{
FTextHistory.DateTime dateTime => dateTime.GetValue(),
FTextHistory.OrderedFormat orderedFormat => orderedFormat.GetValue(),
FTextHistory.FormatNumber formatNumber => formatNumber.GetValue(),
FTextHistory.StringTableEntry stringTableEntry => stringTableEntry.GetValue(),
FTextHistory.None none => none.CultureInvariantString,
_ => Text
};
}
}
}

View File

@ -14,7 +14,7 @@ namespace PakReader.Parsers.Objects
internal Base(PackageReader reader)
{
Namespace = reader.ReadFString() ?? string.Empty; // namespaces are sometimes null
Key = reader.ReadFString();
Key = reader.ReadFString() ?? string.Empty;
SourceString = Localizations.GetLocalization(Namespace, Key, reader.ReadFString());
}
}

View File

@ -1,4 +1,6 @@
namespace PakReader.Parsers.Objects
using System.Collections.Generic;
namespace PakReader.Parsers.Objects
{
public partial class FTextHistory
{
@ -20,6 +22,18 @@
TimeZone = reader.ReadFString();
TargetCulture = reader.ReadFString();
}
public Dictionary<string, object> GetValue()
{
return new Dictionary<string, object>
{
["SourceDateTime"] = SourceDateTime.Ticks,
["DateStyle"] = DateStyle,
["TimeStyle"] = TimeStyle,
["TimeZone"] = TimeZone,
["TargetCulture"] = TargetCulture,
};
}
}
}
}

View File

@ -1,4 +1,6 @@
namespace PakReader.Parsers.Objects
using System.Collections.Generic;
namespace PakReader.Parsers.Objects
{
public partial class FTextHistory
{
@ -16,6 +18,16 @@
TimeZone = reader.ReadFString();
TargetCulture = reader.ReadFString();
}
public Dictionary<string, object> GetValue()
{
return new Dictionary<string, object>
{
["SourceValue"] = SourceValue.GetValue(),
["TimeZone"] = TimeZone,
["TargetCulture"] = TargetCulture
};
}
}
}
}

View File

@ -1,4 +1,6 @@
namespace PakReader.Parsers.Objects
using System.Collections.Generic;
namespace PakReader.Parsers.Objects
{
public partial class FTextHistory
{
@ -18,6 +20,21 @@
Arguments[i] = new FFormatArgumentValue(reader);
}
}
public Dictionary<string, object> GetValue()
{
var array = new Dictionary<string, object>[Arguments.Length];
for (int i = 0; i < array.Length; i++)
{
array[i] = Arguments[i].GetValue();
}
return new Dictionary<string, object>
{
["SourceFmt"] = SourceFmt.GetValue(),
["Arguments"] = array,
};
}
}
}
}

View File

@ -1,4 +1,6 @@
namespace PakReader.Parsers.Objects
using System.Collections.Generic;
namespace PakReader.Parsers.Objects
{
public partial class FTextHistory
{
@ -14,6 +16,15 @@
TableId = reader.ReadFName();
Key = reader.ReadFString();
}
public Dictionary<string, string> GetValue()
{
return new Dictionary<string, string>
{
["TableId"] = TableId.String,
["Key"] = Key
};
}
}
}
}

View File

@ -11,7 +11,9 @@ namespace PakReader.Parsers.Objects
internal UScriptStruct(PackageReader reader, FName structName) : this(reader, structName.String) { }
internal UScriptStruct(PackageReader reader, string structName)
{
#if DEBUG
//System.Diagnostics.Debug.WriteLine(structName);
#endif
Struct = structName switch
{
"LevelSequenceObjectReferenceMap" => new FLevelSequenceObjectReferenceMap(reader),
@ -49,7 +51,6 @@ namespace PakReader.Parsers.Objects
"MovieSceneFloatChannel" => new FMovieSceneFloatChannel(reader),
"MovieSceneEvaluationTemplate" => new FMovieSceneEvaluationTemplate(reader),
"SkeletalMeshSamplingLODBuiltData" => new FSkeletalMeshSamplingLODBuiltData(reader),
//"BodyInstance" => new FBodyInstance(reader), // if uncommented, can't parse .umap
"VectorMaterialInput" => new FVectorMaterialInput(reader),
"ColorMaterialInput" => new FColorMaterialInput(reader),
"ExpressionInput" => new FMaterialInput(reader),

View File

@ -35,36 +35,39 @@ namespace PakReader.Parsers
Loader = uexp;
for(int i = 0; i < ExportMap.Length; i++)
{
FName ObjectClassName;
if (ExportMap[i].ClassIndex.IsNull)
ObjectClassName = DataExportTypes[i] = ReadFName(); // check if this is true, I don't know if Fortnite ever uses this
else if (ExportMap[i].ClassIndex.IsExport)
ObjectClassName = DataExportTypes[i] = ExportMap[ExportMap[i].ClassIndex.AsExport].ObjectName;
else if (ExportMap[i].ClassIndex.IsImport)
ObjectClassName = DataExportTypes[i] = ImportMap[ExportMap[i].ClassIndex.AsImport].ObjectName;
else
throw new FileLoadException("Can't get class name"); // Shouldn't reach this unless the laws of math have bent to MagmaReef's will
if (ObjectClassName.String.Equals("BlueprintGeneratedClass")) continue;
var pos = Position = ExportMap[i].SerialOffset - PackageFileSummary.TotalHeaderSize;
DataExports[i] = ObjectClassName.String switch
FObjectExport Export = ExportMap[i];
{
"Texture2D" => new UTexture2D(this, ubulk, ExportMap.Sum(e => e.SerialSize) + PackageFileSummary.TotalHeaderSize),
"CurveTable" => new UCurveTable(this),
"DataTable" => new UDataTable(this),
"FontFace" => new UFontFace(this, ubulk),
"SoundWave" => new USoundWave(this, ubulk, ExportMap.Sum(e => e.SerialSize) + PackageFileSummary.TotalHeaderSize),
"StringTable" => new UStringTable(this),
_ => new UObject(this),
};
FName ExportType;
if (Export.ClassIndex.IsNull)
ExportType = DataExportTypes[i] = ReadFName(); // check if this is true, I don't know if Fortnite ever uses this
else if (Export.ClassIndex.IsExport)
ExportType = DataExportTypes[i] = ExportMap[Export.ClassIndex.AsExport].SuperIndex.Resource.ObjectName;
else if (Export.ClassIndex.IsImport)
ExportType = DataExportTypes[i] = ImportMap[Export.ClassIndex.AsImport].ObjectName;
else
throw new FileLoadException("Can't get class name"); // Shouldn't reach this unless the laws of math have bent to MagmaReef's will
if (ExportType.String.Equals("BlueprintGeneratedClass")) continue;
var pos = Position = Export.SerialOffset - PackageFileSummary.TotalHeaderSize;
DataExports[i] = ExportType.String switch
{
"Texture2D" => new UTexture2D(this, ubulk, ExportMap.Sum(e => e.SerialSize) + PackageFileSummary.TotalHeaderSize),
"CurveTable" => new UCurveTable(this),
"DataTable" => new UDataTable(this),
"FontFace" => new UFontFace(this, ubulk),
"SoundWave" => new USoundWave(this, ubulk, ExportMap.Sum(e => e.SerialSize) + PackageFileSummary.TotalHeaderSize),
"StringTable" => new UStringTable(this),
_ => new UObject(this),
};
#if DEBUG
if (pos + ExportMap[i].SerialSize != Position)
{
System.Diagnostics.Debug.WriteLine($"[ExportType={ObjectClassName.String}] Didn't read {ExportMap[i].ObjectName} correctly (at {Position}, should be {pos + ExportMap[i].SerialSize}, {pos + ExportMap[i].SerialSize - Position} behind)");
}
if (pos + Export.SerialSize != Position)
{
System.Diagnostics.Debug.WriteLine($"[ExportType={ExportType.String}] Didn't read {Export.ObjectName} correctly (at {Position}, should be {pos + Export.SerialSize}, {pos + Export.SerialSize - Position} behind)");
}
#endif
}
}
return;
}
@ -129,7 +132,10 @@ namespace PakReader.Parsers
{
return new FName(NameMap[NameIndex], NameIndex, Number);
}
throw new FileLoadException($"Bad Name Index: {NameIndex}/{NameMap.Length} - Loader Position: {Loader.BaseStream.Position}");
#if DEBUG
System.Diagnostics.Debug.WriteLine($"Bad Name Index: {NameIndex}/{NameMap.Length} - Loader Position: {Loader.BaseStream.Position}");
#endif
return default;
}

View File

@ -1,15 +1,15 @@
using PakReader.Parsers.Objects;
using PakReader.Parsers.Objects;
namespace PakReader.Parsers.PropertyTagData
{
public sealed class ArrayProperty : BaseProperty<object[]>
public sealed class ArrayProperty : BaseProperty<BaseProperty[]>
{
internal ArrayProperty(PackageReader reader, FPropertyTag tag)
{
Position = reader.Position;
int length = reader.ReadInt32();
Value = new object[length];
Value = new BaseProperty[length];
FPropertyTag InnerTag = default;
// Execute if UE4 version is at least VER_UE4_INNER_ARRAY_TAG_INFO
@ -20,7 +20,7 @@ namespace PakReader.Parsers.PropertyTagData
}
for (int i = 0; i < length; i++)
{
Value[i] = BaseProperty.ReadAsObject(reader, InnerTag, tag.InnerType, ReadType.ARRAY);
Value[i] = ReadAsObject(reader, InnerTag, tag.InnerType, ReadType.ARRAY);
}
}
@ -29,35 +29,33 @@ namespace PakReader.Parsers.PropertyTagData
var ret = new object[Value.Length];
for (int i = 0; i < ret.Length; i++)
{
if (Value[i] == null)
ret[i] = null;
else
ret[i] = ((BaseProperty)Value[i]).GetType().Name switch
{
"ByteProperty" => ((ByteProperty)Value[i]).GetValue(),
"BoolProperty" => ((BoolProperty)Value[i]).GetValue(),
"IntProperty" => ((IntProperty)Value[i]).GetValue(),
"FloatProperty" => ((FloatProperty)Value[i]).GetValue(),
"ObjectProperty" => ((ObjectProperty)Value[i]).GetValue(),
"NameProperty" => ((NameProperty)Value[i]).GetValue(),
"DoubleProperty" => ((DoubleProperty)Value[i]).GetValue(),
"ArrayProperty" => ((ArrayProperty)Value[i]).GetValue(),
"StructProperty" => ((StructProperty)Value[i]).GetValue(),
"StrProperty" => ((StrProperty)Value[i]).GetValue(),
"TextProperty" => ((TextProperty)Value[i]).GetValue(),
"InterfaceProperty" => ((InterfaceProperty)Value[i]).GetValue(),
"SoftObjectProperty" => ((SoftObjectProperty)Value[i]).GetValue(),
"UInt64Property" => ((UInt64Property)Value[i]).GetValue(),
"UInt32Property" => ((UInt32Property)Value[i]).GetValue(),
"UInt16Property" => ((UInt16Property)Value[i]).GetValue(),
"Int64Property" => ((Int64Property)Value[i]).GetValue(),
"Int16Property" => ((Int16Property)Value[i]).GetValue(),
"Int8Property" => ((Int8Property)Value[i]).GetValue(),
"MapProperty" => ((MapProperty)Value[i]).GetValue(),
"SetProperty" => ((SetProperty)Value[i]).GetValue(),
"EnumProperty" => ((EnumProperty)Value[i]).GetValue(),
_ => Value[i],
};
ret[i] = Value[i] switch
{
ByteProperty byteProperty => byteProperty.GetValue(),
BoolProperty boolProperty => boolProperty.GetValue(),
IntProperty intProperty => intProperty.GetValue(),
FloatProperty floatProperty => floatProperty.GetValue(),
ObjectProperty objectProperty => objectProperty.GetValue(),
NameProperty nameProperty => nameProperty.GetValue(),
DelegateProperty delegateProperty => delegateProperty.GetValue(),
DoubleProperty doubleProperty => doubleProperty.GetValue(),
ArrayProperty arrayProperty => arrayProperty.GetValue(),
StructProperty structProperty => structProperty.GetValue(),
StrProperty strProperty => strProperty.GetValue(),
TextProperty textProperty => textProperty.GetValue(),
InterfaceProperty interfaceProperty => interfaceProperty.GetValue(),
SoftObjectProperty softObjectProperty => softObjectProperty.GetValue(),
UInt64Property uInt64Property => uInt64Property.GetValue(),
UInt32Property uInt32Property => uInt32Property.GetValue(),
UInt16Property uInt16Property => uInt16Property.GetValue(),
Int64Property int64Property => int64Property.GetValue(),
Int16Property int16Property => int16Property.GetValue(),
Int8Property int8Property => int8Property.GetValue(),
MapProperty mapProperty => mapProperty.GetValue(),
SetProperty setProperty => setProperty.GetValue(),
EnumProperty enumProperty => enumProperty.GetValue(),
_ => Value[i],
};
}
return ret;
}

View File

@ -8,31 +8,31 @@ namespace PakReader.Parsers.PropertyTagData
{
BaseProperty prop = type.String switch
{
"ByteProperty" => new ByteProperty(reader, tag, readType),
"ByteProperty" => new ByteProperty(reader, readType),
"BoolProperty" => new BoolProperty(reader, tag, readType),
"IntProperty" => new IntProperty(reader, tag),
"FloatProperty" => new FloatProperty(reader, tag),
"ObjectProperty" => new ObjectProperty(reader, tag),
"NameProperty" => new NameProperty(reader, tag),
"DelegateProperty" => new DelegateProperty(reader, tag),
"DoubleProperty" => new DoubleProperty(reader, tag),
"IntProperty" => new IntProperty(reader),
"FloatProperty" => new FloatProperty(reader),
"ObjectProperty" => new ObjectProperty(reader),
"NameProperty" => new NameProperty(reader),
"DelegateProperty" => new DelegateProperty(reader),
"DoubleProperty" => new DoubleProperty(reader),
"ArrayProperty" => new ArrayProperty(reader, tag),
"StructProperty" => new StructProperty(reader, tag),
"StrProperty" => new StrProperty(reader, tag),
"TextProperty" => new TextProperty(reader, tag),
"InterfaceProperty" => new InterfaceProperty(reader, tag),
"StrProperty" => new StrProperty(reader),
"TextProperty" => new TextProperty(reader),
"InterfaceProperty" => new InterfaceProperty(reader),
"MulticastDelegateProperty" => new MulticastDelegateProperty(reader, tag),
"LazyObjectProperty" => new LazyObjectProperty(reader, tag),
"SoftObjectProperty" => new SoftObjectProperty(reader, tag, readType),
"UInt64Property" => new UInt64Property(reader, tag),
"UInt32Property" => new UInt32Property(reader, tag),
"UInt16Property" => new UInt16Property(reader, tag),
"Int64Property" => new Int64Property(reader, tag),
"Int16Property" => new Int16Property(reader, tag),
"Int8Property" => new Int8Property(reader, tag),
"SoftObjectProperty" => new SoftObjectProperty(reader, readType),
"UInt64Property" => new UInt64Property(reader),
"UInt32Property" => new UInt32Property(reader),
"UInt16Property" => new UInt16Property(reader),
"Int64Property" => new Int64Property(reader),
"Int16Property" => new Int16Property(reader),
"Int8Property" => new Int8Property(reader),
"MapProperty" => new MapProperty(reader, tag),
"SetProperty" => new SetProperty(reader, tag),
"EnumProperty" => new EnumProperty(reader, tag),
"EnumProperty" => new EnumProperty(reader),
_ => null, //throw new NotImplementedException($"Parsing of {type.String} types aren't supported yet."),
};
return prop;
@ -40,33 +40,33 @@ namespace PakReader.Parsers.PropertyTagData
internal static object ReadAsValue(PackageReader reader, FPropertyTag tag, FName type, ReadType readType)
{
var prop = type.String switch
object prop = type.String switch
{
"ByteProperty" => new ByteProperty(reader, tag, readType).Value,
"ByteProperty" => new ByteProperty(reader, readType).Value,
"BoolProperty" => new BoolProperty(reader, tag, readType).Value,
"IntProperty" => new IntProperty(reader, tag).Value,
"FloatProperty" => new FloatProperty(reader, tag).Value,
"ObjectProperty" => new ObjectProperty(reader, tag).Value,
"NameProperty" => new NameProperty(reader, tag).Value,
"DelegateProperty" => new DelegateProperty(reader, tag),
"DoubleProperty" => new DoubleProperty(reader, tag).Value,
"IntProperty" => new IntProperty(reader).Value,
"FloatProperty" => new FloatProperty(reader).Value,
"ObjectProperty" => new ObjectProperty(reader).Value,
"NameProperty" => new NameProperty(reader).Value,
"DelegateProperty" => new DelegateProperty(reader),
"DoubleProperty" => new DoubleProperty(reader).Value,
"ArrayProperty" => new ArrayProperty(reader, tag).Value,
"StructProperty" => new StructProperty(reader, tag).Value,
"StrProperty" => new StrProperty(reader, tag).Value,
"TextProperty" => new TextProperty(reader, tag).Value,
"InterfaceProperty" => new InterfaceProperty(reader, tag).Value,
"StrProperty" => new StrProperty(reader).Value,
"TextProperty" => new TextProperty(reader).Value,
"InterfaceProperty" => new InterfaceProperty(reader).Value,
"MulticastDelegateProperty" => new MulticastDelegateProperty(reader, tag).Value,
"LazyObjectProperty" => new LazyObjectProperty(reader, tag).Value,
"SoftObjectProperty" => new SoftObjectProperty(reader, tag, readType).Value,
"UInt64Property" => new UInt64Property(reader, tag).Value,
"UInt32Property" => new UInt32Property(reader, tag).Value,
"UInt16Property" => new UInt16Property(reader, tag).Value,
"Int64Property" => new Int64Property(reader, tag).Value,
"Int16Property" => new Int16Property(reader, tag).Value,
"Int8Property" => new Int8Property(reader, tag).Value,
"SoftObjectProperty" => new SoftObjectProperty(reader, readType).Value,
"UInt64Property" => new UInt64Property(reader).Value,
"UInt32Property" => new UInt32Property(reader).Value,
"UInt16Property" => new UInt16Property(reader).Value,
"Int64Property" => new Int64Property(reader).Value,
"Int16Property" => new Int16Property(reader).Value,
"Int8Property" => new Int8Property(reader).Value,
"MapProperty" => new MapProperty(reader, tag).Value,
"SetProperty" => new SetProperty(reader, tag).Value,
"EnumProperty" => new EnumProperty(reader, tag).Value,
"EnumProperty" => new EnumProperty(reader).Value,
_ => null, //throw new NotImplementedException($"Parsing of {type.String} types aren't supported yet."),
};
return prop;

View File

@ -1,11 +1,10 @@
using System;
using PakReader.Parsers.Objects;
namespace PakReader.Parsers.PropertyTagData
{
public sealed class ByteProperty : BaseProperty<byte>
{
internal ByteProperty(PackageReader reader, FPropertyTag tag, ReadType readType)
internal ByteProperty(PackageReader reader, ReadType readType)
{
Position = reader.Position;
Value = readType switch

View File

@ -1,4 +1,5 @@
using PakReader.Parsers.Objects;
using System.Collections.Generic;
namespace PakReader.Parsers.PropertyTagData
{
@ -7,10 +8,12 @@ namespace PakReader.Parsers.PropertyTagData
public int Object;
public FName Name;
internal DelegateProperty(PackageReader reader, FPropertyTag tag)
internal DelegateProperty(PackageReader reader)
{
Object = reader.ReadInt32();
Name = reader.ReadFName();
}
public Dictionary<string, object> GetValue() => new Dictionary<string, object> { ["Object"] = Object, ["Name"] = Name.String };
}
}

View File

@ -1,10 +1,8 @@
using PakReader.Parsers.Objects;
namespace PakReader.Parsers.PropertyTagData
namespace PakReader.Parsers.PropertyTagData
{
public sealed class DoubleProperty : BaseProperty<double>
{
internal DoubleProperty(PackageReader reader, FPropertyTag tag)
internal DoubleProperty(PackageReader reader)
{
Position = reader.Position;
Value = reader.ReadDouble();

View File

@ -4,7 +4,7 @@ namespace PakReader.Parsers.PropertyTagData
{
public sealed class EnumProperty : BaseProperty<FName>
{
internal EnumProperty(PackageReader reader, FPropertyTag tag)
internal EnumProperty(PackageReader reader)
{
Position = reader.Position;
Value = reader.ReadFName();

View File

@ -1,10 +1,8 @@
using PakReader.Parsers.Objects;
namespace PakReader.Parsers.PropertyTagData
namespace PakReader.Parsers.PropertyTagData
{
public sealed class FloatProperty : BaseProperty<float>
{
internal FloatProperty(PackageReader reader, FPropertyTag tag)
internal FloatProperty(PackageReader reader)
{
Position = reader.Position;
Value = reader.ReadFloat();

View File

@ -1,10 +1,8 @@
using PakReader.Parsers.Objects;
namespace PakReader.Parsers.PropertyTagData
namespace PakReader.Parsers.PropertyTagData
{
public sealed class Int16Property : BaseProperty<short>
{
internal Int16Property(PackageReader reader, FPropertyTag tag)
internal Int16Property(PackageReader reader)
{
Position = reader.Position;
Value = reader.ReadInt16();

View File

@ -1,10 +1,8 @@
using PakReader.Parsers.Objects;
namespace PakReader.Parsers.PropertyTagData
namespace PakReader.Parsers.PropertyTagData
{
public sealed class Int64Property : BaseProperty<long>
{
internal Int64Property(PackageReader reader, FPropertyTag tag)
internal Int64Property(PackageReader reader)
{
Position = reader.Position;
Value = reader.ReadInt64();

View File

@ -1,10 +1,8 @@
using PakReader.Parsers.Objects;
namespace PakReader.Parsers.PropertyTagData
namespace PakReader.Parsers.PropertyTagData
{
public sealed class Int8Property : BaseProperty<byte>
{
internal Int8Property(PackageReader reader, FPropertyTag tag)
internal Int8Property(PackageReader reader)
{
Position = reader.Position;
Value = reader.ReadByte();

View File

@ -1,10 +1,8 @@
using PakReader.Parsers.Objects;
namespace PakReader.Parsers.PropertyTagData
namespace PakReader.Parsers.PropertyTagData
{
public sealed class IntProperty : BaseProperty<int>
{
internal IntProperty(PackageReader reader, FPropertyTag tag)
internal IntProperty(PackageReader reader)
{
Position = reader.Position;
Value = reader.ReadInt32();

View File

@ -1,11 +1,9 @@
using PakReader.Parsers.Objects;
namespace PakReader.Parsers.PropertyTagData
namespace PakReader.Parsers.PropertyTagData
{
public sealed class InterfaceProperty : BaseProperty<uint>
{
// Value is ObjectRef
internal InterfaceProperty(PackageReader reader, FPropertyTag tag)
internal InterfaceProperty(PackageReader reader)
{
Position = reader.Position;
Value = reader.ReadUInt32();

View File

@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using PakReader.Parsers.Objects;
@ -21,7 +21,7 @@ namespace PakReader.Parsers.PropertyTagData
var dict = new Dictionary<object, object>(NumEntries);
for (int i = 0; i < NumEntries; i++)
{
dict[ReadAsValue(reader, tag, tag.InnerType, ReadType.MAP)] = BaseProperty.ReadAsObject(reader, tag, tag.ValueType, ReadType.MAP);
dict[ReadAsValue(reader, tag, tag.ValueType, ReadType.MAP)] = ReadAsObject(reader, tag, tag.ValueType, ReadType.MAP);
}
Value = dict;
}
@ -29,37 +29,35 @@ namespace PakReader.Parsers.PropertyTagData
public Dictionary<object, object> GetValue()
{
var ret = new Dictionary<object, object>(Value.Count);
foreach (KeyValuePair<object, object> KvP in Value)
foreach (var (key, value) in Value)
{
if (KvP.Value == null)
ret[KvP.Key] = null;
else
ret[KvP.Key] = KvP.Value.GetType().Name switch
{
"ByteProperty" => ((ByteProperty)KvP.Value).GetValue(),
"BoolProperty" => ((BoolProperty)KvP.Value).GetValue(),
"IntProperty" => ((IntProperty)KvP.Value).GetValue(),
"FloatProperty" => ((FloatProperty)KvP.Value).GetValue(),
"ObjectProperty" => ((ObjectProperty)KvP.Value).GetValue(),
"NameProperty" => ((NameProperty)KvP.Value).GetValue(),
"DoubleProperty" => ((DoubleProperty)KvP.Value).GetValue(),
"ArrayProperty" => ((ArrayProperty)KvP.Value).GetValue(),
"StructProperty" => ((StructProperty)KvP.Value).GetValue(),
"StrProperty" => ((StrProperty)KvP.Value).GetValue(),
"TextProperty" => ((TextProperty)KvP.Value).GetValue(),
"InterfaceProperty" => ((InterfaceProperty)KvP.Value).GetValue(),
"SoftObjectProperty" => ((SoftObjectProperty)KvP.Value).GetValue(),
"UInt64Property" => ((UInt64Property)KvP.Value).GetValue(),
"UInt32Property" => ((UInt32Property)KvP.Value).GetValue(),
"UInt16Property" => ((UInt16Property)KvP.Value).GetValue(),
"Int64Property" => ((Int64Property)KvP.Value).GetValue(),
"Int16Property" => ((Int16Property)KvP.Value).GetValue(),
"Int8Property" => ((Int8Property)KvP.Value).GetValue(),
"MapProperty" => ((MapProperty)KvP.Value).GetValue(),
"SetProperty" => ((SetProperty)KvP.Value).GetValue(),
"EnumProperty" => ((EnumProperty)KvP.Value).GetValue(),
_ => KvP.Value,
};
ret[key] = value switch
{
ByteProperty byteProperty => byteProperty.GetValue(),
BoolProperty boolProperty => boolProperty.GetValue(),
IntProperty intProperty => intProperty.GetValue(),
FloatProperty floatProperty => floatProperty.GetValue(),
ObjectProperty objectProperty => objectProperty.GetValue(),
NameProperty nameProperty => nameProperty.GetValue(),
DelegateProperty delegateProperty => delegateProperty.GetValue(),
DoubleProperty doubleProperty => doubleProperty.GetValue(),
ArrayProperty arrayProperty => arrayProperty.GetValue(),
StructProperty structProperty => structProperty.GetValue(),
StrProperty strProperty => strProperty.GetValue(),
TextProperty textProperty => textProperty.GetValue(),
InterfaceProperty interfaceProperty => interfaceProperty.GetValue(),
SoftObjectProperty softObjectProperty => softObjectProperty.GetValue(),
UInt64Property uInt64Property => uInt64Property.GetValue(),
UInt32Property uInt32Property => uInt32Property.GetValue(),
UInt16Property uInt16Property => uInt16Property.GetValue(),
Int64Property int64Property => int64Property.GetValue(),
Int16Property int16Property => int16Property.GetValue(),
Int8Property int8Property => int8Property.GetValue(),
MapProperty mapProperty => mapProperty.GetValue(),
SetProperty setProperty => setProperty.GetValue(),
EnumProperty enumProperty => enumProperty.GetValue(),
_ => value,
};
}
return ret;
}

View File

@ -4,7 +4,7 @@ namespace PakReader.Parsers.PropertyTagData
{
public sealed class NameProperty : BaseProperty<FName>
{
internal NameProperty(PackageReader reader, FPropertyTag tag)
internal NameProperty(PackageReader reader)
{
Position = reader.Position;
Value = reader.ReadFName();

View File

@ -1,11 +1,10 @@
using PakReader.Parsers.Objects;
using System.Collections.Generic;
namespace PakReader.Parsers.PropertyTagData
{
public sealed class ObjectProperty : BaseProperty<FPackageIndex>
{
internal ObjectProperty(PackageReader reader, FPropertyTag tag)
internal ObjectProperty(PackageReader reader)
{
Position = reader.Position;
Value = new FPackageIndex(reader);

View File

@ -1,4 +1,4 @@
using System;
using System;
using PakReader.Parsers.Objects;
namespace PakReader.Parsers.PropertyTagData
@ -20,7 +20,7 @@ namespace PakReader.Parsers.PropertyTagData
Value = new object[NumEntries];
for (int i = 0; i < NumEntries; i++)
{
Value[i] = BaseProperty.ReadAsObject(reader, tag, tag.InnerType, ReadType.ARRAY);
Value[i] = ReadAsObject(reader, tag, tag.InnerType, ReadType.ARRAY);
}
}
@ -29,35 +29,33 @@ namespace PakReader.Parsers.PropertyTagData
var ret = new object[Value.Length];
for (int i = 0; i < ret.Length; i++)
{
if (Value[i] == null)
ret[i] = null;
else
ret[i] = ((BaseProperty)Value[i]).GetType().Name switch
{
"ByteProperty" => ((ByteProperty)Value[i]).GetValue(),
"BoolProperty" => ((BoolProperty)Value[i]).GetValue(),
"IntProperty" => ((IntProperty)Value[i]).GetValue(),
"FloatProperty" => ((FloatProperty)Value[i]).GetValue(),
"ObjectProperty" => ((ObjectProperty)Value[i]).GetValue(),
"NameProperty" => ((NameProperty)Value[i]).GetValue(),
"DoubleProperty" => ((DoubleProperty)Value[i]).GetValue(),
"ArrayProperty" => ((ArrayProperty)Value[i]).GetValue(),
"StructProperty" => ((StructProperty)Value[i]).GetValue(),
"StrProperty" => ((StrProperty)Value[i]).GetValue(),
"TextProperty" => ((TextProperty)Value[i]).GetValue(),
"InterfaceProperty" => ((InterfaceProperty)Value[i]).GetValue(),
"SoftObjectProperty" => ((SoftObjectProperty)Value[i]).GetValue(),
"UInt64Property" => ((UInt64Property)Value[i]).GetValue(),
"UInt32Property" => ((UInt32Property)Value[i]).GetValue(),
"UInt16Property" => ((UInt16Property)Value[i]).GetValue(),
"Int64Property" => ((Int64Property)Value[i]).GetValue(),
"Int16Property" => ((Int16Property)Value[i]).GetValue(),
"Int8Property" => ((Int8Property)Value[i]).GetValue(),
"MapProperty" => ((MapProperty)Value[i]).GetValue(),
"SetProperty" => ((SetProperty)Value[i]).GetValue(),
"EnumProperty" => ((EnumProperty)Value[i]).GetValue(),
_ => Value[i],
};
ret[i] = Value[i] switch
{
ByteProperty byteProperty => byteProperty.GetValue(),
BoolProperty boolProperty => boolProperty.GetValue(),
IntProperty intProperty => intProperty.GetValue(),
FloatProperty floatProperty => floatProperty.GetValue(),
ObjectProperty objectProperty => objectProperty.GetValue(),
NameProperty nameProperty => nameProperty.GetValue(),
DelegateProperty delegateProperty => delegateProperty.GetValue(),
DoubleProperty doubleProperty => doubleProperty.GetValue(),
ArrayProperty arrayProperty => arrayProperty.GetValue(),
StructProperty structProperty => structProperty.GetValue(),
StrProperty strProperty => strProperty.GetValue(),
TextProperty textProperty => textProperty.GetValue(),
InterfaceProperty interfaceProperty => interfaceProperty.GetValue(),
SoftObjectProperty softObjectProperty => softObjectProperty.GetValue(),
UInt64Property uInt64Property => uInt64Property.GetValue(),
UInt32Property uInt32Property => uInt32Property.GetValue(),
UInt16Property uInt16Property => uInt16Property.GetValue(),
Int64Property int64Property => int64Property.GetValue(),
Int16Property int16Property => int16Property.GetValue(),
Int8Property int8Property => int8Property.GetValue(),
MapProperty mapProperty => mapProperty.GetValue(),
SetProperty setProperty => setProperty.GetValue(),
EnumProperty enumProperty => enumProperty.GetValue(),
_ => Value[i],
};
}
return ret;
}

View File

@ -1,10 +1,11 @@
using PakReader.Parsers.Objects;
using System.Collections.Generic;
namespace PakReader.Parsers.PropertyTagData
{
public sealed class SoftObjectProperty : BaseProperty<FSoftObjectPath>
{
internal SoftObjectProperty(PackageReader reader, FPropertyTag tag, ReadType readType)
internal SoftObjectProperty(PackageReader reader, ReadType readType)
{
Position = reader.Position;
Value = new FSoftObjectPath(reader);
@ -12,6 +13,6 @@ namespace PakReader.Parsers.PropertyTagData
reader.Position += 16 - (reader.Position - Position); // skip ahead, putting the total bytes read to 16
}
public FSoftObjectPath GetValue() => Value;
public Dictionary<string, string> GetValue() => Value.GetValue();
}
}

View File

@ -1,10 +1,8 @@
using PakReader.Parsers.Objects;
namespace PakReader.Parsers.PropertyTagData
namespace PakReader.Parsers.PropertyTagData
{
public sealed class StrProperty : BaseProperty<string>
{
internal StrProperty(PackageReader reader, FPropertyTag tag)
internal StrProperty(PackageReader reader)
{
Position = reader.Position;
Value = reader.ReadFString();

View File

@ -1,6 +1,5 @@
using PakReader.Parsers.Class;
using PakReader.Parsers.Class;
using PakReader.Parsers.Objects;
using System.Collections.Generic;
namespace PakReader.Parsers.PropertyTagData
{
@ -14,57 +13,19 @@ namespace PakReader.Parsers.PropertyTagData
public object GetValue()
{
if (Value is UObject obj)
return Value switch
{
var ret = new Dictionary<string, object>(obj.Count);
foreach (KeyValuePair<string, object> KvP in obj)
{
if (KvP.Value == null)
ret[KvP.Key] = null;
else
ret[KvP.Key] = KvP.Value.GetType().Name switch
{
"ByteProperty" => ((ByteProperty)KvP.Value).GetValue(),
"BoolProperty" => ((BoolProperty)KvP.Value).GetValue(),
"IntProperty" => ((IntProperty)KvP.Value).GetValue(),
"FloatProperty" => ((FloatProperty)KvP.Value).GetValue(),
"ObjectProperty" => ((ObjectProperty)KvP.Value).GetValue(),
"NameProperty" => ((NameProperty)KvP.Value).GetValue(),
"DoubleProperty" => ((DoubleProperty)KvP.Value).GetValue(),
"ArrayProperty" => ((ArrayProperty)KvP.Value).GetValue(),
"StructProperty" => ((StructProperty)KvP.Value).GetValue(),
"StrProperty" => ((StrProperty)KvP.Value).GetValue(),
"TextProperty" => ((TextProperty)KvP.Value).GetValue(),
"InterfaceProperty" => ((InterfaceProperty)KvP.Value).GetValue(),
"SoftObjectProperty" => ((SoftObjectProperty)KvP.Value).GetValue(),
"UInt64Property" => ((UInt64Property)KvP.Value).GetValue(),
"UInt32Property" => ((UInt32Property)KvP.Value).GetValue(),
"UInt16Property" => ((UInt16Property)KvP.Value).GetValue(),
"Int64Property" => ((Int64Property)KvP.Value).GetValue(),
"Int16Property" => ((Int16Property)KvP.Value).GetValue(),
"Int8Property" => ((Int8Property)KvP.Value).GetValue(),
"MapProperty" => ((MapProperty)KvP.Value).GetValue(),
"SetProperty" => ((SetProperty)KvP.Value).GetValue(),
"EnumProperty" => ((EnumProperty)KvP.Value).GetValue(),
_ => KvP.Value,
};
}
return ret;
}
else if (Value is FGameplayTagContainer gTags)
{
var ret = new string[gTags.GameplayTags.Length];
for (int i = 0; i < ret.Length; i++)
{
ret[i] = gTags.GameplayTags[i].String;
}
return ret;
}
else if (Value is FGuid guid)
{
return guid.Hex;
}
return Value;
UObject uObject => uObject.GetJsonDict(),
FAssetData fAssetData => fAssetData.GetValue(),
FAssetDataTagMapSharedView fAssetDataTagMapSharedView => fAssetDataTagMapSharedView.Map,
FAssetIdentifier fAssetIdentifier => fAssetIdentifier.GetValue(),
FAssetPackageData fAssetPackageData => fAssetPackageData.GetValue(),
FGameplayTagContainer fGameplayTagContainer => fGameplayTagContainer.GetValue(),
FSoftObjectPath fSoftObjectPath => fSoftObjectPath.GetValue(),
FDateTime fDateTime => fDateTime.Ticks,
FGuid fGuid => fGuid.Hex,
_ => Value
};
}
}
}

View File

@ -4,12 +4,12 @@ namespace PakReader.Parsers.PropertyTagData
{
public sealed class TextProperty : BaseProperty<FText>
{
internal TextProperty(PackageReader reader, FPropertyTag tag)
internal TextProperty(PackageReader reader)
{
Position = reader.Position;
Value = new FText(reader);
}
public FText GetValue() => Value;
public object GetValue() => Value.GetValue();
}
}

View File

@ -1,10 +1,8 @@
using PakReader.Parsers.Objects;
namespace PakReader.Parsers.PropertyTagData
namespace PakReader.Parsers.PropertyTagData
{
public sealed class UInt16Property : BaseProperty<ushort>
{
internal UInt16Property(PackageReader reader, FPropertyTag tag)
internal UInt16Property(PackageReader reader)
{
Position = reader.Position;
Value = reader.ReadUInt16();

View File

@ -1,10 +1,8 @@
using PakReader.Parsers.Objects;
namespace PakReader.Parsers.PropertyTagData
namespace PakReader.Parsers.PropertyTagData
{
public sealed class UInt32Property : BaseProperty<uint>
{
internal UInt32Property(PackageReader reader, FPropertyTag tag)
internal UInt32Property(PackageReader reader)
{
Position = reader.Position;
Value = reader.ReadUInt32();

View File

@ -1,10 +1,8 @@
using PakReader.Parsers.Objects;
namespace PakReader.Parsers.PropertyTagData
namespace PakReader.Parsers.PropertyTagData
{
public sealed class UInt64Property : BaseProperty<ulong>
{
internal UInt64Property(PackageReader reader, FPropertyTag tag)
internal UInt64Property(PackageReader reader)
{
Position = reader.Position;
Value = reader.ReadUInt64();

View File

@ -109,15 +109,6 @@ namespace FModel.Properties {
}
}
/// <summary>
/// Recherche une chaîne localisée semblable à Add Separator.
/// </summary>
public static string AddSeparator {
get {
return ResourceManager.GetString("AddSeparator", resourceCulture);
}
}
/// <summary>
/// Recherche une chaîne localisée semblable à AES.
/// </summary>
@ -248,15 +239,6 @@ namespace FModel.Properties {
}
}
/// <summary>
/// Recherche une chaîne localisée semblable à Audio.
/// </summary>
public static string Audio {
get {
return ResourceManager.GetString("Audio", resourceCulture);
}
}
/// <summary>
/// Recherche une chaîne localisée semblable à Audio Devices.
/// </summary>
@ -339,15 +321,6 @@ namespace FModel.Properties {
}
}
/// <summary>
/// Recherche une chaîne localisée semblable à BenBot API.
/// </summary>
public static string BenBotApi {
get {
return ResourceManager.GetString("BenBotApi", resourceCulture);
}
}
/// <summary>
/// Recherche une ressource localisée de type System.Drawing.Icon semblable à (Icône).
/// </summary>
@ -695,15 +668,6 @@ namespace FModel.Properties {
}
}
/// <summary>
/// Recherche une chaîne localisée semblable à Difference.
/// </summary>
public static string Difference {
get {
return ResourceManager.GetString("Difference", resourceCulture);
}
}
/// <summary>
/// Recherche une chaîne localisée semblable à Directories.
/// </summary>
@ -947,15 +911,6 @@ namespace FModel.Properties {
}
}
/// <summary>
/// Recherche une chaîne localisée semblable à Exit.
/// </summary>
public static string Exit {
get {
return ResourceManager.GetString("Exit", resourceCulture);
}
}
/// <summary>
/// Recherche une chaîne localisée semblable à Export.
/// </summary>
@ -965,15 +920,6 @@ namespace FModel.Properties {
}
}
/// <summary>
/// Recherche une chaîne localisée semblable à Export Directory.
/// </summary>
public static string ExportDirectory {
get {
return ResourceManager.GetString("ExportDirectory", resourceCulture);
}
}
/// <summary>
/// Recherche une chaîne localisée semblable à Extract.
/// </summary>
@ -983,15 +929,6 @@ namespace FModel.Properties {
}
}
/// <summary>
/// Recherche une chaîne localisée semblable à Extract Directory.
/// </summary>
public static string ExtractDirectory {
get {
return ResourceManager.GetString("ExtractDirectory", resourceCulture);
}
}
/// <summary>
/// Recherche une chaîne localisée semblable à Extraction.
/// </summary>
@ -1235,24 +1172,6 @@ namespace FModel.Properties {
}
}
/// <summary>
/// Recherche une chaîne localisée semblable à The selected language will be the one used for icons creation.
/// </summary>
public static string FyiDetails {
get {
return ResourceManager.GetString("FyiDetails", resourceCulture);
}
}
/// <summary>
/// Recherche une chaîne localisée semblable à FYI:.
/// </summary>
public static string FyiTitle {
get {
return ResourceManager.GetString("FyiTitle", resourceCulture);
}
}
/// <summary>
/// Recherche une ressource localisée de type System.Drawing.Bitmap.
/// </summary>
@ -1723,15 +1642,6 @@ namespace FModel.Properties {
}
}
/// <summary>
/// Recherche une chaîne localisée semblable à Media.
/// </summary>
public static string Media {
get {
return ResourceManager.GetString("Media", resourceCulture);
}
}
/// <summary>
/// Recherche une chaîne localisée semblable à Minimalist.
/// </summary>
@ -1975,15 +1885,6 @@ namespace FModel.Properties {
}
}
/// <summary>
/// Recherche une chaîne localisée semblable à Fortnite PAK files auto-detected.
/// </summary>
public static string PakFilesAutoDetected {
get {
return ResourceManager.GetString("PakFilesAutoDetected", resourceCulture);
}
}
/// <summary>
/// Recherche une chaîne localisée semblable à Parsing of {0} types isn&apos;t supported yet..
/// </summary>
@ -2097,15 +1998,6 @@ namespace FModel.Properties {
}
}
/// <summary>
/// Recherche une chaîne localisée semblable à Popup.
/// </summary>
public static string Popup {
get {
return ResourceManager.GetString("Popup", resourceCulture);
}
}
/// <summary>
/// Recherche une chaîne localisée semblable à Portuguese (Brazil).
/// </summary>
@ -2171,15 +2063,6 @@ namespace FModel.Properties {
}
}
/// <summary>
/// Recherche une chaîne localisée semblable à Rate Limit Exceeded.
/// </summary>
public static string RateLimited {
get {
return ResourceManager.GetString("RateLimited", resourceCulture);
}
}
/// <summary>
/// Recherche une ressource localisée de type System.Drawing.Bitmap.
/// </summary>
@ -2208,15 +2091,6 @@ namespace FModel.Properties {
}
}
/// <summary>
/// Recherche une chaîne localisée semblable à Remember game.
/// </summary>
public static string RememberGame {
get {
return ResourceManager.GetString("RememberGame", resourceCulture);
}
}
/// <summary>
/// Recherche une chaîne localisée semblable à Remove.
/// </summary>
@ -2307,15 +2181,6 @@ namespace FModel.Properties {
}
}
/// <summary>
/// Recherche une chaîne localisée semblable à Save Directory.
/// </summary>
public static string SaveDirectory {
get {
return ResourceManager.GetString("SaveDirectory", resourceCulture);
}
}
/// <summary>
/// Recherche une chaîne localisée semblable à Save Image.
/// </summary>
@ -2683,12 +2548,9 @@ namespace FModel.Properties {
/// <summary>
/// Recherche une chaîne localisée semblable à • EN: Asval#2291 • FR: Asval#2291
///• DE: FunGames#6822 • IT: Angry Cat#5581
///• DE: FunGames#6822 • IT: arianaglande#5581
///• ES: Maiky.M#9879 • AR: PsychoPast#0001
///• JA: FNJPNews#7820 • KO:
///• PL: • PT-BR:
///• RU: Seawod#4311 • TR:
///• ZH-CN: • ZH-Hant:.
///• JA: FNJPNews#7820 • RU: Seawod#4311.
/// </summary>
public static string TranslatorsFDetails {
get {
@ -2714,15 +2576,6 @@ namespace FModel.Properties {
}
}
/// <summary>
/// Recherche une chaîne localisée semblable à Update.
/// </summary>
public static string Update {
get {
return ResourceManager.GetString("Update", resourceCulture);
}
}
/// <summary>
/// Recherche une chaîne localisée semblable à Update Available.
/// </summary>
@ -2919,7 +2772,7 @@ namespace FModel.Properties {
}
/// <summary>
/// Recherche une chaîne localisée semblable à With Position.
/// Recherche une chaîne localisée semblable à Position / Value.
/// </summary>
public static string WithPosition {
get {

View File

@ -139,9 +139,6 @@ It's now the most used free software to leak on Fortnite.</value>
<data name="AddDirectory" xml:space="preserve">
<value>أضف المجلد</value>
</data>
<data name="AddSeparator" xml:space="preserve">
<value>إضافة فاصل</value>
</data>
<data name="AES" xml:space="preserve">
<value>AES</value>
</data>
@ -172,9 +169,6 @@ It's now the most used free software to leak on Fortnite.</value>
<data name="Assets" xml:space="preserve">
<value>Assets</value>
</data>
<data name="Audio" xml:space="preserve">
<value>صوت</value>
</data>
<data name="AudioDevices" xml:space="preserve">
<value>أجهزة الصوت</value>
</data>
@ -199,9 +193,6 @@ It's now the most used free software to leak on Fortnite.</value>
<data name="Banner" xml:space="preserve">
<value>شعار</value>
</data>
<data name="BenBotApi" xml:space="preserve">
<value>BenBot API</value>
</data>
<data name="BugsReport" xml:space="preserve">
<value>Bugs Report</value>
</data>
@ -274,9 +265,6 @@ It's now the most used free software to leak on Fortnite.</value>
<data name="Design" xml:space="preserve">
<value>التصميم</value>
</data>
<data name="Difference" xml:space="preserve">
<value>فرق</value>
</data>
<data name="Directories" xml:space="preserve">
<value>المجلدات</value>
</data>
@ -331,18 +319,12 @@ It's now the most used free software to leak on Fortnite.</value>
<data name="Error" xml:space="preserve">
<value>خطأ</value>
</data>
<data name="Exit" xml:space="preserve">
<value>خروج</value>
</data>
<data name="Export" xml:space="preserve">
<value>تصدير</value>
</data>
<data name="Extract" xml:space="preserve">
<value>استخراج</value>
</data>
<data name="ExtractDirectory" xml:space="preserve">
<value>استخراج المجلد</value>
</data>
<data name="Extraction" xml:space="preserve">
<value>استخلاص</value>
</data>
@ -394,12 +376,6 @@ It's now the most used free software to leak on Fortnite.</value>
<data name="French" xml:space="preserve">
<value>اللغة الفرنسية</value>
</data>
<data name="FyiDetails" xml:space="preserve">
<value>ستكون اللغة المحددة هي اللغة المستخدمة لإنشاء الرموز</value>
</data>
<data name="FyiTitle" xml:space="preserve">
<value>لمعلوماتك</value>
</data>
<data name="Games" xml:space="preserve">
<value>ألعاب</value>
</data>
@ -517,9 +493,6 @@ It's now the most used free software to leak on Fortnite.</value>
<data name="MB" xml:space="preserve">
<value>MB</value>
</data>
<data name="Media" xml:space="preserve">
<value>وسائل الإعلام</value>
</data>
<data name="Minimalist" xml:space="preserve">
<value>الحد الأدنى</value>
</data>
@ -595,9 +568,6 @@ It's now the most used free software to leak on Fortnite.</value>
<data name="PakFiles" xml:space="preserve">
<value>PAK Files</value>
</data>
<data name="PakFilesAutoDetected" xml:space="preserve">
<value>Fortnite PAK files auto-detected</value>
</data>
<data name="ParsingNotSupported" xml:space="preserve">
<value>Parsing of {0} types isn't supported yet.</value>
</data>
@ -619,9 +589,6 @@ It's now the most used free software to leak on Fortnite.</value>
<data name="Polish" xml:space="preserve">
<value>اللغة البولندية</value>
</data>
<data name="Popup" xml:space="preserve">
<value>Popup</value>
</data>
<data name="PortugueseBrazil" xml:space="preserve">
<value>اللغة البرتغالية (البرازيل)</value>
</data>
@ -637,18 +604,12 @@ It's now the most used free software to leak on Fortnite.</value>
<data name="Rarity" xml:space="preserve">
<value>Rarity</value>
</data>
<data name="RateLimited" xml:space="preserve">
<value>Rate Limit Exceeded</value>
</data>
<data name="RegularExpression" xml:space="preserve">
<value>Regular Expression</value>
</data>
<data name="ReloadAesKeysAtLaunch" xml:space="preserve">
<value>إعادة تحميل مفاتيح AES عند الإطلاق</value>
</data>
<data name="RememberGame" xml:space="preserve">
<value>تذكر اللعبة</value>
</data>
<data name="Remove" xml:space="preserve">
<value>إزالة</value>
</data>
@ -760,9 +721,6 @@ It's now the most used free software to leak on Fortnite.</value>
<data name="UnhandledExceptionOccured" xml:space="preserve">
<value>An unhandled exception occurred: {0}</value>
</data>
<data name="Update" xml:space="preserve">
<value>تحديث</value>
</data>
<data name="UpdateAvailable" xml:space="preserve">
<value>تحديث متوفر</value>
</data>
@ -808,9 +766,6 @@ It's now the most used free software to leak on Fortnite.</value>
<data name="UseDiscordRpc" xml:space="preserve">
<value>استخدم Discord RPC</value>
</data>
<data name="SaveDirectory" xml:space="preserve">
<value>احفظ المجلد</value>
</data>
<data name="NoImageToCopy" xml:space="preserve">
<value>لا يوجد حاليا صورة لنسخها</value>
</data>

View File

@ -134,9 +134,6 @@ Jetzt ist es die am häufigsten genutzte freie Software um mit Fortnite zu leake
<data name="AddDirectory" xml:space="preserve">
<value>Ordner hinzufügen</value>
</data>
<data name="AddSeparator" xml:space="preserve">
<value>Trennzeichen hinzufügen</value>
</data>
<data name="AesKey" xml:space="preserve">
<value>AES-Schlüssel</value>
</data>
@ -251,9 +248,6 @@ Jetzt ist es die am häufigsten genutzte freie Software um mit Fortnite zu leake
<data name="Design" xml:space="preserve">
<value>Design</value>
</data>
<data name="Difference" xml:space="preserve">
<value>Unterschied</value>
</data>
<data name="Directories" xml:space="preserve">
<value>Ordner</value>
</data>
@ -307,18 +301,12 @@ Jetzt ist es die am häufigsten genutzte freie Software um mit Fortnite zu leake
<data name="Error" xml:space="preserve">
<value>Fehler</value>
</data>
<data name="Exit" xml:space="preserve">
<value>Schließen</value>
</data>
<data name="Export" xml:space="preserve">
<value>Exportieren</value>
</data>
<data name="Extract" xml:space="preserve">
<value>Extrahieren</value>
</data>
<data name="ExtractDirectory" xml:space="preserve">
<value>Ordner extrahieren</value>
</data>
<data name="Extraction" xml:space="preserve">
<value>Ausgabe</value>
</data>
@ -371,12 +359,6 @@ Jetzt ist es die am häufigsten genutzte freie Software um mit Fortnite zu leake
<data name="French" xml:space="preserve">
<value>Französisch</value>
</data>
<data name="FyiDetails" xml:space="preserve">
<value>Die ausgewählte Sprache wird zur Erstellung von Icons benutzt</value>
</data>
<data name="FyiTitle" xml:space="preserve">
<value>Zur Information:</value>
</data>
<data name="Games" xml:space="preserve">
<value>Spiele</value>
</data>
@ -479,9 +461,6 @@ Jetzt ist es die am häufigsten genutzte freie Software um mit Fortnite zu leake
<value>Ganzes Wort überprüfen</value>
<comment>Find &amp; Replace Window</comment>
</data>
<data name="Media" xml:space="preserve">
<value>Medien</value>
</data>
<data name="Minimalist" xml:space="preserve">
<value>Minimalistisch</value>
<comment>Rarity Design</comment>
@ -548,9 +527,6 @@ Jetzt ist es die am häufigsten genutzte freie Software um mit Fortnite zu leake
<data name="PakFiles" xml:space="preserve">
<value>PAK-Dateien</value>
</data>
<data name="PakFilesAutoDetected" xml:space="preserve">
<value>Fortnite PAK-Dateien wurden automatisch erkannt</value>
</data>
<data name="ParsingNotSupported" xml:space="preserve">
<value>Das Parsen von {0}-Typen wird noch nicht unterstützt</value>
</data>
@ -574,10 +550,6 @@ Jetzt ist es die am häufigsten genutzte freie Software um mit Fortnite zu leake
<data name="Polish" xml:space="preserve">
<value>Polnisch</value>
</data>
<data name="Popup" xml:space="preserve">
<value>Pop-up</value>
<comment>Rarity Design</comment>
</data>
<data name="PortugueseBrazil" xml:space="preserve">
<value>Portugiesisch (Brasilien)</value>
</data>
@ -594,15 +566,9 @@ Jetzt ist es die am häufigsten genutzte freie Software um mit Fortnite zu leake
<data name="Rarity" xml:space="preserve">
<value>Seltenheit</value>
</data>
<data name="RateLimited" xml:space="preserve">
<value>Rate Limit überschritten</value>
</data>
<data name="ReloadAesKeysAtLaunch" xml:space="preserve">
<value>AES-Schlüssel beim Start neuladen</value>
</data>
<data name="RememberGame" xml:space="preserve">
<value>Spiel merken</value>
</data>
<data name="RemoveDirectory" xml:space="preserve">
<value>Ordner entfernen</value>
</data>
@ -719,9 +685,6 @@ Jetzt ist es die am häufigsten genutzte freie Software um mit Fortnite zu leake
<data name="UnhandledExceptionOccured" xml:space="preserve">
<value>Eine nicht behandelte Ausnahme ist aufgetreten: {0}</value>
</data>
<data name="Update" xml:space="preserve">
<value>Aktualisieren</value>
</data>
<data name="UseGameColors" xml:space="preserve">
<value>Verwende Farben aus dem Spiel</value>
</data>
@ -765,9 +728,6 @@ Jetzt ist es die am häufigsten genutzte freie Software um mit Fortnite zu leake
<data name="AES" xml:space="preserve">
<value>AES</value>
</data>
<data name="Audio" xml:space="preserve">
<value>Audio</value>
</data>
<data name="AudioPlayer" xml:space="preserve">
<value>Audio Player</value>
</data>
@ -780,9 +740,6 @@ Jetzt ist es die am häufigsten genutzte freie Software um mit Fortnite zu leake
<data name="Banner" xml:space="preserve">
<value>Banner</value>
</data>
<data name="BenBotApi" xml:space="preserve">
<value>BenBot API</value>
</data>
<data name="DiscordServer" xml:space="preserve">
<value>Discord Server</value>
</data>
@ -843,9 +800,6 @@ Jetzt ist es die am häufigsten genutzte freie Software um mit Fortnite zu leake
<data name="UseDiscordRpc" xml:space="preserve">
<value>Discord RPC benutzen</value>
</data>
<data name="SaveDirectory" xml:space="preserve">
<value>Speicherordner</value>
</data>
<data name="NoImageToCopy" xml:space="preserve">
<value>Es gibt aktuell kein Bild zum kopieren</value>
</data>

View File

@ -137,9 +137,6 @@ Ahora es el software gratuito más utilizado para filtrar en Fortnite.</value>
<data name="AddDirectory" xml:space="preserve">
<value>Añadir directorio</value>
</data>
<data name="AddSeparator" xml:space="preserve">
<value>Añadir separador</value>
</data>
<data name="AES" xml:space="preserve">
<value>AES</value>
<comment>Do not change this</comment>
@ -186,9 +183,6 @@ Ahora es el software gratuito más utilizado para filtrar en Fortnite.</value>
<data name="Assets" xml:space="preserve">
<value>Assets</value>
</data>
<data name="Audio" xml:space="preserve">
<value>Audio</value>
</data>
<data name="AudioDevices" xml:space="preserve">
<value>Dispositivos de Audio</value>
</data>
@ -218,9 +212,6 @@ Ahora es el software gratuito más utilizado para filtrar en Fortnite.</value>
<data name="Banner" xml:space="preserve">
<value>Encabezado</value>
</data>
<data name="BenBotApi" xml:space="preserve">
<value>BenBot API</value>
</data>
<data name="bug" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\bug.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@ -326,9 +317,6 @@ Ahora es el software gratuito más utilizado para filtrar en Fortnite.</value>
<data name="Design" xml:space="preserve">
<value>Diseño</value>
</data>
<data name="Difference" xml:space="preserve">
<value>Diferencia</value>
</data>
<data name="Directories" xml:space="preserve">
<value>Directorios</value>
</data>
@ -403,18 +391,12 @@ Ahora es el software gratuito más utilizado para filtrar en Fortnite.</value>
<data name="Error" xml:space="preserve">
<value>Error</value>
</data>
<data name="Exit" xml:space="preserve">
<value>Salir</value>
</data>
<data name="Export" xml:space="preserve">
<value>Exportar</value>
</data>
<data name="Extract" xml:space="preserve">
<value>Extraer</value>
</data>
<data name="ExtractDirectory" xml:space="preserve">
<value>Extraer directorio</value>
</data>
<data name="Extraction" xml:space="preserve">
<value>Extracción</value>
</data>
@ -497,12 +479,6 @@ Ahora es el software gratuito más utilizado para filtrar en Fortnite.</value>
<data name="French" xml:space="preserve">
<value>Francés</value>
</data>
<data name="FyiDetails" xml:space="preserve">
<value>El idioma selecciona será utilizado para la creación de iconos.</value>
</data>
<data name="FyiTitle" xml:space="preserve">
<value>Para tu información:</value>
</data>
<data name="gamepad_variant" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\gamepad-variant.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@ -659,9 +635,6 @@ Ahora es el software gratuito más utilizado para filtrar en Fortnite.</value>
<value>MB</value>
<comment>MegaByte</comment>
</data>
<data name="Media" xml:space="preserve">
<value>Media</value>
</data>
<data name="Minimalist" xml:space="preserve">
<value>Minimalista</value>
<comment>Rarity Design</comment>
@ -741,9 +714,6 @@ Ahora es el software gratuito más utilizado para filtrar en Fortnite.</value>
<data name="PakFiles" xml:space="preserve">
<value>Archivos PAK</value>
</data>
<data name="PakFilesAutoDetected" xml:space="preserve">
<value>Archivos PAK de Fortnite detectados automáticamente</value>
</data>
<data name="ParsingNotSupported" xml:space="preserve">
<value>El análisis del tipo {0} aún no es soportado.</value>
</data>
@ -782,10 +752,6 @@ Ahora es el software gratuito más utilizado para filtrar en Fortnite.</value>
<data name="Polish" xml:space="preserve">
<value>Polaco</value>
</data>
<data name="Popup" xml:space="preserve">
<value>Ventana emergente</value>
<comment>Rarity Design</comment>
</data>
<data name="PortugueseBrazil" xml:space="preserve">
<value>Portugués (Brasil)</value>
</data>
@ -808,9 +774,6 @@ Ahora es el software gratuito más utilizado para filtrar en Fortnite.</value>
<data name="Rarity" xml:space="preserve">
<value>Rareza</value>
</data>
<data name="RateLimited" xml:space="preserve">
<value>Límite de Consultas Excedido</value>
</data>
<data name="refresh" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\refresh.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@ -821,9 +784,6 @@ Ahora es el software gratuito más utilizado para filtrar en Fortnite.</value>
<data name="ReloadAesKeysAtLaunch" xml:space="preserve">
<value>Recargar Claves AES al iniciar</value>
</data>
<data name="RememberGame" xml:space="preserve">
<value>Recordar juego</value>
</data>
<data name="Remove" xml:space="preserve">
<value>Remover</value>
</data>
@ -988,9 +948,6 @@ Ahora es el software gratuito más utilizado para filtrar en Fortnite.</value>
<data name="UnhandledExceptionOccured" xml:space="preserve">
<value>Ha ocurrido una excepción: {0}</value>
</data>
<data name="Update" xml:space="preserve">
<value>Actualización</value>
</data>
<data name="UseGameColors" xml:space="preserve">
<value>Usar colores del juego</value>
</data>

View File

@ -137,9 +137,6 @@ C'est maintenant le logiciel gratuit le plus utilisé pour leak sur Fortnite.</v
<data name="AddDirectory" xml:space="preserve">
<value>Ajouter un Répertoire</value>
</data>
<data name="AddSeparator" xml:space="preserve">
<value>Ajouter un Séparateur</value>
</data>
<data name="AES" xml:space="preserve">
<value>AES</value>
<comment>Do not change this</comment>
@ -173,9 +170,6 @@ C'est maintenant le logiciel gratuit le plus utilisé pour leak sur Fortnite.</v
<data name="Assets" xml:space="preserve">
<value>Assets</value>
</data>
<data name="Audio" xml:space="preserve">
<value>Audio</value>
</data>
<data name="AudioDevices" xml:space="preserve">
<value>Périphériques Audio</value>
</data>
@ -202,9 +196,6 @@ C'est maintenant le logiciel gratuit le plus utilisé pour leak sur Fortnite.</v
<data name="Banner" xml:space="preserve">
<value>Bannière</value>
</data>
<data name="BenBotApi" xml:space="preserve">
<value>API BenBot</value>
</data>
<data name="BugsReport" xml:space="preserve">
<value>Signaler un Bug</value>
</data>
@ -280,9 +271,6 @@ C'est maintenant le logiciel gratuit le plus utilisé pour leak sur Fortnite.</v
<data name="Design" xml:space="preserve">
<value>Design</value>
</data>
<data name="Difference" xml:space="preserve">
<value>Différence</value>
</data>
<data name="Directories" xml:space="preserve">
<value>Répertoires</value>
</data>
@ -339,18 +327,12 @@ C'est maintenant le logiciel gratuit le plus utilisé pour leak sur Fortnite.</v
<data name="Error" xml:space="preserve">
<value>Erreur</value>
</data>
<data name="Exit" xml:space="preserve">
<value>Sortie</value>
</data>
<data name="Export" xml:space="preserve">
<value>Exporter</value>
</data>
<data name="Extract" xml:space="preserve">
<value>Extraire</value>
</data>
<data name="ExtractDirectory" xml:space="preserve">
<value>Extraire le Répertoire</value>
</data>
<data name="Extraction" xml:space="preserve">
<value>Extraction</value>
</data>
@ -406,12 +388,6 @@ C'est maintenant le logiciel gratuit le plus utilisé pour leak sur Fortnite.</v
<data name="French" xml:space="preserve">
<value>Français</value>
</data>
<data name="FyiDetails" xml:space="preserve">
<value>La langue sélectionnée sera celle utilisée pour la création des icônes</value>
</data>
<data name="FyiTitle" xml:space="preserve">
<value>Pour Information :</value>
</data>
<data name="Games" xml:space="preserve">
<value>Jeux</value>
</data>
@ -535,9 +511,6 @@ C'est maintenant le logiciel gratuit le plus utilisé pour leak sur Fortnite.</v
<value>Mo</value>
<comment>MegaByte</comment>
</data>
<data name="Media" xml:space="preserve">
<value>Média</value>
</data>
<data name="Minimalist" xml:space="preserve">
<value>Minimaliste</value>
<comment>Rarity Design</comment>
@ -617,9 +590,6 @@ C'est maintenant le logiciel gratuit le plus utilisé pour leak sur Fortnite.</v
<data name="PakFiles" xml:space="preserve">
<value>Fichiers PAK</value>
</data>
<data name="PakFilesAutoDetected" xml:space="preserve">
<value>Les fichiers PAK de Fortnite ont été détectés automatiquement</value>
</data>
<data name="ParsingNotSupported" xml:space="preserve">
<value>L'analyse des types {0} n'est pas encore prise en charge.</value>
</data>
@ -643,10 +613,6 @@ C'est maintenant le logiciel gratuit le plus utilisé pour leak sur Fortnite.</v
<data name="Polish" xml:space="preserve">
<value>Polonais</value>
</data>
<data name="Popup" xml:space="preserve">
<value>Contextuel</value>
<comment>Rarity Design</comment>
</data>
<data name="PortugueseBrazil" xml:space="preserve">
<value>Portugais (Brésil)</value>
</data>
@ -663,9 +629,6 @@ C'est maintenant le logiciel gratuit le plus utilisé pour leak sur Fortnite.</v
<data name="Rarity" xml:space="preserve">
<value>Rareté</value>
</data>
<data name="RateLimited" xml:space="preserve">
<value>Limite de Taux Dépassée</value>
</data>
<data name="RegularExpression" xml:space="preserve">
<value>Expression Régulière</value>
<comment>Find &amp; Replace Window</comment>
@ -673,9 +636,6 @@ C'est maintenant le logiciel gratuit le plus utilisé pour leak sur Fortnite.</v
<data name="ReloadAesKeysAtLaunch" xml:space="preserve">
<value>Recharger les clés AES au lancement</value>
</data>
<data name="RememberGame" xml:space="preserve">
<value>Se souvenir du jeu</value>
</data>
<data name="Remove" xml:space="preserve">
<value>Supprimer</value>
</data>
@ -798,9 +758,6 @@ C'est maintenant le logiciel gratuit le plus utilisé pour leak sur Fortnite.</v
<data name="UnhandledExceptionOccured" xml:space="preserve">
<value>Une exception non gérée s'est produite: {0}</value>
</data>
<data name="Update" xml:space="preserve">
<value>Mise à Jour</value>
</data>
<data name="UseGameColors" xml:space="preserve">
<value>Utiliser les couleurs du jeu</value>
</data>
@ -850,9 +807,6 @@ C'est maintenant le logiciel gratuit le plus utilisé pour leak sur Fortnite.</v
<data name="UseDiscordRpc" xml:space="preserve">
<value>Utiliser Discord RPC</value>
</data>
<data name="SaveDirectory" xml:space="preserve">
<value>Sauvegarder le Répertoire</value>
</data>
<data name="CopyImage" xml:space="preserve">
<value>Copier l'Image</value>
</data>
@ -868,7 +822,4 @@ C'est maintenant le logiciel gratuit le plus utilisé pour leak sur Fortnite.</v
<data name="JsonType" xml:space="preserve">
<value>Type de JSON</value>
</data>
<data name="WithPosition" xml:space="preserve">
<value>Avec Position</value>
</data>
</root>

View File

@ -136,9 +136,6 @@ Col tempo sono state aggiunte nuove funzioni e molti altri utenti hanno comincia
<data name="AddDirectory" xml:space="preserve">
<value>Aggiungi Directory</value>
</data>
<data name="AddSeparator" xml:space="preserve">
<value>Aggiungi Separatore</value>
</data>
<data name="AES" xml:space="preserve">
<value>AES</value>
</data>
@ -169,9 +166,6 @@ Col tempo sono state aggiunte nuove funzioni e molti altri utenti hanno comincia
<data name="Assets" xml:space="preserve">
<value>Assets</value>
</data>
<data name="Audio" xml:space="preserve">
<value>Audio</value>
</data>
<data name="AudioDevices" xml:space="preserve">
<value>Periferica Audio</value>
</data>
@ -196,9 +190,6 @@ Col tempo sono state aggiunte nuove funzioni e molti altri utenti hanno comincia
<data name="Banner" xml:space="preserve">
<value>Banner</value>
</data>
<data name="BenBotApi" xml:space="preserve">
<value>BenBot API</value>
</data>
<data name="BugsReport" xml:space="preserve">
<value>Segnala un bug</value>
</data>
@ -268,9 +259,6 @@ Col tempo sono state aggiunte nuove funzioni e molti altri utenti hanno comincia
<data name="Design" xml:space="preserve">
<value>Design</value>
</data>
<data name="Difference" xml:space="preserve">
<value>Differenza</value>
</data>
<data name="Directories" xml:space="preserve">
<value>Directories</value>
</data>
@ -325,18 +313,12 @@ Col tempo sono state aggiunte nuove funzioni e molti altri utenti hanno comincia
<data name="Error" xml:space="preserve">
<value>Errore</value>
</data>
<data name="Exit" xml:space="preserve">
<value>Esci</value>
</data>
<data name="Export" xml:space="preserve">
<value>Esporta</value>
</data>
<data name="Extract" xml:space="preserve">
<value>Estrai</value>
</data>
<data name="ExtractDirectory" xml:space="preserve">
<value>Estrai directory</value>
</data>
<data name="Extraction" xml:space="preserve">
<value>Estrazione</value>
</data>
@ -388,12 +370,6 @@ Col tempo sono state aggiunte nuove funzioni e molti altri utenti hanno comincia
<data name="French" xml:space="preserve">
<value>Francese</value>
</data>
<data name="FyiDetails" xml:space="preserve">
<value>La lingua selezionata è la stessa che sarà utilizzata per la creazione delle icone</value>
</data>
<data name="FyiTitle" xml:space="preserve">
<value>Per tua informazione:</value>
</data>
<data name="Games" xml:space="preserve">
<value>Giochi</value>
</data>
@ -511,9 +487,6 @@ Col tempo sono state aggiunte nuove funzioni e molti altri utenti hanno comincia
<data name="MB" xml:space="preserve">
<value>MB</value>
</data>
<data name="Media" xml:space="preserve">
<value>Media</value>
</data>
<data name="Minimalist" xml:space="preserve">
<value>Minimalista</value>
</data>
@ -589,9 +562,6 @@ Col tempo sono state aggiunte nuove funzioni e molti altri utenti hanno comincia
<data name="PakFiles" xml:space="preserve">
<value>Files PAK</value>
</data>
<data name="PakFilesAutoDetected" xml:space="preserve">
<value>I files PAK di Fortnite saranno automaticamente rilevati</value>
</data>
<data name="ParsingNotSupported" xml:space="preserve">
<value>L'analisi dei tipi {0} non è ancora supportata</value>
</data>
@ -613,9 +583,6 @@ Col tempo sono state aggiunte nuove funzioni e molti altri utenti hanno comincia
<data name="Polish" xml:space="preserve">
<value>Polacco</value>
</data>
<data name="Popup" xml:space="preserve">
<value>Popup</value>
</data>
<data name="PortugueseBrazil" xml:space="preserve">
<value>Portoghese (Brasile)</value>
</data>
@ -631,18 +598,12 @@ Col tempo sono state aggiunte nuove funzioni e molti altri utenti hanno comincia
<data name="Rarity" xml:space="preserve">
<value>Rarità</value>
</data>
<data name="RateLimited" xml:space="preserve">
<value>Limite sorpassato</value>
</data>
<data name="RegularExpression" xml:space="preserve">
<value>Espressione Regolare</value>
</data>
<data name="ReloadAesKeysAtLaunch" xml:space="preserve">
<value>Ricarica le chiavi AES all'avvio</value>
</data>
<data name="RememberGame" xml:space="preserve">
<value>Ricorda gioco</value>
</data>
<data name="Remove" xml:space="preserve">
<value>Rimuovi</value>
</data>
@ -754,9 +715,6 @@ Col tempo sono state aggiunte nuove funzioni e molti altri utenti hanno comincia
<data name="UnhandledExceptionOccured" xml:space="preserve">
<value>Si è verificato un errore non previsto: {0}</value>
</data>
<data name="Update" xml:space="preserve">
<value>Aggiorna</value>
</data>
<data name="UseGameColors" xml:space="preserve">
<value>Usa i colori di gioco</value>
</data>
@ -808,9 +766,6 @@ Col tempo sono state aggiunte nuove funzioni e molti altri utenti hanno comincia
<data name="UseDiscordRpc" xml:space="preserve">
<value>Usa Discord RPC</value>
</data>
<data name="SaveDirectory" xml:space="preserve">
<value>Salva Directory</value>
</data>
<data name="CopyImage" xml:space="preserve">
<value>Copia Immagine</value>
</data>

View File

@ -168,9 +168,6 @@
<data name="French" xml:space="preserve">
<value>フランス語</value>
</data>
<data name="BenBotApi" xml:space="preserve">
<value>BenBot API</value>
</data>
<data name="German" xml:space="preserve">
<value>ドイツ語</value>
</data>
@ -234,9 +231,6 @@
<data name="BugsReport" xml:space="preserve">
<value>不具合を報告</value>
</data>
<data name="Update" xml:space="preserve">
<value>アップデート</value>
</data>
<data name="Korean" xml:space="preserve">
<value>韓国語</value>
</data>
@ -330,9 +324,6 @@
<data name="DownloadError" xml:space="preserve">
<value>{0}のダウンロード中にエラーが発生しました</value>
</data>
<data name="FyiDetails" xml:space="preserve">
<value>選択した言語はアイコンの作成に使用される言語になります</value>
</data>
<data name="Initializing" xml:space="preserve">
<value>初期化中</value>
</data>
@ -345,9 +336,6 @@
<data name="ChallengesThemeCreator" xml:space="preserve">
<value>チャレンジのテーマクリエイター</value>
</data>
<data name="Difference" xml:space="preserve">
<value>違う</value>
</data>
<data name="DynamicKeys" xml:space="preserve">
<value>ダイナミックキー</value>
</data>
@ -505,9 +493,6 @@
<data name="AesNotWorking" xml:space="preserve">
<value>'{0}'は'{1}'では機能しません</value>
</data>
<data name="Audio" xml:space="preserve">
<value>オーディオ</value>
</data>
<data name="Asset" xml:space="preserve">
<value>アセット</value>
</data>
@ -517,9 +502,6 @@
<data name="Games" xml:space="preserve">
<value>ゲーム</value>
</data>
<data name="Media" xml:space="preserve">
<value>メディア</value>
</data>
<data name="Clear" xml:space="preserve">
<value>クリア</value>
</data>
@ -535,9 +517,6 @@
<data name="Scale" xml:space="preserve">
<value>スケール</value>
</data>
<data name="Popup" xml:space="preserve">
<value>ポップアップ</value>
</data>
<data name="ParsingNotSupported" xml:space="preserve">
<value>{0}タイプの解析はまだサポートされていません。</value>
</data>
@ -550,9 +529,6 @@
<data name="Analyzing" xml:space="preserve">
<value>{0}を分析しています</value>
</data>
<data name="AddSeparator" xml:space="preserve">
<value>セパレータを追加</value>
</data>
<data name="AudioPlayer" xml:space="preserve">
<value>オーディオプレイヤー</value>
</data>
@ -571,9 +547,6 @@
<data name="Disabled" xml:space="preserve">
<value>無効</value>
</data>
<data name="RateLimited" xml:space="preserve">
<value>レート制限を超えました</value>
</data>
<data name="Japanese" xml:space="preserve">
<value>日本語</value>
</data>
@ -583,9 +556,6 @@
<data name="CustomBannerNotFound" xml:space="preserve">
<value>ファイルが見つかりません、チャレンジのカスタムテーマは無効です</value>
</data>
<data name="PakFilesAutoDetected" xml:space="preserve">
<value>自動検出されたフォートナイト PAKファイル</value>
</data>
<data name="IconWatermarkNotFound" xml:space="preserve">
<value>ファイルが見つかりません、透かしは無効になっています</value>
</data>
@ -601,9 +571,6 @@
<data name="Secondary" xml:space="preserve">
<value>セカンダリー</value>
</data>
<data name="ExtractDirectory" xml:space="preserve">
<value>ディレクトリを抽出</value>
</data>
<data name="Russian" xml:space="preserve">
<value>ロシア語</value>
</data>
@ -625,9 +592,6 @@
<data name="Changelog" xml:space="preserve">
<value>変更ログ</value>
</data>
<data name="FyiTitle" xml:space="preserve">
<value>ご参考までに:</value>
</data>
<data name="LoadingMode" xml:space="preserve">
<value>読み込みモード</value>
</data>
@ -643,9 +607,6 @@
<data name="Opacity" xml:space="preserve">
<value>不透明度</value>
</data>
<data name="RememberGame" xml:space="preserve">
<value>ゲームを覚える</value>
</data>
<data name="SearchIn" xml:space="preserve">
<value>で検索:</value>
</data>
@ -757,9 +718,6 @@
<data name="Waiting" xml:space="preserve">
<value>待つ</value>
</data>
<data name="Exit" xml:space="preserve">
<value>終了</value>
</data>
<data name="Auto" xml:space="preserve">
<value>自動</value>
</data>

View File

@ -137,9 +137,6 @@ It's now the most used free software to leak on Fortnite.</value>
<data name="AddDirectory" xml:space="preserve">
<value>Add Directory</value>
</data>
<data name="AddSeparator" xml:space="preserve">
<value>Add Separator</value>
</data>
<data name="AES" xml:space="preserve">
<value>AES</value>
<comment>Do not change this</comment>
@ -186,9 +183,6 @@ It's now the most used free software to leak on Fortnite.</value>
<data name="Assets" xml:space="preserve">
<value>Assets</value>
</data>
<data name="Audio" xml:space="preserve">
<value>Audio</value>
</data>
<data name="AudioDevices" xml:space="preserve">
<value>Audio Devices</value>
</data>
@ -218,9 +212,6 @@ It's now the most used free software to leak on Fortnite.</value>
<data name="Banner" xml:space="preserve">
<value>Banner</value>
</data>
<data name="BenBotApi" xml:space="preserve">
<value>BenBot API</value>
</data>
<data name="bug" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\bug.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@ -333,9 +324,6 @@ It's now the most used free software to leak on Fortnite.</value>
<data name="Design" xml:space="preserve">
<value>Design</value>
</data>
<data name="Difference" xml:space="preserve">
<value>Difference</value>
</data>
<data name="Directories" xml:space="preserve">
<value>Directories</value>
</data>
@ -416,18 +404,12 @@ It's now the most used free software to leak on Fortnite.</value>
<data name="Error" xml:space="preserve">
<value>Error</value>
</data>
<data name="Exit" xml:space="preserve">
<value>Exit</value>
</data>
<data name="Export" xml:space="preserve">
<value>Export</value>
</data>
<data name="Extract" xml:space="preserve">
<value>Extract</value>
</data>
<data name="ExtractDirectory" xml:space="preserve">
<value>Extract Directory</value>
</data>
<data name="Extraction" xml:space="preserve">
<value>Extraction</value>
</data>
@ -510,12 +492,6 @@ It's now the most used free software to leak on Fortnite.</value>
<data name="French" xml:space="preserve">
<value>French</value>
</data>
<data name="FyiDetails" xml:space="preserve">
<value>The selected language will be the one used for icons creation</value>
</data>
<data name="FyiTitle" xml:space="preserve">
<value>FYI:</value>
</data>
<data name="gamepad_variant" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\gamepad-variant.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@ -672,9 +648,6 @@ It's now the most used free software to leak on Fortnite.</value>
<value>MB</value>
<comment>MegaByte</comment>
</data>
<data name="Media" xml:space="preserve">
<value>Media</value>
</data>
<data name="Minimalist" xml:space="preserve">
<value>Minimalist</value>
<comment>Rarity Design</comment>
@ -754,9 +727,6 @@ It's now the most used free software to leak on Fortnite.</value>
<data name="PakFiles" xml:space="preserve">
<value>PAK Files</value>
</data>
<data name="PakFilesAutoDetected" xml:space="preserve">
<value>Fortnite PAK files auto-detected</value>
</data>
<data name="ParsingNotSupported" xml:space="preserve">
<value>Parsing of {0} types isn't supported yet.</value>
</data>
@ -795,10 +765,6 @@ It's now the most used free software to leak on Fortnite.</value>
<data name="Polish" xml:space="preserve">
<value>Polish</value>
</data>
<data name="Popup" xml:space="preserve">
<value>Popup</value>
<comment>Rarity Design</comment>
</data>
<data name="PortugueseBrazil" xml:space="preserve">
<value>Portuguese (Brazil)</value>
</data>
@ -821,9 +787,6 @@ It's now the most used free software to leak on Fortnite.</value>
<data name="Rarity" xml:space="preserve">
<value>Rarity</value>
</data>
<data name="RateLimited" xml:space="preserve">
<value>Rate Limit Exceeded</value>
</data>
<data name="refresh" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\refresh.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@ -834,9 +797,6 @@ It's now the most used free software to leak on Fortnite.</value>
<data name="ReloadAesKeysAtLaunch" xml:space="preserve">
<value>Reload AES keys at launch</value>
</data>
<data name="RememberGame" xml:space="preserve">
<value>Remember game</value>
</data>
<data name="Remove" xml:space="preserve">
<value>Remove</value>
</data>
@ -976,12 +936,9 @@ It's now the most used free software to leak on Fortnite.</value>
</data>
<data name="TranslatorsFDetails" xml:space="preserve">
<value>• EN: Asval#2291 • FR: Asval#2291
• DE: FunGames#6822 • IT: Angry Cat#5581
• DE: FunGames#6822 • IT: arianaglande#5581
• ES: Maiky.M#9879 • AR: PsychoPast#0001
• JA: FNJPNews#7820 • KO:
• PL: • PT-BR:
• RU: Seawod#4311 • TR:
• ZH-CN: • ZH-Hant:</value>
• JA: FNJPNews#7820 • RU: Seawod#4311</value>
<comment>Do not translate</comment>
</data>
<data name="Turkish" xml:space="preserve">
@ -1011,9 +968,6 @@ It's now the most used free software to leak on Fortnite.</value>
<data name="UnhandledExceptionOccured" xml:space="preserve">
<value>An unhandled exception occurred: {0}</value>
</data>
<data name="Update" xml:space="preserve">
<value>Update</value>
</data>
<data name="UseGameColors" xml:space="preserve">
<value>Use game colors</value>
</data>
@ -1085,9 +1039,6 @@ It's now the most used free software to leak on Fortnite.</value>
<value>Use Discord RPC</value>
<comment>Should Discord Rich Presence be enabled?</comment>
</data>
<data name="SaveDirectory" xml:space="preserve">
<value>Save Directory</value>
</data>
<data name="CopyImage" xml:space="preserve">
<value>Copy Image</value>
</data>
@ -1103,9 +1054,6 @@ It's now the most used free software to leak on Fortnite.</value>
<data name="EIconDesign_NoBackground" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\EIconDesign_NoBackground.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="ExportDirectory" xml:space="preserve">
<value>Export Directory</value>
</data>
<data name="borderlands3" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\borderlands3.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@ -1113,6 +1061,6 @@ It's now the most used free software to leak on Fortnite.</value>
<value>JSON Type</value>
</data>
<data name="WithPosition" xml:space="preserve">
<value>With Position</value>
<value>Position / Value</value>
</data>
</root>

View File

@ -147,9 +147,6 @@
<data name="Arabic" xml:space="preserve">
<value>Арабский</value>
</data>
<data name="Audio" xml:space="preserve">
<value>Аудио</value>
</data>
<data name="AudioDevices" xml:space="preserve">
<value>Звуковые устройства</value>
</data>
@ -168,9 +165,6 @@
<data name="Banner" xml:space="preserve">
<value>Баннер</value>
</data>
<data name="BenBotApi" xml:space="preserve">
<value>BenBot API</value>
</data>
<data name="BugsReport" xml:space="preserve">
<value>Сообщить об ошибке</value>
</data>
@ -279,9 +273,6 @@
<data name="Error" xml:space="preserve">
<value>Ошибка</value>
</data>
<data name="Exit" xml:space="preserve">
<value>Выход</value>
</data>
<data name="Export" xml:space="preserve">
<value>Экспортировать</value>
</data>
@ -327,9 +318,6 @@
<data name="French" xml:space="preserve">
<value>Французкий</value>
</data>
<data name="FyiDetails" xml:space="preserve">
<value>Выбранный язык будет использоваться во время создания иконок</value>
</data>
<data name="Games" xml:space="preserve">
<value>Игры</value>
</data>
@ -420,9 +408,6 @@
<data name="MB" xml:space="preserve">
<value>MB</value>
</data>
<data name="Media" xml:space="preserve">
<value>Медиафайлы</value>
</data>
<data name="Minimalist" xml:space="preserve">
<value>Минималистичный</value>
</data>
@ -477,9 +462,6 @@
<data name="PakFiles" xml:space="preserve">
<value>Файлы паков</value>
</data>
<data name="PakFilesAutoDetected" xml:space="preserve">
<value>Файлы паков Фортнайта автоматически найдены</value>
</data>
<data name="PathAutoDetected" xml:space="preserve">
<value>.PAK файлы обнаружены автоматически</value>
</data>
@ -504,9 +486,6 @@
<data name="ReloadAesKeysAtLaunch" xml:space="preserve">
<value>Обновлять ключи AES во время запуска программы</value>
</data>
<data name="RememberGame" xml:space="preserve">
<value>Запомнить игру</value>
</data>
<data name="Remove" xml:space="preserve">
<value>Удалить</value>
</data>
@ -597,9 +576,6 @@
<data name="Turkish" xml:space="preserve">
<value>Турецкий</value>
</data>
<data name="Update" xml:space="preserve">
<value>Обновить</value>
</data>
<data name="UpdateAvailable" xml:space="preserve">
<value>Доступно обновление</value>
</data>
@ -645,9 +621,6 @@
<data name="AboutToDownload" xml:space="preserve">
<value>Вы собираетесь загрузить {0}, размер которого {1}</value>
</data>
<data name="AddSeparator" xml:space="preserve">
<value>Добавить перегородку</value>
</data>
<data name="Analyzing" xml:space="preserve">
<value>Анализ {0}</value>
</data>
@ -672,9 +645,6 @@
<data name="ContributorsF" xml:space="preserve">
<value>Помощники</value>
</data>
<data name="Difference" xml:space="preserve">
<value>Отличающиеся</value>
</data>
<data name="DirectoryPath" xml:space="preserve">
<value>Путь директории</value>
</data>
@ -687,9 +657,6 @@
<data name="Extract" xml:space="preserve">
<value>Извлечь</value>
</data>
<data name="ExtractDirectory" xml:space="preserve">
<value>Открыть директорию</value>
</data>
<data name="Extraction" xml:space="preserve">
<value>Извлечение</value>
</data>
@ -747,9 +714,6 @@
<data name="PathChangedRestart" xml:space="preserve">
<value>FModel требует перезапуска, потому что вы указали новый путь</value>
</data>
<data name="Popup" xml:space="preserve">
<value>Всплывающее</value>
</data>
<data name="Processing" xml:space="preserve">
<value>Обработка</value>
</data>
@ -774,18 +738,12 @@
<data name="UseDiscordRpc" xml:space="preserve">
<value>Использовать Discord RPC</value>
</data>
<data name="SaveDirectory" xml:space="preserve">
<value>Сохранить дерикторию</value>
</data>
<data name="NoImageToCopy" xml:space="preserve">
<value>Нет изображения для копирования</value>
</data>
<data name="CopyImage" xml:space="preserve">
<value>Скопировать изображение</value>
</data>
<data name="FyiTitle" xml:space="preserve">
<value>Для Вашей информации:</value>
</data>
<data name="UseFEnglish" xml:space="preserve">
<value>Использовать FModel на Английском</value>
</data>

View File

@ -287,6 +287,18 @@ namespace FModel.Properties {
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("0")]
public long ProgramLanguage {
get {
return ((long)(this["ProgramLanguage"]));
}
set {
this["ProgramLanguage"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("0")]
@ -323,18 +335,6 @@ namespace FModel.Properties {
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool UseEnglish {
get {
return ((bool)(this["UseEnglish"]));
}
set {
this["UseEnglish"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]

View File

@ -68,6 +68,9 @@
<Setting Name="CustomGoTos" Type="System.String" Scope="User">
<Value Profile="(Default)">[{"Header":"Cosmetics","DirectoryPath":"FortniteGame/Content/Athena/Items/Cosmetics/"},{"Header":"Challenges","DirectoryPath":"FortniteGame/Content/Athena/Items/ChallengeBundles/"},{"Header":"Emotes [Audio]","DirectoryPath":"FortniteGame/Content/Athena/Sounds/Emotes/"},{"Header":"Music Packs [Audio]","DirectoryPath":"FortniteGame/Content/Athena/Sounds/MusicPacks/"},{"Header":"Weapons","DirectoryPath":"FortniteGame/Content/Athena/Items/Weapons/"},{"Header":"Strings","DirectoryPath":"FortniteGame/Content/Localization/"}]</Value>
</Setting>
<Setting Name="ProgramLanguage" Type="System.Int64" Scope="User">
<Value Profile="(Default)">0</Value>
</Setting>
<Setting Name="AssetsLanguage" Type="System.Int64" Scope="User">
<Value Profile="(Default)">0</Value>
</Setting>
@ -77,9 +80,6 @@
<Setting Name="AssetsIconDesign" Type="System.Int64" Scope="User">
<Value Profile="(Default)">0</Value>
</Setting>
<Setting Name="UseEnglish" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="UseGameColors" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>

View File

@ -244,7 +244,7 @@ namespace FModel.Utils
// Image Creator
if (Globals.Game.ActualGame == EGame.Fortnite && TryDrawFortniteIcon(entry.Name, p.ExportTypes[0].String, p.Exports[0]))
return p;
else if (Globals.Game.ActualGame == EGame.Valorant && TryDrawValorantIcon(entry.Name, p.Exports.Length > 1 ? p.Exports[1] : p.Exports[0]))
else if (Globals.Game.ActualGame == EGame.Valorant && TryDrawValorantIcon(entry.Name, p.ExportTypes.Length > 1 ? p.ExportTypes[1].String : p.ExportTypes[0].String, p.Exports.Length > 1 ? p.Exports[1] : p.Exports[0]))
return p;
}

View File

@ -2,8 +2,47 @@
namespace FModel.ViewModels.ComboBox
{
static class ProgramLang
{
private static readonly string _Default = "en-US";
private static readonly string _French = "fr-FR";
private static readonly string _German = "de-DE";
private static readonly string _Italian = "it-IT";
private static readonly string _Spanish = "es";
private static readonly string _Arabic = "ar";
private static readonly string _Japanese = "ja-JP";
private static readonly string _Russian = "ru-RU";
public static string GetProgramLang()
{
return Properties.Settings.Default.ProgramLanguage switch
{
7 => _Russian,
6 => _Japanese,
5 => _Arabic,
4 => _Spanish,
3 => _Italian,
2 => _German,
1 => _French,
_ => _Default
};
}
}
static class ComboBoxVm
{
public static ObservableCollection<ComboBoxViewModel> programLanguageCbViewModel = new ObservableCollection<ComboBoxViewModel>
{
new ComboBoxViewModel { Id = 0, Content = Properties.Resources.English },
new ComboBoxViewModel { Id = 1, Content = Properties.Resources.French },
new ComboBoxViewModel { Id = 2, Content = Properties.Resources.German },
new ComboBoxViewModel { Id = 3, Content = Properties.Resources.Italian },
new ComboBoxViewModel { Id = 4, Content = Properties.Resources.Spanish },
new ComboBoxViewModel { Id = 5, Content = Properties.Resources.Arabic },
new ComboBoxViewModel { Id = 6, Content = Properties.Resources.Japanese },
new ComboBoxViewModel { Id = 7, Content = Properties.Resources.Russian }
};
public static ObservableCollection<ComboBoxViewModel> languageCbViewModel = new ObservableCollection<ComboBoxViewModel>
{
new ComboBoxViewModel { Id = 0, Content = Properties.Resources.English, Property = ELanguage.English },

View File

@ -1,13 +1,11 @@
using FModel.Creator;
using FModel.Creator.Bundles;
using FModel.Creator.Bundles;
using FModel.Creator.Fortnite;
using FModel.Logger;
using FModel.Utils;
using FModel.Windows.ColorPicker;
using Microsoft.Win32;
using SkiaSharp;
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;

View File

@ -16,6 +16,7 @@
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="10"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="10"/>
@ -26,7 +27,42 @@
<ColumnDefinition Width="10"/>
</Grid.ColumnDefinitions>
<GroupBox Header="{x:Static properties:Resources.PakFiles}" Grid.Row="1" Grid.Column="1" BorderBrush="#7F748198" VerticalAlignment="Top">
<GroupBox Header="FModel" Grid.Row="1" Grid.Column="1" BorderBrush="#7F748198" VerticalAlignment="Top">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="5"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="5"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="5"/>
</Grid.ColumnDefinitions>
<Label Grid.Row="1" Grid.Column="1"
Content="{x:Static properties:Resources.Language}"
HorizontalAlignment="Left" VerticalAlignment="Top"/>
<ComboBox x:Name="FLanguages_CbBox" Grid.Row="1" Grid.Column="2"
BorderBrush="#7F748198" Background="#FF333C46"
Height="20" VerticalAlignment="Top" Margin="0,3,0,0"/>
<Grid Grid.Row="1" Grid.Column="4" Grid.RowSpan="3">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<CheckBox Grid.Row="0" Margin="5,7,5,5"
Content="{x:Static properties:Resources.UseDiscordRpc}"
IsChecked="{Binding Source={x:Static properties:Settings.Default}, Path=UseDiscordRpc, Mode=TwoWay}"/>
</Grid>
</Grid>
</GroupBox>
<GroupBox Header="{x:Static properties:Resources.PakFiles}" Grid.Row="2" Grid.Column="1" BorderBrush="#7F748198" VerticalAlignment="Top">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="5"/>
@ -51,7 +87,7 @@
</Grid>
</GroupBox>
<GroupBox Header="{x:Static properties:Resources.Extraction}" Grid.Row="2" Grid.Column="1" BorderBrush="#7F748198" VerticalAlignment="Top">
<GroupBox Header="{x:Static properties:Resources.Extraction}" Grid.Row="3" Grid.Column="1" BorderBrush="#7F748198" VerticalAlignment="Top">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="5"/>
@ -76,7 +112,7 @@
</Grid>
</GroupBox>
<GroupBox Header="{x:Static properties:Resources.Assets}" Grid.Row="3" Grid.Column="1" BorderBrush="#7F748198" VerticalAlignment="Top">
<GroupBox Header="{x:Static properties:Resources.Assets}" Grid.Row="4" Grid.Column="1" BorderBrush="#7F748198" VerticalAlignment="Top">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="5"/>
@ -111,26 +147,19 @@
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<CheckBox Grid.Row="0" Margin="5"
<CheckBox Grid.Row="0" Margin="5,6.5,5,5"
Content="{x:Static properties:Resources.ReloadAesKeysAtLaunch}"
IsChecked="{Binding Source={x:Static properties:Settings.Default}, Path=ReloadAesKeys, Mode=TwoWay}"/>
<CheckBox Grid.Row="1" Margin="5"
<CheckBox Grid.Row="1" Margin="5,6.5,5,5"
Content="{x:Static properties:Resources.AutoOpenSounds}"
IsChecked="{Binding Source={x:Static properties:Settings.Default}, Path=AutoOpenSounds, Mode=TwoWay}"/>
<CheckBox Grid.Row="2" Margin="5" Content="{x:Static properties:Resources.UseFEnglish}"
IsChecked="{Binding Source={x:Static properties:Settings.Default}, Path=UseEnglish, Mode=TwoWay}"/>
<CheckBox Grid.Row="3" Margin="5"
Content="{x:Static properties:Resources.UseDiscordRpc}"
IsChecked="{Binding Source={x:Static properties:Settings.Default}, Path=UseDiscordRpc, Mode=TwoWay}"/>
</Grid>
</Grid>
</GroupBox>
<Button Grid.Row="5" Grid.Column="1"
<Button Grid.Row="6" Grid.Column="1"
Content="{x:Static properties:Resources.OK}"
HorizontalAlignment="Right" Width="80" Click="OnClick"/>
</Grid>

View File

@ -20,7 +20,6 @@ namespace FModel.Windows.Settings
private string _inputPath;
private string _outputPath;
private bool _useDiscordRpc;
private bool _useEnglish;
public General()
{
@ -37,7 +36,8 @@ namespace FModel.Windows.Settings
_inputPath = Properties.Settings.Default.PakPath;
_outputPath = Properties.Settings.Default.OutputPath;
_useDiscordRpc = Properties.Settings.Default.UseDiscordRpc;
_useEnglish = Properties.Settings.Default.UseEnglish;
FLanguages_CbBox.ItemsSource = ComboBoxVm.programLanguageCbViewModel;
FLanguages_CbBox.SelectedItem = ComboBoxVm.programLanguageCbViewModel.Where(x => x.Id == Properties.Settings.Default.ProgramLanguage).FirstOrDefault();
Languages_CbBox.ItemsSource = ComboBoxVm.languageCbViewModel;
Languages_CbBox.SelectedItem = ComboBoxVm.languageCbViewModel.Where(x => x.Id == Properties.Settings.Default.AssetsLanguage).FirstOrDefault();
Json_CbBox.ItemsSource = ComboBoxVm.jsonCbViewModel;
@ -62,8 +62,9 @@ namespace FModel.Windows.Settings
if (!_inputPath.Equals(Properties.Settings.Default.PakPath) ||
!_outputPath.Equals(Properties.Settings.Default.OutputPath) ||
_useEnglish != Properties.Settings.Default.UseEnglish)
Properties.Settings.Default.ProgramLanguage != FLanguages_CbBox.SelectedIndex)
{
Properties.Settings.Default.ProgramLanguage = FLanguages_CbBox.SelectedIndex;
DarkMessageBoxHelper.Show(Properties.Resources.PathChangedRestart, Properties.Resources.PathChanged, MessageBoxButton.OK, MessageBoxImage.Information);
DebugHelper.WriteLine("{0} {1} {2}", "[FModel]", "[Restarting]", "Path(s) changed");