Removed ActiveCollection since it is no longer needed.

This commit is contained in:
Ottermandias 2022-03-20 12:23:05 +01:00
parent 4888bc243f
commit 3ef3e75c6a
12 changed files with 48 additions and 136 deletions

View file

@ -1,5 +1,6 @@
using System;
using Dalamud.Logging;
using Dalamud.Utility.Signatures;
namespace Penumbra.Interop;
@ -7,16 +8,17 @@ namespace Penumbra.Interop;
// which will allow replacement of .scd files.
public unsafe class MusicManager
{
// The wildcard is the offset in framework to the MusicManager in Framework.
[Signature( "48 8B 8E ?? ?? ?? ?? 39 78 20 0F 94 C2 45 33 C0", ScanType = ScanType.Text )]
private readonly IntPtr _musicInitCallLocation = IntPtr.Zero;
private readonly IntPtr _musicManager;
public MusicManager()
{
var framework = Dalamud.Framework.Address.BaseAddress;
// The wildcard is the offset in framework to the MusicManager in Framework.
var musicInitCallLocation = Dalamud.SigScanner.ScanText( "48 8B 8E ?? ?? ?? ?? 39 78 20 0F 94 C2 45 33 C0" );
var musicManagerOffset = *( int* )( musicInitCallLocation + 3 );
PluginLog.Debug( "Found MusicInitCall location at 0x{Location:X16}. Framework offset for MusicManager is 0x{Offset:X8}",
musicInitCallLocation.ToInt64(), musicManagerOffset );
SignatureHelper.Initialise( this );
var framework = Dalamud.Framework.Address.BaseAddress;
var musicManagerOffset = *( int* )( _musicInitCallLocation + 3 );
_musicManager = *( IntPtr* )( framework + musicManagerOffset );
PluginLog.Debug( "MusicManager found at 0x{Location:X16}", _musicManager.ToInt64() );
}

View file

@ -48,13 +48,11 @@ public unsafe class ObjectReloader : IDisposable
if( _currentObjectName != null && _mods.Collections.CharacterCollection.TryGetValue( _currentObjectName, out var collection ) )
{
_changedSettings = true;
_mods.Collections.SetActiveCollection( collection, _currentObjectName );
}
}
private void RestoreSettings()
{
_mods.Collections.ResetActiveCollection();
_changedSettings = false;
}

View file

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using Dalamud.Logging;
using Lumina.Excel.GeneratedSheets;
using Penumbra.Mod;
using Penumbra.Util;
@ -25,14 +26,15 @@ public class CollectionManager
{
private readonly ModManager _manager;
public string CollectionChangedTo { get; private set; } = string.Empty;
public Dictionary< string, ModCollection > Collections { get; } = new(StringComparer.InvariantCultureIgnoreCase);
public Dictionary< string, ModCollection > CharacterCollection { get; } = new();
public ModCollection CurrentCollection { get; private set; } = ModCollection.Empty;
public ModCollection DefaultCollection { get; private set; } = ModCollection.Empty;
public ModCollection ForcedCollection { get; private set; } = ModCollection.Empty;
public ModCollection ActiveCollection { get; private set; } = ModCollection.Empty;
public bool IsActive( ModCollection collection )
=> ReferenceEquals( collection, DefaultCollection ) || ReferenceEquals( collection, ForcedCollection );
// Is invoked after the collections actually changed.
public event CollectionChangeDelegate? CollectionChanged;
@ -43,34 +45,8 @@ public class CollectionManager
ReadCollections();
LoadConfigCollections( Penumbra.Config );
SetActiveCollection( DefaultCollection, string.Empty );
}
public bool SetActiveCollection( ModCollection newActive, string name )
{
CollectionChangedTo = name;
if( newActive == ActiveCollection )
{
return false;
}
if( ActiveCollection.Cache?.MetaManipulations.Count > 0 || newActive.Cache?.MetaManipulations.Count > 0 )
{
ActiveCollection = newActive;
Penumbra.ResidentResources.Reload();
ActiveCollection.SetFiles();
}
else
{
ActiveCollection = newActive;
}
return true;
}
public bool ResetActiveCollection()
=> SetActiveCollection( DefaultCollection, string.Empty );
public void CreateNecessaryCaches()
{
AddCache( DefaultCollection );
@ -121,7 +97,7 @@ public class CollectionManager
}
}
if( reloadMeta && ActiveCollection.Settings.TryGetValue( mod.BasePath.Name, out var config ) && config.Enabled )
if( reloadMeta && DefaultCollection.Settings.TryGetValue( mod.BasePath.Name, out var config ) && config.Enabled )
{
Penumbra.ResidentResources.Reload();
}
@ -130,7 +106,7 @@ public class CollectionManager
public bool AddCollection( string name, Dictionary< string, ModSettings > settings )
{
var nameFixed = name.RemoveInvalidPathSymbols().ToLowerInvariant();
if( nameFixed == string.Empty || Collections.Values.Any( c => c.Name.RemoveInvalidPathSymbols().ToLowerInvariant() == nameFixed ) )
if( nameFixed.Length == 0 || Collections.Values.Any( c => c.Name.RemoveInvalidPathSymbols().ToLowerInvariant() == nameFixed ) )
{
PluginLog.Warning( $"The new collection {name} would lead to the same path as one that already exists." );
return false;
@ -232,29 +208,21 @@ public class CollectionManager
case CollectionType.Default:
DefaultCollection = newCollection;
Penumbra.Config.DefaultCollection = newCollection.Name;
if( CollectionChangedTo.Length == 0 )
{
SetActiveCollection( newCollection, string.Empty );
}
Penumbra.ResidentResources.Reload();
DefaultCollection.SetFiles();
break;
case CollectionType.Forced:
ForcedCollection = newCollection;
Penumbra.Config.ForcedCollection = newCollection.Name;
Penumbra.ResidentResources.Reload();
break;
case CollectionType.Current:
CurrentCollection = newCollection;
Penumbra.Config.CurrentCollection = newCollection.Name;
break;
case CollectionType.Character:
if( CollectionChangedTo == characterName && CharacterCollection.ContainsKey( characterName ) )
{
SetActiveCollection( newCollection, CollectionChangedTo );
}
CharacterCollection[ characterName! ] = newCollection;
Penumbra.Config.CharacterCollections[ characterName! ] = newCollection.Name;
break;
}

View file

@ -6,8 +6,6 @@ using System.IO;
using System.Linq;
using Dalamud.Logging;
using Penumbra.GameData.ByteString;
using Penumbra.GameData.Util;
using Penumbra.Interop.Structs;
using Penumbra.Meta.Manager;
using Penumbra.Mod;
using Penumbra.Util;
@ -138,20 +136,20 @@ public class ModCollection
}
}
public void CalculateEffectiveFileList( bool withMetaManipulations, bool activeCollection )
public void CalculateEffectiveFileList( bool withMetaManipulations, bool reloadResident )
{
PluginLog.Debug( "Recalculating effective file list for {CollectionName} [{WithMetaManipulations}] [{IsActiveCollection}]", Name,
withMetaManipulations, activeCollection );
PluginLog.Debug( "Recalculating effective file list for {CollectionName} [{WithMetaManipulations}]", Name, withMetaManipulations );
Cache ??= new ModCollectionCache( this );
UpdateSettings( false );
Cache.CalculateEffectiveFileList();
if( withMetaManipulations )
{
Cache.UpdateMetaManipulations();
if( activeCollection )
{
Penumbra.ResidentResources.Reload();
}
}
if( reloadResident )
{
Penumbra.ResidentResources.Reload();
}
}

View file

@ -248,7 +248,7 @@ public class ModManager
public FullPath? ResolveSwappedOrReplacementPath( Utf8GamePath gameResourcePath )
{
var ret = Collections.ActiveCollection.ResolveSwappedOrReplacementPath( gameResourcePath );
var ret = Collections.DefaultCollection.ResolveSwappedOrReplacementPath( gameResourcePath );
ret ??= Collections.ForcedCollection.ResolveSwappedOrReplacementPath( gameResourcePath );
return ret;
}

View file

@ -205,7 +205,7 @@ public static class ModManagerEditExtensions
if( collection.Cache != null && settings.Enabled )
{
collection.CalculateEffectiveFileList( mod.Resources.MetaManipulations.Count > 0,
collection == manager.Collections.ActiveCollection );
manager.Collections.IsActive( collection ) );
}
}
}

View file

@ -26,8 +26,8 @@ public partial class SettingsInterface
}
var modManager = Penumbra.ModManager;
var items = modManager.Collections.ActiveCollection.Cache?.ChangedItems ?? new Dictionary< string, object? >();
var forced = modManager.Collections.ForcedCollection.Cache?.ChangedItems ?? new Dictionary< string, object? >();
var items = modManager.Collections.DefaultCollection.Cache?.ChangedItems ?? new Dictionary< string, object? >();
var forced = modManager.Collections.ForcedCollection.Cache?.ChangedItems ?? new Dictionary< string, object? >();
using var raii = ImGuiRaii.DeferredEnd( ImGui.EndTabItem );

View file

@ -6,7 +6,9 @@ using System.Numerics;
using System.Reflection;
using System.Runtime.InteropServices;
using Dalamud.Game.ClientState.Objects.Types;
using Dalamud.Interface;
using ImGuiNET;
using Lumina.Excel.GeneratedSheets;
using Penumbra.Api;
using Penumbra.GameData.Enums;
using Penumbra.GameData.Structs;
@ -47,8 +49,6 @@ public partial class SettingsInterface
using var raii = ImGuiRaii.DeferredEnd( ImGui.EndTable );
var manager = Penumbra.ModManager;
PrintValue( "Active Collection", manager.Collections.ActiveCollection.Name );
PrintValue( " has Cache", ( manager.Collections.ActiveCollection.Cache != null ).ToString() );
PrintValue( "Current Collection", manager.Collections.CurrentCollection.Name );
PrintValue( " has Cache", ( manager.Collections.CurrentCollection.Cache != null ).ToString() );
PrintValue( "Default Collection", manager.Collections.DefaultCollection.Name );
@ -287,59 +287,6 @@ public partial class SettingsInterface
return;
}
var eqp = 0;
ImGui.InputInt( "##EqpInput", ref eqp );
try
{
var def = ExpandedEqpFile.GetDefault( eqp );
var val = Penumbra.ModManager.Collections.ActiveCollection.Cache?.MetaManipulations.Eqp.File?[ eqp ] ?? def;
ImGui.Text( Convert.ToString( ( long )def, 2 ).PadLeft( 64, '0' ) );
ImGui.Text( Convert.ToString( ( long )val, 2 ).PadLeft( 64, '0' ) );
}
catch
{ }
var eqdp = 0;
ImGui.InputInt( "##EqdpInput", ref eqdp );
try
{
var def = ExpandedEqdpFile.GetDefault( GenderRace.MidlanderMale, false, eqdp );
var val =
Penumbra.ModManager.Collections.ActiveCollection.Cache?.MetaManipulations.Eqdp.File( GenderRace.MidlanderMale, false )?[ eqdp ]
?? def;
ImGui.Text( Convert.ToString( ( ushort )def, 2 ).PadLeft( 16, '0' ) );
ImGui.Text( Convert.ToString( ( ushort )val, 2 ).PadLeft( 16, '0' ) );
}
catch
{ }
var est = 0;
ImGui.InputInt( "##EstInput", ref est );
try
{
var def = EstFile.GetDefault( EstManipulation.EstType.Body, GenderRace.MidlanderFemale, ( ushort )est );
var val = Penumbra.ModManager.Collections.ActiveCollection.Cache?.MetaManipulations.Est.BodyFile?[ GenderRace.MidlanderFemale,
( ushort )est ]
?? def;
ImGui.Text( def.ToString() );
ImGui.Text( val.ToString() );
}
catch
{ }
var gmp = 0;
ImGui.InputInt( "##GmpInput", ref gmp );
try
{
var def = ExpandedGmpFile.GetDefault( gmp );
var val = Penumbra.ModManager.Collections.ActiveCollection.Cache?.MetaManipulations.Gmp.File?[ gmp ] ?? def;
ImGui.Text( def.Value.ToString( "X" ) );
ImGui.Text( val.Value.ToString( "X" ) );
}
catch
{ }
if( !ImGui.BeginTable( "##CharacterUtilityDebugList", 6, ImGuiTableFlags.RowBg | ImGuiTableFlags.SizingFixedFit, -Vector2.UnitX ) )
{
return;

View file

@ -14,7 +14,7 @@ public partial class SettingsInterface
{
private class TabEffective
{
private const string LabelTab = "Effective Changes";
private const string LabelTab = "Effective Changes";
private string _gamePathFilter = string.Empty;
private string _gamePathFilterLower = string.Empty;
@ -140,17 +140,17 @@ public partial class SettingsInterface
const ImGuiTableFlags flags = ImGuiTableFlags.RowBg | ImGuiTableFlags.ScrollX;
var modManager = Penumbra.ModManager;
var activeCollection = modManager.Collections.ActiveCollection.Cache;
var forcedCollection = modManager.Collections.ForcedCollection.Cache;
var modManager = Penumbra.ModManager;
var defaultCollection = modManager.Collections.DefaultCollection.Cache;
var forcedCollection = modManager.Collections.ForcedCollection.Cache;
var (activeResolved, activeMeta) = activeCollection != null
? ( activeCollection.ResolvedFiles.Count, activeCollection.MetaManipulations.Count )
var (defaultResolved, defaultMeta) = defaultCollection != null
? ( defaultCollection.ResolvedFiles.Count, defaultCollection.MetaManipulations.Count )
: ( 0, 0 );
var (forcedResolved, forcedMeta) = forcedCollection != null
? ( forcedCollection.ResolvedFiles.Count, forcedCollection.MetaManipulations.Count )
: ( 0, 0 );
var totalLines = activeResolved + forcedResolved + activeMeta + forcedMeta;
var totalLines = defaultResolved + forcedResolved + defaultMeta + forcedMeta;
if( totalLines == 0 )
{
return;
@ -166,7 +166,7 @@ public partial class SettingsInterface
if( _filePathFilter.Length > 0 || _gamePathFilter.Length > 0 )
{
DrawFilteredRows( activeCollection, forcedCollection );
DrawFilteredRows( defaultCollection, forcedCollection );
}
else
{
@ -185,18 +185,18 @@ public partial class SettingsInterface
{
var row = actualRow;
ImGui.TableNextRow();
if( row < activeResolved )
if( row < defaultResolved )
{
var (gamePath, file) = activeCollection!.ResolvedFiles.ElementAt( row );
var (gamePath, file) = defaultCollection!.ResolvedFiles.ElementAt( row );
DrawLine( gamePath, file );
}
else if( ( row -= activeResolved ) < activeMeta )
else if( ( row -= defaultResolved ) < defaultMeta )
{
// TODO
//var (manip, mod) = activeCollection!.MetaManipulations.Manipulations.ElementAt( row );
DrawLine( 0.ToString(), 0.ToString() );
}
else if( ( row -= activeMeta ) < forcedResolved )
else if( ( row -= defaultMeta ) < forcedResolved )
{
var (gamePath, file) = forcedCollection!.ResolvedFiles.ElementAt( row );
DrawLine( gamePath, file );
@ -204,7 +204,7 @@ public partial class SettingsInterface
else
{
// TODO
row -= forcedResolved;
row -= forcedResolved;
//var (manip, mod) = forcedCollection!.MetaManipulations.Manipulations.ElementAt( row );
DrawLine( 0.ToString(), 0.ToString() );
}

View file

@ -426,7 +426,7 @@ public partial class SettingsInterface
foreach( var collection in modManager.Collections.Collections.Values
.Where( c => c.Cache != null && c.Settings[ Mod!.Data.BasePath.Name ].Enabled ) )
{
collection.CalculateEffectiveFileList( false, collection == modManager.Collections.ActiveCollection );
collection.CalculateEffectiveFileList( false, modManager.Collections.IsActive( collection ) );
}
// If the mod is enabled in the current collection, its conflicts may have changed.

View file

@ -529,7 +529,7 @@ public partial class SettingsInterface
var collection = Penumbra.ModManager.Collections.CurrentCollection;
if( collection.Cache != null )
{
collection.CalculateEffectiveFileList( metaManips, collection == Penumbra.ModManager.Collections.ActiveCollection );
collection.CalculateEffectiveFileList( metaManips, Penumbra.ModManager.Collections.IsActive( collection ) );
}
collection.Save();
@ -602,8 +602,8 @@ public partial class SettingsInterface
public Selector( SettingsInterface ui, IReadOnlySet< string > newMods )
{
_base = ui;
Cache = new ModListCache( Penumbra.ModManager, newMods );
_base = ui;
Cache = new ModListCache( Penumbra.ModManager, newMods );
}
private void DrawCollectionButton( string label, string tooltipLabel, float size, ModCollection collection )

View file

@ -68,8 +68,7 @@ public partial class SettingsInterface : IDisposable
var current = modManager.Collections.CurrentCollection;
if( current.Cache != null )
{
current.CalculateEffectiveFileList( recalculateMeta,
current == modManager.Collections.ActiveCollection );
current.CalculateEffectiveFileList( recalculateMeta, modManager.Collections.IsActive( current ) );
_menu.InstalledTab.Selector.Cache.TriggerFilterReset();
}
}