Circumvent rsf not existing.

This commit is contained in:
Ottermandias 2024-11-22 00:35:17 +01:00
parent 9e72432682
commit f2bdaf1b49
3 changed files with 25 additions and 5 deletions

@ -1 +1 @@
Subproject commit c855c17cffd7d270c3f013e01767cd052c24c462
Subproject commit 07d18f7f7218811956e6663592e53c4145f2d862

View file

@ -96,6 +96,7 @@ public class HookOverrides
public bool CheckFileState;
public bool TexResourceHandleOnLoad;
public bool LoadMdlFileExtern;
public bool SoundOnLoad;
}
public struct ResourceHooks

View file

@ -7,6 +7,7 @@ using Penumbra.GameData;
using Penumbra.Interop.Structs;
using Penumbra.String.Classes;
using ResourceHandle = FFXIVClientStructs.FFXIV.Client.System.Resource.Handle.ResourceHandle;
using TextureResourceHandle = Penumbra.Interop.Structs.TextureResourceHandle;
namespace Penumbra.Interop.Hooks.ResourceLoading;
@ -52,7 +53,8 @@ public unsafe class TexMdlScdService : IDisposable, IRequiredService
_loadMdlFileExternHook.Enable();
if (!HookOverrides.Instance.ResourceLoading.TexResourceHandleOnLoad)
_textureOnLoadHook.Enable();
_soundOnLoadHook.Enable();
if (!HookOverrides.Instance.ResourceLoading.SoundOnLoad)
_soundOnLoadHook.Enable();
}
/// <summary> Add CRC64 if the given file is a model or texture file and has an associated path. </summary>
@ -80,6 +82,7 @@ public unsafe class TexMdlScdService : IDisposable, IRequiredService
/// i.e. CRC32 of filename in the lower bytes, CRC32 of parent path in the upper bytes.
/// </summary>
private readonly Dictionary<ulong, ResourceType> _customFileCrc = [];
public IReadOnlyDictionary<ulong, ResourceType> CustomCache
=> _customFileCrc;
@ -98,15 +101,31 @@ public unsafe class TexMdlScdService : IDisposable, IRequiredService
private delegate byte SoundOnLoadDelegate(ResourceHandle* handle, SeFileDescriptor* descriptor, byte unk);
[Signature("48 89 5C 24 ?? 48 89 74 24 ?? 57 48 83 EC 30 8B 79 ?? 48 8B DA 8B D7")]
[Signature(Sigs.LoadScdFileLocal)]
private readonly delegate* unmanaged<ResourceHandle*, SeFileDescriptor*, byte, byte> _loadScdFileLocal = null!;
[Signature("40 56 57 41 54 48 81 EC 90 00 00 00 80 3A 0B 45 0F B6 E0 48 8B F2", DetourName = nameof(OnScdLoadDetour))]
[Signature(Sigs.SoundOnLoad, DetourName = nameof(OnScdLoadDetour))]
private readonly Hook<SoundOnLoadDelegate> _soundOnLoadHook = null!;
[Signature(Sigs.RsfServiceAddress, ScanType = ScanType.StaticAddress)]
private readonly nint* _rsfService = null;
private byte OnScdLoadDetour(ResourceHandle* handle, SeFileDescriptor* descriptor, byte unk)
{
var ret = _soundOnLoadHook.Original(handle, descriptor, unk);
byte ret;
if (*_rsfService == nint.Zero)
{
Penumbra.Log.Debug(
$"Resource load of {handle->FileName} before FFXIV RSF-service was instantiated, workaround by setting pointer.");
*_rsfService = 1;
ret = _soundOnLoadHook.Original(handle, descriptor, unk);
*_rsfService = nint.Zero;
}
else
{
ret = _soundOnLoadHook.Original(handle, descriptor, unk);
}
if (!_scdReturnData.Value)
return ret;