fixed pakreader <-> pakentry connection + fixed compressed ini

This commit is contained in:
iAmAsval 2020-05-21 16:33:05 +02:00
parent 2c3a9b7ec3
commit 320b6b72a3
5 changed files with 38 additions and 29 deletions

View File

@ -101,11 +101,11 @@ namespace PakReader
{
reader.ReadUInt32(); // StrHash
}
var Key = reader.ReadFString();
string Key = reader.ReadFString();
reader.ReadUInt32(); // SourceStringHash
string EntryLocalizedString;
string EntryLocalizedString = string.Empty;
if (VersionNumber >= Version.COMPACT)
{
int LocalizedStringIndex = reader.ReadInt32();
@ -130,16 +130,18 @@ namespace PakReader
}
else
{
throw new IOException($"LocRes has an invalid localized string index for namespace '{Namespace}' and key '{Key}'. This entry will have no translation.");
//throw new IOException($"LocRes has an invalid localized string index for namespace '{Namespace}' and key '{Key}'. This entry will have no translation.");
}
}
else
{
EntryLocalizedString = reader.ReadFString();
}
Entries.Add(Key, EntryLocalizedString);
if (Key != null) Entries.Add(Key, EntryLocalizedString);
}
this.Entries.Add(Namespace, Entries);
if (Namespace != null) this.Entries.Add(Namespace, Entries);
}
}

View File

@ -143,8 +143,16 @@ namespace PakReader.Parsers.Objects
stream.Read(data, 0, data.Length);
byte[] decrypted = AESDecryptor.DecryptAES(data, key);
if (CompressionMethodIndex != 0U) Decompress(stream, compressionMethods, decrypted);
return new ArraySegment<byte>(decrypted, 0, (int)UncompressedSize);
if (CompressionMethodIndex != 0U)
{
using var m = new MemoryStream(decrypted, 0, decrypted.Length)
{
Position = 0
};
Decompress(m, compressionMethods, decrypted);
}
return new ArraySegment<byte>(decrypted, 0, decrypted.Length <= (int)UncompressedSize ? decrypted.Length : (int)UncompressedSize);
}
else
{

View File

@ -72,7 +72,7 @@ namespace FModel.Utils
{
case ".ini":
{
using var asset = GetMemoryStream(mount + selected.PakEntry.GetPathWithoutExtension());
using var asset = GetMemoryStream(selected.PakEntry.PakFileName, mount + selected.PakEntry.GetPathWithoutExtension());
asset.Position = 0;
using var reader = new StreamReader(asset);
AvalonEditVm.avalonEditViewModel.Set(reader.ReadToEnd(), selected.PakEntry.GetNameWithExtension(), AvalonEditVm.IniHighlighter);
@ -82,7 +82,7 @@ namespace FModel.Utils
case ".uplugin":
case ".upluginmanifest":
{
using var asset = GetMemoryStream(mount + selected.PakEntry.GetPathWithoutExtension());
using var asset = GetMemoryStream(selected.PakEntry.PakFileName, mount + selected.PakEntry.GetPathWithoutExtension());
asset.Position = 0;
using var reader = new StreamReader(asset);
AvalonEditVm.avalonEditViewModel.Set(reader.ReadToEnd(), selected.PakEntry.GetNameWithExtension());
@ -90,21 +90,21 @@ namespace FModel.Utils
}
case ".locmeta":
{
using var asset = GetMemoryStream(mount + selected.PakEntry.GetPathWithoutExtension());
using var asset = GetMemoryStream(selected.PakEntry.PakFileName, mount + selected.PakEntry.GetPathWithoutExtension());
asset.Position = 0;
AvalonEditVm.avalonEditViewModel.Set(JsonConvert.SerializeObject(new LocMetaReader(asset), Formatting.Indented), selected.PakEntry.GetNameWithExtension());
break;
}
case ".locres":
{
using var asset = GetMemoryStream(mount + selected.PakEntry.GetPathWithoutExtension());
using var asset = GetMemoryStream(selected.PakEntry.PakFileName, mount + selected.PakEntry.GetPathWithoutExtension());
asset.Position = 0;
AvalonEditVm.avalonEditViewModel.Set(JsonConvert.SerializeObject(new LocResReader(asset).Entries, Formatting.Indented), selected.PakEntry.GetNameWithExtension());
break;
}
case ".udic":
{
using var asset = GetMemoryStream(mount + selected.PakEntry.GetPathWithoutExtension());
using var asset = GetMemoryStream(selected.PakEntry.PakFileName, mount + selected.PakEntry.GetPathWithoutExtension());
asset.Position = 0;
AvalonEditVm.avalonEditViewModel.Set(JsonConvert.SerializeObject(new FOodleDictionaryArchive(asset).Header, Formatting.Indented), selected.PakEntry.GetNameWithExtension());
break;
@ -115,7 +115,7 @@ namespace FModel.Utils
!selected.PakEntry.Name.Equals("FortniteGame/AssetRegistry.bin") && // this file is 85mb...
selected.PakEntry.Name.Contains("AssetRegistry")) // only parse AssetRegistry (basically the ones in dynamic paks)
{
using var asset = GetMemoryStream(mount + selected.PakEntry.GetPathWithoutExtension());
using var asset = GetMemoryStream(selected.PakEntry.PakFileName, mount + selected.PakEntry.GetPathWithoutExtension());
asset.Position = 0;
AvalonEditVm.avalonEditViewModel.Set(JsonConvert.SerializeObject(new FAssetRegistryState(asset), Formatting.Indented), selected.PakEntry.GetNameWithExtension());
}
@ -123,7 +123,7 @@ namespace FModel.Utils
}
case ".png":
{
using var asset = GetMemoryStream(mount + selected.PakEntry.GetPathWithoutExtension());
using var asset = GetMemoryStream(selected.PakEntry.PakFileName, mount + selected.PakEntry.GetPathWithoutExtension());
asset.Position = 0;
ImageBoxVm.imageBoxViewModel.Set(SKBitmap.Decode(asset), selected.PakEntry.GetNameWithExtension());
break;
@ -153,12 +153,11 @@ namespace FModel.Utils
TaskScheduler.FromCurrentSynchronizationContext());
}
public static MemoryStream GetMemoryStream(string pathWithoutExtension)
public static MemoryStream GetMemoryStream(string pakName, string pathWithoutExtension)
{
foreach (PakFileReader pak in Globals.CachedPakFiles.Values)
if (Globals.CachedPakFiles.TryGetValue(pakName, out PakFileReader pak))
{
if (!pak.Initialized) continue; // this should never happen because he can't be cached if not initialized
if (!pak.TryGetFile(pathWithoutExtension, out ArraySegment<byte> uasset, out _, out _))
if (pak.Initialized && !pak.TryGetFile(pathWithoutExtension, out ArraySegment<byte> uasset, out _, out _))
{
if (uasset != null)
{
@ -255,10 +254,9 @@ namespace FModel.Utils
return true;
}
foreach (PakFileReader pak in Globals.CachedPakFiles.Values)
if (Globals.CachedPakFiles.TryGetValue(entry.PakFileName, out PakFileReader pak))
{
if (!pak.Initialized) continue; // this should never happen because he can't be cached if not initialized
if (pak.TryGetFile(mount + entry.GetPathWithoutExtension(), out ArraySegment<byte> uasset, out ArraySegment<byte> uexp, out ArraySegment<byte> ubulk))
if (pak.Initialized && pak.TryGetFile(mount + entry.GetPathWithoutExtension(), out ArraySegment<byte> uasset, out ArraySegment<byte> uexp, out ArraySegment<byte> ubulk))
{
package = new PakPackage(uasset, uexp, ubulk);
_CachedFiles[entry] = new Dictionary<PakPackage, ArraySegment<byte>[]>
@ -288,10 +286,9 @@ namespace FModel.Utils
return true;
}
foreach (PakFileReader pak in Globals.CachedPakFiles.Values)
if (Globals.CachedPakFiles.TryGetValue(entry.PakFileName, out PakFileReader pak))
{
if (!pak.Initialized) continue; // this should never happen because he can't be cached if not initialized
if (pak.TryGetFile(mount + entry.GetPathWithoutExtension(), out ArraySegment<byte> uasset, out ArraySegment<byte> uexp, out ArraySegment<byte> ubulk))
if (pak.Initialized && pak.TryGetFile(mount + entry.GetPathWithoutExtension(), out ArraySegment<byte> uasset, out ArraySegment<byte> uexp, out ArraySegment<byte> ubulk))
{
arraySegment = new ArraySegment<byte>[] { uasset, uexp, ubulk };
return true;
@ -363,7 +360,7 @@ namespace FModel.Utils
string name = Path.GetFileName(fullPath);
Directory.CreateDirectory(basePath + entry.GetPathWithoutFile());
using var data = GetMemoryStream(r.MountPoint + entry.GetPathWithoutExtension());
using var data = GetMemoryStream(entry.PakFileName, r.MountPoint + entry.GetPathWithoutExtension());
using var stream = new FileStream(fullPath, FileMode.Create, FileAccess.Write);
data.WriteTo(stream);

View File

@ -53,7 +53,7 @@ namespace FModel.Utils
{
DebugHelper.WriteLine("{0} {1} {2} {3}", "[FModel]", "[Localizations]", "[GameDict]", $"Feeding with {KvP.Value.Name} from {KvP.Value.PakFileName} Miam Miam!");
using var asset = Assets.GetMemoryStream(mount + KvP.Value.GetPathWithoutExtension());
using var asset = Assets.GetMemoryStream(fileReader.FileName, mount + KvP.Value.GetPathWithoutExtension());
asset.Position = 0;
foreach (var namespac in new LocResReader(asset).Entries)
{
@ -61,7 +61,8 @@ namespace FModel.Utils
_fortniteLocalizationDict[namespac.Key] = new Dictionary<string, string>();
foreach (var key in namespac.Value)
_fortniteLocalizationDict[namespac.Key][key.Key] = key.Value;
if (!string.IsNullOrEmpty(key.Value))
_fortniteLocalizationDict[namespac.Key][key.Key] = key.Value;
}
}
}

View File

@ -1,6 +1,7 @@
using FModel.Utils;
using FModel.ViewModels.DataGrid;
using FModel.ViewModels.ListBox;
using PakReader.Pak;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
@ -70,9 +71,9 @@ namespace FModel.ViewModels.Treeview
var m = Regex.Match(entry.Name, $"{fullPath}/*", RegexOptions.IgnoreCase);
if (m.Success)
{
foreach (var entries in Globals.CachedPakFiles.Values)
if (Globals.CachedPakFiles.TryGetValue(entry.PakFile, out PakFileReader pak))
{
if (entries.TryGetValue("/" + entry.Name.Substring(0, entry.Name.LastIndexOf(".")), out var pakEntry)) // remove the extension to get the entry
if (pak.TryGetValue("/" + entry.Name.Substring(0, entry.Name.LastIndexOf(".")), out var pakEntry)) // remove the extension to get the entry
{
entriesToExtract.Add(new ListBoxViewModel
{