diff --git a/Penumbra/Collections/Cache/EqpCache.cs b/Penumbra/Collections/Cache/EqpCache.cs
index 599ae588..8dde9aba 100644
--- a/Penumbra/Collections/Cache/EqpCache.cs
+++ b/Penumbra/Collections/Cache/EqpCache.cs
@@ -1,3 +1,4 @@
+using Penumbra.GameData.Enums;
using Penumbra.GameData.Structs;
using Penumbra.Interop.Services;
using Penumbra.Interop.Structs;
@@ -28,6 +29,17 @@ public sealed class EqpCache(MetaFileManager manager, ModCollection collection)
Penumbra.Log.Verbose($"{Collection.AnonymizedName}: Loaded {Count} delayed EQP manipulations.");
}
+ 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);
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
+ private EqpEntry GetSingleValue(PrimaryId id, EquipSlot slot)
+ => TryGetValue(new EqpIdentifier(id, slot), out var pair) ? pair.Entry : ExpandedEqpFile.GetDefault(manager, id) & Eqp.Mask(slot);
+
public MetaList.MetaReverter TemporarilySetFile()
=> Manager.TemporarilySetFile(_eqpFile, MetaIndex.Eqp);
diff --git a/Penumbra/Collections/Cache/MetaCache.cs b/Penumbra/Collections/Cache/MetaCache.cs
index bc6ef34d..45a85d0f 100644
--- a/Penumbra/Collections/Cache/MetaCache.cs
+++ b/Penumbra/Collections/Cache/MetaCache.cs
@@ -1,4 +1,3 @@
-using System.IO.Pipes;
using Penumbra.GameData.Enums;
using Penumbra.GameData.Structs;
using Penumbra.Interop.Services;
@@ -146,9 +145,6 @@ public class MetaCache(MetaFileManager manager, ModCollection collection)
public void SetImcFiles(bool fromFullCompute)
=> Imc.SetFiles(fromFullCompute);
- public MetaList.MetaReverter TemporarilySetEqpFile()
- => Eqp.TemporarilySetFile();
-
public MetaList.MetaReverter? TemporarilySetEqdpFile(GenderRace genderRace, bool accessory)
=> Eqdp.TemporarilySetFile(genderRace, accessory);
@@ -161,10 +157,6 @@ public class MetaCache(MetaFileManager manager, ModCollection collection)
public MetaList.MetaReverter TemporarilySetEstFile(EstType type)
=> Est.TemporarilySetFiles(type);
- public unsafe EqpEntry ApplyGlobalEqp(EqpEntry baseEntry, CharacterArmor* armor)
- => GlobalEqp.Apply(baseEntry, armor);
-
-
/// Try to obtain a manipulated IMC file.
public bool GetImcFile(Utf8GamePath path, [NotNullWhen(true)] out Meta.Files.ImcFile? file)
=> Imc.GetFile(path, out file);
diff --git a/Penumbra/Collections/ModCollection.Cache.Access.cs b/Penumbra/Collections/ModCollection.Cache.Access.cs
index 484d4dd2..3e3386ea 100644
--- a/Penumbra/Collections/ModCollection.Cache.Access.cs
+++ b/Penumbra/Collections/ModCollection.Cache.Access.cs
@@ -100,10 +100,6 @@ public partial class ModCollection
return idx >= 0 ? utility.TemporarilyResetResource(idx) : null;
}
- public MetaList.MetaReverter TemporarilySetEqpFile(CharacterUtility utility)
- => _cache?.Meta.TemporarilySetEqpFile()
- ?? utility.TemporarilyResetResource(MetaIndex.Eqp);
-
public MetaList.MetaReverter TemporarilySetGmpFile(CharacterUtility utility)
=> _cache?.Meta.TemporarilySetGmpFile()
?? utility.TemporarilyResetResource(MetaIndex.Gmp);
@@ -115,7 +111,4 @@ public partial class ModCollection
public MetaList.MetaReverter TemporarilySetEstFile(CharacterUtility utility, EstType type)
=> _cache?.Meta.TemporarilySetEstFile(type)
?? utility.TemporarilyResetResource((MetaIndex)type);
-
- public unsafe EqpEntry ApplyGlobalEqp(EqpEntry baseEntry, CharacterArmor* armor)
- => _cache?.Meta.ApplyGlobalEqp(baseEntry, armor) ?? baseEntry;
}
diff --git a/Penumbra/Interop/Hooks/Meta/EqpHook.cs b/Penumbra/Interop/Hooks/Meta/EqpHook.cs
index 6663c211..448605c1 100644
--- a/Penumbra/Interop/Hooks/Meta/EqpHook.cs
+++ b/Penumbra/Interop/Hooks/Meta/EqpHook.cs
@@ -19,11 +19,10 @@ public unsafe class EqpHook : FastHook
private void Detour(CharacterUtility* utility, EqpEntry* flags, CharacterArmor* armor)
{
- if (_metaState.EqpCollection.Valid)
+ if (_metaState.EqpCollection is { Valid: true, ModCollection.MetaCache: { } cache })
{
- using var eqp = _metaState.ResolveEqpData(_metaState.EqpCollection.ModCollection);
- Task.Result.Original(utility, flags, armor);
- *flags = _metaState.EqpCollection.ModCollection.ApplyGlobalEqp(*flags, armor);
+ *flags = cache.Eqp.GetValues(armor);
+ *flags = cache.GlobalEqp.Apply(*flags, armor);
}
else
{
diff --git a/Penumbra/Interop/PathResolving/MetaState.cs b/Penumbra/Interop/PathResolving/MetaState.cs
index 6fa5c263..de7912e0 100644
--- a/Penumbra/Interop/PathResolving/MetaState.cs
+++ b/Penumbra/Interop/PathResolving/MetaState.cs
@@ -47,6 +47,8 @@ public sealed unsafe class MetaState : IDisposable
public ResolveData CustomizeChangeCollection = ResolveData.Invalid;
public ResolveData EqpCollection = ResolveData.Invalid;
+ public ResolveData GmpCollection = ResolveData.Invalid;
+ public PrimaryId UndividedGmpId = 0;
private ResolveData _lastCreatedCollection = ResolveData.Invalid;
private DisposableContainer _characterBaseCreateMetaChanges = DisposableContainer.Empty;
@@ -93,9 +95,6 @@ public sealed unsafe class MetaState : IDisposable
_ => DisposableContainer.Empty,
};
- public MetaList.MetaReverter ResolveEqpData(ModCollection collection)
- => collection.TemporarilySetEqpFile(_characterUtility);
-
public MetaList.MetaReverter ResolveGmpData(ModCollection collection)
=> collection.TemporarilySetGmpFile(_characterUtility);
diff --git a/Penumbra/UI/ConfigWindow.cs b/Penumbra/UI/ConfigWindow.cs
index 9ae11fc3..0ae16f6d 100644
--- a/Penumbra/UI/ConfigWindow.cs
+++ b/Penumbra/UI/ConfigWindow.cs
@@ -4,6 +4,7 @@ using ImGuiNET;
using OtterGui;
using OtterGui.Custom;
using OtterGui.Raii;
+using OtterGui.Text;
using Penumbra.Api.Enums;
using Penumbra.Services;
using Penumbra.UI.Classes;
@@ -144,7 +145,7 @@ public sealed class ConfigWindow : Window
using var color = ImRaii.PushColor(ImGuiCol.Text, Colors.RegexWarningBorder);
ImGui.NewLine();
ImGui.NewLine();
- ImGuiUtil.TextWrapped(text);
+ ImUtf8.TextWrapped(text);
color.Pop();
ImGui.NewLine();