mirror of
https://github.com/xivdev/Penumbra.git
synced 2026-02-23 00:07:53 +01:00
Change cache reloading and conflicts to actually keep the effective mod and not force full recalculations on every change.
This commit is contained in:
parent
ee87098386
commit
4b036c6c26
29 changed files with 778 additions and 457 deletions
|
|
@ -81,6 +81,7 @@ public partial class Mod
|
|||
var mod = this[ idx ];
|
||||
var oldName = mod.Name;
|
||||
|
||||
ModPathChanged.Invoke(ModPathChangeType.StartingReload, mod, mod.ModPath, mod.ModPath );
|
||||
if( !mod.Reload( out var metaChange ) )
|
||||
{
|
||||
PluginLog.Warning( mod.Name.Length == 0
|
||||
|
|
|
|||
|
|
@ -9,23 +9,6 @@ using Penumbra.Util;
|
|||
|
||||
namespace Penumbra.Mods;
|
||||
|
||||
public enum ModOptionChangeType
|
||||
{
|
||||
GroupRenamed,
|
||||
GroupAdded,
|
||||
GroupDeleted,
|
||||
GroupMoved,
|
||||
GroupTypeChanged,
|
||||
PriorityChanged,
|
||||
OptionAdded,
|
||||
OptionDeleted,
|
||||
OptionMoved,
|
||||
OptionFilesChanged,
|
||||
OptionSwapsChanged,
|
||||
OptionMetaChanged,
|
||||
DisplayChange,
|
||||
}
|
||||
|
||||
public sealed partial class Mod
|
||||
{
|
||||
public sealed partial class Manager
|
||||
|
|
@ -84,6 +67,7 @@ public sealed partial class Mod
|
|||
public void DeleteModGroup( Mod mod, int groupIdx )
|
||||
{
|
||||
var group = mod._groups[ groupIdx ];
|
||||
ModOptionChanged.Invoke( ModOptionChangeType.PrepareChange, mod, groupIdx, -1, -1 );
|
||||
mod._groups.RemoveAt( groupIdx );
|
||||
group.DeleteFile( mod.ModPath, groupIdx );
|
||||
ModOptionChanged.Invoke( ModOptionChangeType.GroupDeleted, mod, groupIdx, -1, -1 );
|
||||
|
|
@ -221,6 +205,7 @@ public sealed partial class Mod
|
|||
|
||||
public void DeleteOption( Mod mod, int groupIdx, int optionIdx )
|
||||
{
|
||||
ModOptionChanged.Invoke( ModOptionChangeType.PrepareChange, mod, groupIdx, optionIdx, -1 );
|
||||
switch( mod._groups[ groupIdx ] )
|
||||
{
|
||||
case SingleModGroup s:
|
||||
|
|
@ -252,6 +237,7 @@ public sealed partial class Mod
|
|||
return;
|
||||
}
|
||||
|
||||
ModOptionChanged.Invoke( ModOptionChangeType.PrepareChange, mod, groupIdx, optionIdx, -1 );
|
||||
subMod.ManipulationData = manipulations;
|
||||
ModOptionChanged.Invoke( ModOptionChangeType.OptionMetaChanged, mod, groupIdx, optionIdx, -1 );
|
||||
}
|
||||
|
|
@ -264,6 +250,7 @@ public sealed partial class Mod
|
|||
return;
|
||||
}
|
||||
|
||||
ModOptionChanged.Invoke( ModOptionChangeType.PrepareChange, mod, groupIdx, optionIdx, -1 );
|
||||
subMod.FileData = replacements;
|
||||
ModOptionChanged.Invoke( ModOptionChangeType.OptionFilesChanged, mod, groupIdx, optionIdx, -1 );
|
||||
}
|
||||
|
|
@ -275,7 +262,7 @@ public sealed partial class Mod
|
|||
subMod.FileData.AddFrom( additions );
|
||||
if( oldCount != subMod.FileData.Count )
|
||||
{
|
||||
ModOptionChanged.Invoke( ModOptionChangeType.OptionFilesChanged, mod, groupIdx, optionIdx, -1 );
|
||||
ModOptionChanged.Invoke( ModOptionChangeType.OptionFilesAdded, mod, groupIdx, optionIdx, -1 );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -287,6 +274,7 @@ public sealed partial class Mod
|
|||
return;
|
||||
}
|
||||
|
||||
ModOptionChanged.Invoke( ModOptionChangeType.PrepareChange, mod, groupIdx, optionIdx, -1 );
|
||||
subMod.FileSwapData = swaps;
|
||||
ModOptionChanged.Invoke( ModOptionChangeType.OptionSwapsChanged, mod, groupIdx, optionIdx, -1 );
|
||||
}
|
||||
|
|
|
|||
50
Penumbra/Mods/Manager/ModOptionChangeType.cs
Normal file
50
Penumbra/Mods/Manager/ModOptionChangeType.cs
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
namespace Penumbra.Mods;
|
||||
|
||||
public enum ModOptionChangeType
|
||||
{
|
||||
GroupRenamed,
|
||||
GroupAdded,
|
||||
GroupDeleted,
|
||||
GroupMoved,
|
||||
GroupTypeChanged,
|
||||
PriorityChanged,
|
||||
OptionAdded,
|
||||
OptionDeleted,
|
||||
OptionMoved,
|
||||
OptionFilesChanged,
|
||||
OptionFilesAdded,
|
||||
OptionSwapsChanged,
|
||||
OptionMetaChanged,
|
||||
DisplayChange,
|
||||
PrepareChange,
|
||||
}
|
||||
|
||||
public static class ModOptionChangeTypeExtension
|
||||
{
|
||||
// Give information for each type of change.
|
||||
// If requiresSaving, collections need to be re-saved after this change.
|
||||
// If requiresReloading, caches need to be manipulated after this change.
|
||||
// If wasPrepared, caches have already removed the mod beforehand, then need add it again when this event is fired.
|
||||
// Otherwise, caches need to reload the mod itself.
|
||||
public static void HandlingInfo( this ModOptionChangeType type, out bool requiresSaving, out bool requiresReloading, out bool wasPrepared )
|
||||
{
|
||||
( requiresSaving, requiresReloading, wasPrepared ) = type switch
|
||||
{
|
||||
ModOptionChangeType.GroupRenamed => ( true, false, false ),
|
||||
ModOptionChangeType.GroupAdded => ( true, false, false ),
|
||||
ModOptionChangeType.GroupDeleted => ( true, true, false ),
|
||||
ModOptionChangeType.GroupMoved => ( true, false, false ),
|
||||
ModOptionChangeType.GroupTypeChanged => ( true, true, true ),
|
||||
ModOptionChangeType.PriorityChanged => ( true, true, true ),
|
||||
ModOptionChangeType.OptionAdded => ( true, true, true ),
|
||||
ModOptionChangeType.OptionDeleted => ( true, true, false ),
|
||||
ModOptionChangeType.OptionMoved => ( true, false, false ),
|
||||
ModOptionChangeType.OptionFilesChanged => ( false, true, false ),
|
||||
ModOptionChangeType.OptionFilesAdded => ( false, true, true ),
|
||||
ModOptionChangeType.OptionSwapsChanged => ( false, true, false ),
|
||||
ModOptionChangeType.OptionMetaChanged => ( false, true, false ),
|
||||
ModOptionChangeType.DisplayChange => ( false, false, false ),
|
||||
_ => ( false, false, false ),
|
||||
};
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue