mirror of
https://github.com/xivdev/Penumbra.git
synced 2026-01-01 05:13:43 +01:00
69 lines
2.1 KiB
C#
69 lines
2.1 KiB
C#
using Penumbra.GameData.Structs;
|
|
using Penumbra.Meta.Files;
|
|
using Penumbra.Meta.Manipulations;
|
|
|
|
namespace Penumbra.Meta;
|
|
|
|
public class ImcChecker
|
|
{
|
|
private static readonly Dictionary<ImcIdentifier, int> VariantCounts = [];
|
|
private static MetaFileManager? _dataManager;
|
|
private static readonly ConcurrentDictionary<ImcIdentifier, CachedEntry> GlobalCachedDefaultEntries = [];
|
|
|
|
public static int GetVariantCount(ImcIdentifier identifier)
|
|
{
|
|
lock (VariantCounts)
|
|
{
|
|
if (VariantCounts.TryGetValue(identifier, out var count))
|
|
return count;
|
|
|
|
count = GetFile(identifier)?.Count ?? 0;
|
|
VariantCounts[identifier] = count;
|
|
|
|
return count;
|
|
}
|
|
}
|
|
|
|
public readonly record struct CachedEntry(ImcEntry Entry, bool FileExists, bool VariantExists);
|
|
|
|
public ImcChecker(MetaFileManager metaFileManager)
|
|
=> _dataManager = metaFileManager;
|
|
|
|
public static CachedEntry GetDefaultEntry(ImcIdentifier identifier, bool storeCache)
|
|
{
|
|
if (GlobalCachedDefaultEntries.TryGetValue(identifier, out var entry))
|
|
return entry;
|
|
|
|
if (_dataManager == null)
|
|
return new CachedEntry(default, false, false);
|
|
|
|
try
|
|
{
|
|
var e = ImcFile.GetDefault(_dataManager, identifier.GamePath(), identifier.EquipSlot, identifier.Variant, out var entryExists);
|
|
entry = new CachedEntry(e, true, entryExists);
|
|
}
|
|
catch (Exception)
|
|
{
|
|
entry = new CachedEntry(default, false, false);
|
|
}
|
|
|
|
if (storeCache)
|
|
GlobalCachedDefaultEntries.TryAdd(identifier, entry);
|
|
return entry;
|
|
}
|
|
|
|
private static ImcFile? GetFile(ImcIdentifier identifier)
|
|
{
|
|
if (_dataManager == null)
|
|
return null;
|
|
|
|
try
|
|
{
|
|
return new ImcFile(_dataManager, identifier);
|
|
}
|
|
catch
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
}
|