added Wwise AKPK Section, that means no more random generated RIFF ids

This commit is contained in:
iAmAsval 2020-07-18 04:28:22 +02:00
parent cabae55b4d
commit 0d66c891ed
13 changed files with 252 additions and 16 deletions

View File

@ -39,11 +39,6 @@ namespace FModel.Grabber.Aes
Properties.Settings.Default.StaticAesKeys = JsonConvert.SerializeObject(staticKeys, Formatting.None);
}
DebugHelper.WriteLine("{0} {1} {2}", "[FModel]", "[AES]", $"BenBot Dynamic keys are {benResponse.DynamicKeys}");
oldDynamicKeys[Globals.Game.ActualGame.ToString()] = benResponse.DynamicKeys;
Properties.Settings.Default.DynamicAesKeys = JsonConvert.SerializeObject(oldDynamicKeys, Formatting.None);
Properties.Settings.Default.Save();
if (oldDynamicKeys.TryGetValue(Globals.Game.ActualGame.ToString(), out var gameDict))
{
Dictionary<string, string> difference = benResponse.DynamicKeys
@ -61,6 +56,11 @@ namespace FModel.Grabber.Aes
}
}
DebugHelper.WriteLine("{0} {1} {2}", "[FModel]", "[AES]", $"BenBot Dynamic keys are {benResponse.DynamicKeys}");
oldDynamicKeys[Globals.Game.ActualGame.ToString()] = benResponse.DynamicKeys;
Properties.Settings.Default.DynamicAesKeys = JsonConvert.SerializeObject(oldDynamicKeys, Formatting.None);
Properties.Settings.Default.Save();
return true;
}
}

View File

@ -20,7 +20,7 @@ namespace FModel.PakReader
private const uint _DIDX_ID = 0x58444944;
private const uint _DATA_ID = 0x41544144;
private const uint _HIRC_ID = 0x43524948;
private const uint _RIFF_ID = 0x46464952;
//private const uint _RIFF_ID = 0x46464952;
private const uint _STID_ID = 0x44495453;
private const uint _STMG_ID = 0x474D5453;
private const uint _ENVS_ID = 0x53564E45;
@ -29,7 +29,7 @@ namespace FModel.PakReader
public WwiseReader(BinaryReader reader)
{
Random rnd = new Random();
AKPKSection akpkSection = null;
DIDXSection didxSection = null;
DATASection dataSection = null;
HIRCSection hircSection = null;
@ -46,11 +46,13 @@ namespace FModel.PakReader
switch (SectionIdentifier)
{
case _AKPK_ID:
akpkSection = new AKPKSection(reader);
break;
case _BKHD_ID:
BKHDSection _ = new BKHDSection(reader);
BKHDSection _A = new BKHDSection(reader);
break;
case _INIT_ID:
INITSection _B = new INITSection(reader);
break;
case _DIDX_ID:
didxSection = new DIDXSection(reader, Position + SectionLength);
@ -61,10 +63,6 @@ namespace FModel.PakReader
case _HIRC_ID:
hircSection = new HIRCSection(reader);
break;
case _RIFF_ID:
reader.BaseStream.Seek(Position - sizeof(uint) - sizeof(uint), SeekOrigin.Begin);
AudioFiles[$"{rnd.Next(1000000, 9999999)}.wem"] = reader.ReadBytes(Convert.ToInt32(SectionLength) + sizeof(uint) + sizeof(uint));
break;
case _STID_ID:
stidSection = new STIDSection(reader);
break;
@ -103,7 +101,121 @@ namespace FModel.PakReader
AudioFiles[key] = dataSection.WemFiles[i];
}
}
// valorant event sound uses the HIRCSection but i don't understand how to get the actual audio atm
if (akpkSection != null)
{
foreach (var folder in akpkSection.Folders)
foreach (var entry in folder.Entries)
if (!entry.IsSoundBank)
{
string key = $"{entry.Path.ToUpper()}_{entry.NameHash}.wem";
if (stidSection != null && stidSection.SoundBanks.TryGetValue(entry.NameHash, out string name))
key = name;
reader.BaseStream.Seek(entry.Offset, SeekOrigin.Begin);
AudioFiles[key] = reader.ReadBytes(Convert.ToInt32(entry.Size));
}
}
// valorant event sound uses the HIRCSection but i don't understand how to get the actual audio from it atm
}
/// <summary>
/// https://github.com/Nibre/HaloWwise/blob/master/HaloWwise/PackManager.cs
/// </summary>
public class AKPKSection
{
public uint FolderListLength;
public uint BankTableLength;
public uint SoundTableLength;
public uint FolderNumber;
public Folder[] Folders;
public AKPKSection(BinaryReader reader)
{
reader.ReadUInt32(); // Skip
FolderListLength = reader.ReadUInt32();
BankTableLength = reader.ReadUInt32();
SoundTableLength = reader.ReadUInt32();
reader.ReadUInt32(); // Skip
FolderNumber = reader.ReadUInt32();
Folders = new Folder[FolderNumber];
/* idk how to explain how to do it in another way */
for (int i = 0; i < Folders.Length; i++)
{
Folders[i] = new Folder(reader);
}
for (int i = 0; i < Folders.Length; i++)
{
Folders[i].SetName(reader);
}
for (int i = 0; i < Folders.Length; i++)
{
uint EntryLength = reader.ReadUInt32();
Folders[Folders[i].Id].Entries = new Folder.Entry[EntryLength];
for (int j = 0; j < Folders[Folders[i].Id].Entries.Length; j++)
{
Folder.Entry entry = new Folder.Entry(reader);
entry.Path = Folders[entry.FolderID].Name;
long rememberMe = reader.BaseStream.Position;
reader.BaseStream.Seek(entry.Offset, SeekOrigin.Begin);
entry.IsSoundBank = reader.ReadUInt32() == _BKHD_ID;
reader.BaseStream.Seek(rememberMe, SeekOrigin.Begin);
Folders[Folders[i].Id].Entries[j] = entry;
}
}
}
public class Folder
{
public uint NameOffset;
public uint Id;
public string Name;
public Entry[] Entries;
public Folder(BinaryReader reader)
{
NameOffset = reader.ReadUInt32();
Id = reader.ReadUInt32();
}
public void SetName(BinaryReader reader)
{
StringBuilder builder = new StringBuilder();
while (true)
{
char a = reader.ReadChar();
reader.ReadChar(); // always a null byte
if (a == 0x0)
break;
else
builder.Append(a);
}
Name = builder.ToString().Trim();
}
public class Entry
{
public uint NameHash;
public uint FolderID;
public uint Size;
public uint OffsetMultiplier;
public uint Offset;
public string Path;
public bool IsSoundBank;
public Entry(BinaryReader reader)
{
NameHash = reader.ReadUInt32();
OffsetMultiplier = reader.ReadUInt32();
Size = reader.ReadUInt32();
Offset = reader.ReadUInt32() * OffsetMultiplier;
FolderID = reader.ReadUInt32();
}
}
}
}
public class BKHDSection
@ -118,6 +230,40 @@ namespace FModel.PakReader
}
}
/// <summary>
/// this is 100% guessed
/// </summary>
public class INITSection
{
public uint ObjectNumber;
public InitObject[] Objects;
public INITSection(BinaryReader reader)
{
ObjectNumber = reader.ReadUInt32();
Objects = new InitObject[ObjectNumber];
for (int i = 0; i < Objects.Length; i++)
{
Objects[i] = new InitObject(reader);
}
}
public class InitObject
{
public ushort UnknownA;
public ushort UnknownB;
public string Object;
public InitObject(BinaryReader reader)
{
UnknownA = reader.ReadUInt16();
UnknownB = reader.ReadUInt16();
uint length = reader.ReadUInt32();
Object = Encoding.UTF8.GetString(reader.ReadBytes(Convert.ToInt32(length)).AsSpan(..^1));
}
}
}
public class DIDXSection
{
public List<WemObject> WemFilesRef;
@ -240,7 +386,7 @@ namespace FModel.PakReader
{
public float VolumeThreshold;
public ushort MaxVoiceInstances;
public uint StateGroupNumber;
public ushort StateGroupNumber;
public StateGroupObject[] StateGroups;
public uint SwitchGroupNumber;
public SwitchGroupObject[] SwitchGroups;
@ -251,7 +397,7 @@ namespace FModel.PakReader
{
VolumeThreshold = reader.ReadSingle();
MaxVoiceInstances = reader.ReadUInt16();
StateGroupNumber = reader.ReadUInt32();
StateGroupNumber = reader.ReadUInt16();
StateGroups = new StateGroupObject[Convert.ToInt32(StateGroupNumber)];
for (int i = 0; i < StateGroups.Length; i++)
{

View File

@ -551,6 +551,7 @@ namespace FModel.Properties {
/// Recherche une chaîne localisée semblable à • Waddlesworth • Maiky
///• FunGames • Not Officer
///• PsychoPast • TSG
///• GMatrixGames • Jackson
///• XTigerHyperX • FireMonkey.
/// </summary>
public static string ContributorsFDetails {

View File

@ -775,4 +775,10 @@ It's now the most used free software to leak on Fortnite.</value>
<data name="NoBackground" xml:space="preserve">
<value>أي خلفية</value>
</data>
<data name="JsonType" xml:space="preserve">
<value>نوع JSON</value>
</data>
<data name="WithPosition" xml:space="preserve">
<value>الوظيفة / القيمة</value>
</data>
</root>

View File

@ -812,4 +812,10 @@ Jetzt ist es die am häufigsten genutzte freie Software um mit Fortnite zu leake
<data name="NoBackground" xml:space="preserve">
<value>Kein Hintergrund</value>
</data>
<data name="JsonType" xml:space="preserve">
<value>JSON-Typ</value>
</data>
<data name="WithPosition" xml:space="preserve">
<value>Position / Wert</value>
</data>
</root>

View File

@ -1028,4 +1028,13 @@ Ahora es el software gratuito más utilizado para filtrar en Fortnite.</value>
<data name="NoBackground" xml:space="preserve">
<value>Sin fondo</value>
</data>
<data name="JsonType" xml:space="preserve">
<value>Tipo JSON</value>
</data>
<data name="CopyImage" xml:space="preserve">
<value>Copiar imagen</value>
</data>
<data name="WithPosition" xml:space="preserve">
<value>Posición / Valor</value>
</data>
</root>

View File

@ -822,4 +822,7 @@ 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>Position / Valeur</value>
</data>
</root>

View File

@ -778,4 +778,10 @@ Col tempo sono state aggiunte nuove funzioni e molti altri utenti hanno comincia
<data name="NoBackground" xml:space="preserve">
<value>Nessuno Sfondo</value>
</data>
<data name="JsonType" xml:space="preserve">
<value>Tipo JSON</value>
</data>
<data name="WithPosition" xml:space="preserve">
<value>Posizione / Valore</value>
</data>
</root>

View File

@ -763,4 +763,25 @@
<data name="EditDirectory" xml:space="preserve">
<value>ディレクトリを編集</value>
</data>
<data name="JsonType" xml:space="preserve">
<value>JSONタイプ</value>
</data>
<data name="NoBackground" xml:space="preserve">
<value>背景なし</value>
</data>
<data name="NoImageToCopy" xml:space="preserve">
<value>現在、コピーする画像はありません</value>
</data>
<data name="UseFEnglish" xml:space="preserve">
<value>FModelを英語で使用する</value>
</data>
<data name="UseDiscordRpc" xml:space="preserve">
<value>Discord RPCを使用する</value>
</data>
<data name="CopyImage" xml:space="preserve">
<value>画像をコピー</value>
</data>
<data name="WithPosition" xml:space="preserve">
<value>位置/値</value>
</data>
</root>

View File

@ -287,6 +287,7 @@ It's now the most used free software to leak on Fortnite.</value>
<value>• Waddlesworth • Maiky
• FunGames • Not Officer
• PsychoPast • TSG
• GMatrixGames • Jackson
• XTigerHyperX • FireMonkey</value>
<comment>Do not translate</comment>
</data>

View File

@ -747,4 +747,34 @@
<data name="UseFEnglish" xml:space="preserve">
<value>Использовать FModel на Английском</value>
</data>
<data name="FilePathNoExt" xml:space="preserve">
<value>Путь файлу без расширения</value>
</data>
<data name="Guid" xml:space="preserve">
<value>Guid</value>
</data>
<data name="Idling" xml:space="preserve">
<value>{0} - ожидания</value>
</data>
<data name="JsonType" xml:space="preserve">
<value>Тип JSON</value>
</data>
<data name="MatchWholeWord" xml:space="preserve">
<value>Совпадение всего слова</value>
</data>
<data name="NoBackground" xml:space="preserve">
<value>Без фона</value>
</data>
<data name="RegularExpression" xml:space="preserve">
<value>Регулярное выражение</value>
</data>
<data name="TotalAssetsLoaded" xml:space="preserve">
<value>Загруженные {0} функции</value>
</data>
<data name="Wildcards" xml:space="preserve">
<value>Общие символы</value>
</data>
<data name="WithPosition" xml:space="preserve">
<value>Должность / Значение</value>
</data>
</root>

View File

@ -62,7 +62,7 @@ namespace FModel.Utils
return (string.Empty, string.Empty);
}
}
catch (UnauthorizedAccessException e)
catch (UnauthorizedAccessException)
{
DebugHelper.WriteLine("{0} {1} {2}", "[FModel]", "[WindowsApps]",
$"{dir} can't be accessed without permission changes to the folder.");

View File

@ -1,5 +1,6 @@
using CSCore.SoundOut;
using FModel.Discord;
using FModel.PakReader;
using FModel.ViewModels.ListBox;
using FModel.ViewModels.SoundPlayer;
using FModel.Windows.SoundPlayer.Visualization;
@ -87,6 +88,12 @@ namespace FModel.Windows.SoundPlayer
Folder = string.Empty
});
break;
case ".bnk":
case ".pck":
Focus();
WwiseReader bnk = new WwiseReader(new BinaryReader(new BufferedStream(new FileInfo(file).Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite))));
LoadFiles(bnk.AudioFiles, "");
break;
default:
LoadFile(file);
break;