Make meta hooks respect Enable Mod setting and fix EQP composition.

This commit is contained in:
Ottermandias 2024-06-19 22:34:59 +02:00
parent a90e253c73
commit 29f8c91306
12 changed files with 121 additions and 33 deletions

View file

@ -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;
}
}