mirror of
https://github.com/xivdev/Penumbra.git
synced 2025-12-12 18:27:24 +01:00
Use ReadWriteDictionary as base for meta changes.
This commit is contained in:
parent
6d408ba695
commit
4117d45d15
4 changed files with 20 additions and 28 deletions
2
OtterGui
2
OtterGui
|
|
@ -1 +1 @@
|
||||||
Subproject commit 9217ac56697bc8285ced483b1fd4734fd36ba64d
|
Subproject commit bfbde4f8aa6acc8eb3ed8bc419d5ae2afc77b5f1
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
using OtterGui.Classes;
|
||||||
using OtterGui.Services;
|
using OtterGui.Services;
|
||||||
using Penumbra.GameData.Structs;
|
using Penumbra.GameData.Structs;
|
||||||
using Penumbra.Meta.Manipulations;
|
using Penumbra.Meta.Manipulations;
|
||||||
|
|
@ -5,7 +6,7 @@ using Penumbra.Mods.Editor;
|
||||||
|
|
||||||
namespace Penumbra.Collections.Cache;
|
namespace Penumbra.Collections.Cache;
|
||||||
|
|
||||||
public class GlobalEqpCache : Dictionary<GlobalEqpManipulation, IMod>, IService
|
public class GlobalEqpCache : ReadWriteDictionary<GlobalEqpManipulation, IMod>, IService
|
||||||
{
|
{
|
||||||
private readonly HashSet<PrimaryId> _doNotHideEarrings = [];
|
private readonly HashSet<PrimaryId> _doNotHideEarrings = [];
|
||||||
private readonly HashSet<PrimaryId> _doNotHideNecklace = [];
|
private readonly HashSet<PrimaryId> _doNotHideNecklace = [];
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ using Penumbra.GameData.Structs;
|
||||||
using Penumbra.Meta;
|
using Penumbra.Meta;
|
||||||
using Penumbra.Meta.Manipulations;
|
using Penumbra.Meta.Manipulations;
|
||||||
using Penumbra.Mods.Editor;
|
using Penumbra.Mods.Editor;
|
||||||
using Penumbra.String.Classes;
|
|
||||||
|
|
||||||
namespace Penumbra.Collections.Cache;
|
namespace Penumbra.Collections.Cache;
|
||||||
|
|
||||||
|
|
@ -16,6 +15,7 @@ public class MetaCache(MetaFileManager manager, ModCollection collection)
|
||||||
public readonly RspCache Rsp = new(manager, collection);
|
public readonly RspCache Rsp = new(manager, collection);
|
||||||
public readonly ImcCache Imc = new(manager, collection);
|
public readonly ImcCache Imc = new(manager, collection);
|
||||||
public readonly GlobalEqpCache GlobalEqp = new();
|
public readonly GlobalEqpCache GlobalEqp = new();
|
||||||
|
public bool IsDisposed { get; private set; }
|
||||||
|
|
||||||
public int Count
|
public int Count
|
||||||
=> Eqp.Count + Eqdp.Count + Est.Count + Gmp.Count + Rsp.Count + Imc.Count + GlobalEqp.Count;
|
=> Eqp.Count + Eqdp.Count + Est.Count + Gmp.Count + Rsp.Count + Imc.Count + GlobalEqp.Count;
|
||||||
|
|
@ -42,6 +42,10 @@ public class MetaCache(MetaFileManager manager, ModCollection collection)
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
|
if (IsDisposed)
|
||||||
|
return;
|
||||||
|
|
||||||
|
IsDisposed = true;
|
||||||
Eqp.Dispose();
|
Eqp.Dispose();
|
||||||
Eqdp.Dispose();
|
Eqdp.Dispose();
|
||||||
Est.Dispose();
|
Est.Dispose();
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
using OtterGui.Classes;
|
||||||
using Penumbra.Meta;
|
using Penumbra.Meta;
|
||||||
using Penumbra.Meta.Manipulations;
|
using Penumbra.Meta.Manipulations;
|
||||||
using Penumbra.Mods.Editor;
|
using Penumbra.Mods.Editor;
|
||||||
|
|
@ -5,27 +6,19 @@ using Penumbra.Mods.Editor;
|
||||||
namespace Penumbra.Collections.Cache;
|
namespace Penumbra.Collections.Cache;
|
||||||
|
|
||||||
public abstract class MetaCacheBase<TIdentifier, TEntry>(MetaFileManager manager, ModCollection collection)
|
public abstract class MetaCacheBase<TIdentifier, TEntry>(MetaFileManager manager, ModCollection collection)
|
||||||
: Dictionary<TIdentifier, (IMod Source, TEntry Entry)>
|
: ReadWriteDictionary<TIdentifier, (IMod Source, TEntry Entry)>
|
||||||
where TIdentifier : unmanaged, IMetaIdentifier
|
where TIdentifier : unmanaged, IMetaIdentifier
|
||||||
where TEntry : unmanaged
|
where TEntry : unmanaged
|
||||||
{
|
{
|
||||||
protected readonly MetaFileManager Manager = manager;
|
protected readonly MetaFileManager Manager = manager;
|
||||||
protected readonly ModCollection Collection = collection;
|
protected readonly ModCollection Collection = collection;
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
Dispose(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool ApplyMod(IMod source, TIdentifier identifier, TEntry entry)
|
public bool ApplyMod(IMod source, TIdentifier identifier, TEntry entry)
|
||||||
{
|
{
|
||||||
lock (this)
|
if (TryGetValue(identifier, out var pair) && pair.Source == source && EqualityComparer<TEntry>.Default.Equals(pair.Entry, entry))
|
||||||
{
|
return false;
|
||||||
if (TryGetValue(identifier, out var pair) && pair.Source == source && EqualityComparer<TEntry>.Default.Equals(pair.Entry, entry))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
this[identifier] = (source, entry);
|
this[identifier] = (source, entry);
|
||||||
}
|
|
||||||
|
|
||||||
ApplyModInternal(identifier, entry);
|
ApplyModInternal(identifier, entry);
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -33,17 +26,14 @@ public abstract class MetaCacheBase<TIdentifier, TEntry>(MetaFileManager manager
|
||||||
|
|
||||||
public bool RevertMod(TIdentifier identifier, [NotNullWhen(true)] out IMod? mod)
|
public bool RevertMod(TIdentifier identifier, [NotNullWhen(true)] out IMod? mod)
|
||||||
{
|
{
|
||||||
lock (this)
|
if (!Remove(identifier, out var pair))
|
||||||
{
|
{
|
||||||
if (!Remove(identifier, out var pair))
|
mod = null;
|
||||||
{
|
return false;
|
||||||
mod = null;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
mod = pair.Source;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod = pair.Source;
|
||||||
|
|
||||||
RevertModInternal(identifier);
|
RevertModInternal(identifier);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -54,7 +44,4 @@ public abstract class MetaCacheBase<TIdentifier, TEntry>(MetaFileManager manager
|
||||||
|
|
||||||
protected virtual void RevertModInternal(TIdentifier identifier)
|
protected virtual void RevertModInternal(TIdentifier identifier)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
protected virtual void Dispose(bool _)
|
|
||||||
{ }
|
|
||||||
}
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue