mirror of
https://github.com/xivdev/Penumbra.git
synced 2026-01-03 06:13:45 +01:00
Make meta hooks respect Enable Mod setting and fix EQP composition.
This commit is contained in:
parent
a90e253c73
commit
29f8c91306
12 changed files with 121 additions and 33 deletions
|
|
@ -9,11 +9,24 @@ namespace Penumbra.Collections.Cache;
|
|||
public sealed class EqpCache(MetaFileManager manager, ModCollection collection) : MetaCacheBase<EqpIdentifier, EqpEntry>(manager, collection)
|
||||
{
|
||||
public unsafe EqpEntry GetValues(CharacterArmor* armor)
|
||||
=> GetSingleValue(armor[0].Set, EquipSlot.Head)
|
||||
| GetSingleValue(armor[1].Set, EquipSlot.Body)
|
||||
| GetSingleValue(armor[2].Set, EquipSlot.Hands)
|
||||
| GetSingleValue(armor[3].Set, EquipSlot.Legs)
|
||||
| GetSingleValue(armor[4].Set, EquipSlot.Feet);
|
||||
{
|
||||
var bodyEntry = GetSingleValue(armor[1].Set, EquipSlot.Body);
|
||||
var headEntry = bodyEntry.HasFlag(EqpEntry.BodyShowHead)
|
||||
? GetSingleValue(armor[0].Set, EquipSlot.Head)
|
||||
: GetSingleValue(armor[1].Set, EquipSlot.Head);
|
||||
var handEntry = bodyEntry.HasFlag(EqpEntry.BodyShowHand)
|
||||
? GetSingleValue(armor[2].Set, EquipSlot.Hands)
|
||||
: GetSingleValue(armor[1].Set, EquipSlot.Hands);
|
||||
var (legsEntry, legsId) = bodyEntry.HasFlag(EqpEntry.BodyShowLeg)
|
||||
? (GetSingleValue(armor[3].Set, EquipSlot.Legs), 3)
|
||||
: (GetSingleValue(armor[1].Set, EquipSlot.Legs), 1);
|
||||
var footEntry = legsEntry.HasFlag(EqpEntry.LegsShowFoot)
|
||||
? GetSingleValue(armor[4].Set, EquipSlot.Feet)
|
||||
: GetSingleValue(armor[legsId].Set, EquipSlot.Feet);
|
||||
|
||||
var combined = bodyEntry | headEntry | handEntry | legsEntry | footEntry;
|
||||
return PostProcessFeet(PostProcessHands(combined));
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||
private EqpEntry GetSingleValue(PrimaryId id, EquipSlot slot)
|
||||
|
|
@ -24,4 +37,30 @@ public sealed class EqpCache(MetaFileManager manager, ModCollection collection)
|
|||
|
||||
protected override void Dispose(bool _)
|
||||
=> Clear();
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||
private static EqpEntry PostProcessHands(EqpEntry entry)
|
||||
{
|
||||
if (!entry.HasFlag(EqpEntry.HandsHideForearm))
|
||||
return entry;
|
||||
|
||||
var testFlag = entry.HasFlag(EqpEntry.HandsHideElbow)
|
||||
? entry.HasFlag(EqpEntry.BodyHideGlovesL)
|
||||
: entry.HasFlag(EqpEntry.BodyHideGlovesM);
|
||||
return testFlag
|
||||
? (entry | EqpEntry._4) & ~EqpEntry.BodyHideGlovesS
|
||||
: entry & ~(EqpEntry._4 | EqpEntry.BodyHideGlovesS);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
|
||||
private static EqpEntry PostProcessFeet(EqpEntry entry)
|
||||
{
|
||||
if (!entry.HasFlag(EqpEntry.FeetHideCalf))
|
||||
return entry;
|
||||
|
||||
if (entry.HasFlag(EqpEntry.FeetHideKnee) || !entry.HasFlag(EqpEntry._20))
|
||||
return entry & ~(EqpEntry.LegsHideBootsS | EqpEntry.LegsHideBootsM);
|
||||
|
||||
return (entry | EqpEntry.LegsHideBootsM) & ~EqpEntry.LegsHideBootsS;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue