mirror of
https://github.com/xivdev/Penumbra.git
synced 2026-02-21 07:17:53 +01:00
Enable VFX for the glasses slot.
This commit is contained in:
parent
1d5a7a41ab
commit
db2ce1328f
2 changed files with 47 additions and 16 deletions
|
|
@ -1 +1 @@
|
||||||
Subproject commit 61e067857c2cf62bf8426ff6b305e37990f7767a
|
Subproject commit 2f6acca678b71203763ac4404c3f054747c14f75
|
||||||
|
|
@ -6,6 +6,7 @@ using Penumbra.Collections;
|
||||||
using Penumbra.GameData.Enums;
|
using Penumbra.GameData.Enums;
|
||||||
using Penumbra.GameData.Structs;
|
using Penumbra.GameData.Structs;
|
||||||
using Penumbra.Interop.PathResolving;
|
using Penumbra.Interop.PathResolving;
|
||||||
|
using static FFXIVClientStructs.FFXIV.Client.Game.Character.ActionEffectHandler;
|
||||||
|
|
||||||
namespace Penumbra.Interop.Hooks.Resources;
|
namespace Penumbra.Interop.Hooks.Resources;
|
||||||
|
|
||||||
|
|
@ -223,6 +224,12 @@ public sealed unsafe class ResolvePathHooksBase : IDisposable
|
||||||
[FieldOffset(2)]
|
[FieldOffset(2)]
|
||||||
public Variant Variant;
|
public Variant Variant;
|
||||||
|
|
||||||
|
[FieldOffset(8)]
|
||||||
|
public PrimaryId BonusModel;
|
||||||
|
|
||||||
|
[FieldOffset(10)]
|
||||||
|
public Variant BonusVariant;
|
||||||
|
|
||||||
[FieldOffset(20)]
|
[FieldOffset(20)]
|
||||||
public ushort VfxId;
|
public ushort VfxId;
|
||||||
|
|
||||||
|
|
@ -232,26 +239,50 @@ public sealed unsafe class ResolvePathHooksBase : IDisposable
|
||||||
|
|
||||||
private nint ResolveVfxHuman(nint drawObject, nint pathBuffer, nint pathBufferSize, uint slotIndex, nint unkOutParam)
|
private nint ResolveVfxHuman(nint drawObject, nint pathBuffer, nint pathBufferSize, uint slotIndex, nint unkOutParam)
|
||||||
{
|
{
|
||||||
if (slotIndex is <= 4 or >= 10)
|
switch (slotIndex)
|
||||||
return ResolveVfx(drawObject, pathBuffer, pathBufferSize, slotIndex, unkOutParam);
|
{
|
||||||
|
case <= 4: return ResolveVfx(drawObject, pathBuffer, pathBufferSize, slotIndex, unkOutParam);
|
||||||
|
case <= 10:
|
||||||
|
{
|
||||||
|
// Enable vfxs for accessories
|
||||||
|
var changedEquipData = (ChangedEquipData*)((Human*)drawObject)->ChangedEquipData;
|
||||||
|
if (changedEquipData == null)
|
||||||
|
return ResolveVfx(drawObject, pathBuffer, pathBufferSize, slotIndex, unkOutParam);
|
||||||
|
|
||||||
var changedEquipData = (ChangedEquipData*)((Human*)drawObject)->ChangedEquipData;
|
ref var slot = ref changedEquipData[slotIndex];
|
||||||
// Enable vfxs for accessories
|
|
||||||
if (changedEquipData == null)
|
|
||||||
return ResolveVfx(drawObject, pathBuffer, pathBufferSize, slotIndex, unkOutParam);
|
|
||||||
|
|
||||||
ref var slot = ref changedEquipData[slotIndex];
|
if (slot.Model == 0 || slot.Variant == 0 || slot.VfxId == 0)
|
||||||
|
return ResolveVfx(drawObject, pathBuffer, pathBufferSize, slotIndex, unkOutParam);
|
||||||
|
|
||||||
if (slot.Model == 0 || slot.Variant == 0 || slot.VfxId == 0)
|
if (!Utf8.TryWrite(new Span<byte>((void*)pathBuffer, (int)pathBufferSize),
|
||||||
return ResolveVfx(drawObject, pathBuffer, pathBufferSize, slotIndex, unkOutParam);
|
$"chara/accessory/a{slot.Model.Id:D4}/vfx/eff/va{slot.VfxId:D4}.avfx\0",
|
||||||
|
out _))
|
||||||
|
return ResolveVfx(drawObject, pathBuffer, pathBufferSize, slotIndex, unkOutParam);
|
||||||
|
|
||||||
if (!Utf8.TryWrite(new Span<byte>((void*)pathBuffer, (int)pathBufferSize),
|
*(ulong*)unkOutParam = 4;
|
||||||
$"chara/accessory/a{slot.Model.Id:D4}/vfx/eff/va{slot.VfxId:D4}.avfx\0",
|
return ResolvePath(drawObject, pathBuffer);
|
||||||
out _))
|
}
|
||||||
return ResolveVfx(drawObject, pathBuffer, pathBufferSize, slotIndex, unkOutParam);
|
case 16:
|
||||||
|
{
|
||||||
|
// Enable vfxs for glasses
|
||||||
|
var changedEquipData = (ChangedEquipData*)((Human*)drawObject)->ChangedEquipData;
|
||||||
|
if (changedEquipData == null)
|
||||||
|
return ResolveVfx(drawObject, pathBuffer, pathBufferSize, slotIndex, unkOutParam);
|
||||||
|
|
||||||
*(ulong*)unkOutParam = 4;
|
ref var slot = ref changedEquipData[slotIndex - 6];
|
||||||
return ResolvePath(drawObject, pathBuffer);
|
|
||||||
|
if (slot.BonusModel == 0 || slot.BonusVariant == 0 || slot.VfxId == 0)
|
||||||
|
return ResolveVfx(drawObject, pathBuffer, pathBufferSize, slotIndex, unkOutParam);
|
||||||
|
if (!Utf8.TryWrite(new Span<byte>((void*)pathBuffer, (int)pathBufferSize),
|
||||||
|
$"chara/equipment/e{slot.BonusModel.Id:D4}/vfx/eff/ve{slot.VfxId:D4}.avfx\0",
|
||||||
|
out _))
|
||||||
|
return ResolveVfx(drawObject, pathBuffer, pathBufferSize, slotIndex, unkOutParam);
|
||||||
|
|
||||||
|
*(ulong*)unkOutParam = 4;
|
||||||
|
return ResolvePath(drawObject, pathBuffer);
|
||||||
|
}
|
||||||
|
default: return ResolveVfx(drawObject, pathBuffer, pathBufferSize, slotIndex, unkOutParam);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private nint VFunc81(nint drawObject, int estType, nint unk)
|
private nint VFunc81(nint drawObject, int estType, nint unk)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue