From 62d3053d345dff7c277586e79f879d9b57a27b04 Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Sun, 25 Sep 2022 18:34:12 +0200 Subject: [PATCH] Fix some meta bugs. --- .../Collections/CollectionManager.Active.cs | 2 +- Penumbra/Collections/ModCollection.Cache.cs | 6 +-- Penumbra/Interop/CharacterUtility.List.cs | 44 ++++++++++++------- .../Interop/Resolver/PathResolver.Meta.cs | 6 +-- 4 files changed, 35 insertions(+), 23 deletions(-) diff --git a/Penumbra/Collections/CollectionManager.Active.cs b/Penumbra/Collections/CollectionManager.Active.cs index 12b42e91..dcadb979 100644 --- a/Penumbra/Collections/CollectionManager.Active.cs +++ b/Penumbra/Collections/CollectionManager.Active.cs @@ -97,7 +97,7 @@ public partial class ModCollection { case CollectionType.Default: Default = newCollection; - if( Penumbra.CharacterUtility.Ready ) + if( Penumbra.CharacterUtility.Ready && Penumbra.Config.EnableMods) { Penumbra.ResidentResources.Reload(); Default.SetFiles(); diff --git a/Penumbra/Collections/ModCollection.Cache.cs b/Penumbra/Collections/ModCollection.Cache.cs index 9d0be99a..d2bb2d92 100644 --- a/Penumbra/Collections/ModCollection.Cache.cs +++ b/Penumbra/Collections/ModCollection.Cache.cs @@ -177,7 +177,7 @@ public partial class ModCollection ++_collection.ChangeCounter; - if( _collection == Penumbra.CollectionManager.Default && Penumbra.CharacterUtility.Ready ) + if( _collection == Penumbra.CollectionManager.Default && Penumbra.CharacterUtility.Ready && Penumbra.Config.EnableMods ) { Penumbra.ResidentResources.Reload(); MetaManipulations.SetFiles(); @@ -239,7 +239,7 @@ public partial class ModCollection if( addMetaChanges ) { ++_collection.ChangeCounter; - if( _collection == Penumbra.CollectionManager.Default && Penumbra.CharacterUtility.Ready ) + if( _collection == Penumbra.CollectionManager.Default && Penumbra.CharacterUtility.Ready && Penumbra.Config.EnableMods ) { Penumbra.ResidentResources.Reload(); MetaManipulations.SetFiles(); @@ -297,7 +297,7 @@ public partial class ModCollection AddMetaFiles(); } - if( _collection == Penumbra.CollectionManager.Default && Penumbra.CharacterUtility.Ready ) + if( _collection == Penumbra.CollectionManager.Default && Penumbra.CharacterUtility.Ready && Penumbra.Config.EnableMods ) { Penumbra.ResidentResources.Reload(); MetaManipulations.SetFiles(); diff --git a/Penumbra/Interop/CharacterUtility.List.cs b/Penumbra/Interop/CharacterUtility.List.cs index 1e33592b..a73d87aa 100644 --- a/Penumbra/Interop/CharacterUtility.List.cs +++ b/Penumbra/Interop/CharacterUtility.List.cs @@ -11,7 +11,7 @@ public unsafe partial class CharacterUtility public readonly InternalIndex Index; public readonly Structs.CharacterUtility.Index GlobalIndex; - public IReadOnlyCollection< MetaReverter > Entries + public IReadOnlyCollection< MetaReverter > Entries => _entries; private IntPtr _defaultResourceData = IntPtr.Zero; @@ -95,8 +95,14 @@ public unsafe partial class CharacterUtility { if( _entries.Count > 0 ) { + foreach( var entry in _entries ) + { + entry.Disposed = true; + } + _entries.Clear(); } + ResetResourceInternal(); } @@ -106,6 +112,7 @@ public unsafe partial class CharacterUtility public readonly IntPtr Data; public readonly int Length; public readonly bool Resetter; + public bool Disposed; public MetaReverter( List list, IntPtr data, int length ) { @@ -124,29 +131,34 @@ public unsafe partial class CharacterUtility public void Dispose() { - var list = List._entries; - var wasCurrent = ReferenceEquals( this, list.First?.Value ); - list.Remove( this ); - if( !wasCurrent ) + if( !Disposed ) { - return; - } + var list = List._entries; + var wasCurrent = ReferenceEquals( this, list.First?.Value ); + list.Remove( this ); + if( !wasCurrent ) + { + return; + } - if( list.Count == 0 ) - { - List.SetResourceToDefaultCollection(); - } - else - { - var next = list.First!.Value; - if( next.Resetter ) + if( list.Count == 0 ) { List.SetResourceToDefaultCollection(); } else { - List.SetResourceInternal( next.Data, next.Length ); + var next = list.First!.Value; + if( next.Resetter ) + { + List.SetResourceToDefaultCollection(); + } + else + { + List.SetResourceInternal( next.Data, next.Length ); + } } + + Disposed = true; } } } diff --git a/Penumbra/Interop/Resolver/PathResolver.Meta.cs b/Penumbra/Interop/Resolver/PathResolver.Meta.cs index 1121cb29..0496d8fb 100644 --- a/Penumbra/Interop/Resolver/PathResolver.Meta.cs +++ b/Penumbra/Interop/Resolver/PathResolver.Meta.cs @@ -165,7 +165,7 @@ public unsafe partial class PathResolver private byte SetupVisorDetour( IntPtr drawObject, ushort modelId, byte visorState ) { var resolveData = GetResolveData( drawObject ); - using var eqp = resolveData.Valid ? resolveData.ModCollection.TemporarilySetGmpFile() : null; + using var gmp = resolveData.Valid ? resolveData.ModCollection.TemporarilySetGmpFile() : null; return _setupVisorHook.Original( drawObject, modelId, visorState ); } @@ -184,7 +184,7 @@ public unsafe partial class PathResolver else { var resolveData = GetResolveData( drawObject ); - using var eqp = resolveData.Valid ? resolveData.ModCollection.TemporarilySetCmpFile() : null; + using var cmp = resolveData.Valid ? resolveData.ModCollection.TemporarilySetCmpFile() : null; _rspSetupCharacterHook.Original( drawObject, unk2, unk3, unk4, unk5 ); } } @@ -200,7 +200,7 @@ public unsafe partial class PathResolver { _inChangeCustomize = true; var resolveData = GetResolveData( human ); - using var eqp = resolveData.Valid ? resolveData.ModCollection.TemporarilySetEqpFile() : null; + using var cmp = resolveData.Valid ? resolveData.ModCollection.TemporarilySetCmpFile() : null; using var decals = resolveData.Valid ? new CharacterUtility.DecalReverter( resolveData.ModCollection, DrawObjectState.UsesDecal( 0, data ) ) : null;