Fix bug with expanding IMC files.

This commit is contained in:
Ottermandias 2022-06-05 15:38:38 +02:00
parent a798eabf67
commit 48a443921e
4 changed files with 15 additions and 10 deletions

View file

@ -253,16 +253,15 @@ public partial class ModCollection
if( addMetaChanges ) if( addMetaChanges )
{ {
++ChangeCounter; ++ChangeCounter;
if( mod.TotalManipulations > 0 )
{
AddMetaFiles();
}
if( _collection == Penumbra.CollectionManager.Default ) if( _collection == Penumbra.CollectionManager.Default )
{ {
Penumbra.ResidentResources.Reload(); Penumbra.ResidentResources.Reload();
MetaManipulations.SetFiles(); MetaManipulations.SetFiles();
} }
if( mod.TotalManipulations > 0 )
{
AddMetaFiles();
}
} }
} }

View file

@ -134,7 +134,7 @@ public unsafe class ImcFile : MetaBaseFile
var defaultPtr = ( ImcEntry* )( Data + PreambleSize ); var defaultPtr = ( ImcEntry* )( Data + PreambleSize );
for( var i = oldCount + 1; i < numVariants + 1; ++i ) for( var i = oldCount + 1; i < numVariants + 1; ++i )
{ {
Functions.MemCpyUnchecked( defaultPtr + i, defaultPtr, NumParts * sizeof( ImcEntry ) ); Functions.MemCpyUnchecked( defaultPtr + i * NumParts, defaultPtr, NumParts * sizeof( ImcEntry ) );
} }
PluginLog.Verbose( "Expanded IMC {Path} from {Count} to {NewCount} variants.", Path, oldCount, numVariants ); PluginLog.Verbose( "Expanded IMC {Path} from {Count} to {NewCount} variants.", Path, oldCount, numVariants );
@ -197,9 +197,10 @@ public unsafe class ImcFile : MetaBaseFile
} }
} }
public static ImcEntry GetDefault( Utf8GamePath path, EquipSlot slot, int variantIdx ) public static ImcEntry GetDefault( Utf8GamePath path, EquipSlot slot, int variantIdx, out bool exists )
{ {
var file = Dalamud.GameData.GetFile( path.ToString() ); var file = Dalamud.GameData.GetFile( path.ToString() );
exists = false;
if( file == null ) if( file == null )
{ {
throw new Exception(); throw new Exception();
@ -208,7 +209,12 @@ public unsafe class ImcFile : MetaBaseFile
fixed( byte* ptr = file.Data ) fixed( byte* ptr = file.Data )
{ {
var entry = VariantPtr( ptr, PartIndex( slot ), variantIdx ); var entry = VariantPtr( ptr, PartIndex( slot ), variantIdx );
return entry == null ? new ImcEntry() : *entry; if( entry != null )
{
exists = true;
return *entry;
}
return new ImcEntry();
} }
} }

View file

@ -104,7 +104,7 @@ public partial class MetaManager
return false; return false;
} }
var def = ImcFile.GetDefault( path, m.EquipSlot, m.Variant ); var def = ImcFile.GetDefault( path, m.EquipSlot, m.Variant, out _ );
var manip = m with { Entry = def }; var manip = m with { Entry = def };
if( !manip.Apply( file ) ) if( !manip.Apply( file ) )
{ {

View file

@ -286,7 +286,7 @@ public partial class ModEditWindow
{ {
try try
{ {
return ImcFile.GetDefault( imc.GamePath(), imc.EquipSlot, imc.Variant ); return ImcFile.GetDefault( imc.GamePath(), imc.EquipSlot, imc.Variant, out _ );
} }
catch catch
{ {