mirror of
https://github.com/Ottermandias/Glamourer.git
synced 2025-12-12 10:17:23 +01:00
Cherry-Pick from ebdfd3f8 to use EquipGearSetInternal.
This commit is contained in:
parent
4db0822443
commit
96dca5dbe7
1 changed files with 21 additions and 13 deletions
|
|
@ -1,5 +1,6 @@
|
||||||
using Dalamud.Hooking;
|
using Dalamud.Hooking;
|
||||||
using Dalamud.Plugin.Services;
|
using Dalamud.Plugin.Services;
|
||||||
|
using Dalamud.Utility.Signatures;
|
||||||
using FFXIVClientStructs.FFXIV.Client.Game;
|
using FFXIVClientStructs.FFXIV.Client.Game;
|
||||||
using FFXIVClientStructs.FFXIV.Client.UI.Misc;
|
using FFXIVClientStructs.FFXIV.Client.UI.Misc;
|
||||||
using Glamourer.Events;
|
using Glamourer.Events;
|
||||||
|
|
@ -19,36 +20,43 @@ public sealed unsafe class InventoryService : IDisposable, IRequiredService
|
||||||
public InventoryService(MovedEquipment movedItemsEvent, IGameInteropProvider interop, EquippedGearset gearsetEvent)
|
public InventoryService(MovedEquipment movedItemsEvent, IGameInteropProvider interop, EquippedGearset gearsetEvent)
|
||||||
{
|
{
|
||||||
_movedItemsEvent = movedItemsEvent;
|
_movedItemsEvent = movedItemsEvent;
|
||||||
_gearsetEvent = gearsetEvent;
|
_gearsetEvent = gearsetEvent;
|
||||||
|
|
||||||
_moveItemHook = interop.HookFromAddress<MoveItemDelegate>((nint)InventoryManager.MemberFunctionPointers.MoveItemSlot, MoveItemDetour);
|
_moveItemHook = interop.HookFromAddress<MoveItemDelegate>((nint)InventoryManager.MemberFunctionPointers.MoveItemSlot, MoveItemDetour);
|
||||||
_equipGearsetHook =
|
// This can be uncommented after ClientStructs Updates with EquipGearsetInternal after merged PR. (See comment below)
|
||||||
interop.HookFromAddress<EquipGearsetDelegate>((nint)RaptureGearsetModule.MemberFunctionPointers.EquipGearset, EquipGearSetDetour);
|
//_equipGearsetInternalHook = interop.HookFromAddress<EquipGearsetDelegate>((nint)RaptureGearsetModule.MemberFunctionPointers.EquipGearsetInternal, EquipGearSetInternalDetour);
|
||||||
|
|
||||||
|
// Can be removed after ClientStructs Update since this is only needed for current EquipGearsetInternal [Signature]
|
||||||
|
interop.InitializeFromAttributes(this);
|
||||||
|
|
||||||
_moveItemHook.Enable();
|
_moveItemHook.Enable();
|
||||||
_equipGearsetHook.Enable();
|
_equipGearsetInternalHook.Enable();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
_moveItemHook.Dispose();
|
_moveItemHook.Dispose();
|
||||||
_equipGearsetHook.Dispose();
|
_equipGearsetInternalHook.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
private delegate int EquipGearsetDelegate(RaptureGearsetModule* module, int gearsetId, byte glamourPlateId);
|
// This is the internal function processed by all sources of Equipping a gearset, such as hotbar gearset application and command gearset application.
|
||||||
|
// Currently is pending to ClientStructs for integration. See: https://github.com/aers/FFXIVClientStructs/pull/1277
|
||||||
|
public const string EquipGearsetInternal = "40 55 53 56 57 41 57 48 8D AC 24 ?? ?? ?? ?? 48 81 EC ?? ?? ?? ?? 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 85 ?? ?? ?? ?? 4C 63 FA";
|
||||||
|
private delegate nint EquipGearsetInternalDelegate(RaptureGearsetModule* module, uint gearsetId, byte glamourPlateId);
|
||||||
|
|
||||||
private readonly Hook<EquipGearsetDelegate> _equipGearsetHook;
|
[Signature(EquipGearsetInternal, DetourName = nameof(EquipGearSetInternalDetour))]
|
||||||
|
private readonly Hook<EquipGearsetInternalDelegate> _equipGearsetInternalHook = null!;
|
||||||
|
|
||||||
private int EquipGearSetDetour(RaptureGearsetModule* module, int gearsetId, byte glamourPlateId)
|
private nint EquipGearSetInternalDetour(RaptureGearsetModule* module, uint gearsetId, byte glamourPlateId)
|
||||||
{
|
{
|
||||||
var prior = module->CurrentGearsetIndex;
|
var prior = module->CurrentGearsetIndex;
|
||||||
var ret = _equipGearsetHook.Original(module, gearsetId, glamourPlateId);
|
var ret = _equipGearsetInternalHook.Original(module, gearsetId, glamourPlateId);
|
||||||
var set = module->GetGearset(gearsetId);
|
var set = module->GetGearset((int)gearsetId);
|
||||||
_gearsetEvent.Invoke(new ByteString(set->Name).ToString(), gearsetId, prior, glamourPlateId, set->ClassJob);
|
_gearsetEvent.Invoke(new ByteString(set->Name).ToString(), (int)gearsetId, prior, glamourPlateId, set->ClassJob);
|
||||||
Glamourer.Log.Excessive($"[InventoryService] Applied gear set {gearsetId} with glamour plate {glamourPlateId} (Returned {ret})");
|
Glamourer.Log.Verbose($"[InventoryService] Applied gear set {gearsetId} with glamour plate {glamourPlateId} (Returned {ret})");
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
{
|
{
|
||||||
var entry = module->GetGearset(gearsetId);
|
var entry = module->GetGearset((int)gearsetId);
|
||||||
if (entry == null)
|
if (entry == null)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue