mirror of
https://github.com/xivdev/Penumbra.git
synced 2025-12-15 05:04:15 +01:00
32 lines
1.1 KiB
C#
32 lines
1.1 KiB
C#
using FFXIVClientStructs.FFXIV.Client.System.Resource.Handle;
|
|
using OtterGui.Services;
|
|
using Penumbra.GameData;
|
|
using Penumbra.Services;
|
|
|
|
namespace Penumbra.Interop.Hooks.Resources;
|
|
|
|
public sealed unsafe class LoadMtrlShpk : FastHook<LoadMtrlShpk.Delegate>
|
|
{
|
|
private readonly GameState _gameState;
|
|
private readonly CommunicatorService _communicator;
|
|
|
|
public LoadMtrlShpk(HookManager hooks, GameState gameState, CommunicatorService communicator)
|
|
{
|
|
_gameState = gameState;
|
|
_communicator = communicator;
|
|
Task = hooks.CreateHook<Delegate>("Load Material Shaders", Sigs.LoadMtrlShpk, Detour, true);
|
|
}
|
|
|
|
public delegate byte Delegate(MaterialResourceHandle* mtrlResourceHandle);
|
|
|
|
private byte Detour(MaterialResourceHandle* handle)
|
|
{
|
|
var last = _gameState.MtrlData.Value;
|
|
var mtrlData = _gameState.LoadSubFileHelper((nint)handle);
|
|
_gameState.MtrlData.Value = mtrlData;
|
|
var ret = Task.Result.Original(handle);
|
|
_gameState.MtrlData.Value = last;
|
|
_communicator.MtrlShpkLoaded.Invoke((nint)handle, mtrlData.AssociatedGameObject);
|
|
return ret;
|
|
}
|
|
}
|