mirror of
https://github.com/4sval/FModel.git
synced 2026-04-23 01:57:48 -05:00
added Wwise AKPK Section, that means no more random generated RIFF ids
This commit is contained in:
parent
cabae55b4d
commit
0d66c891ed
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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++)
|
||||
{
|
||||
|
|
|
|||
1
FModel/Properties/Resources.Designer.cs
generated
1
FModel/Properties/Resources.Designer.cs
generated
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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.");
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user