Prevent some crashes when default values can't be obtained.

This commit is contained in:
Ottermandias 2021-11-16 16:06:38 +01:00
parent 87e8f2599c
commit 3128c2017d

View file

@ -118,44 +118,64 @@ namespace Penumbra.Meta.Files
// Check that a given meta manipulation is an actual change to the default value. We don't need to keep changes to default. // Check that a given meta manipulation is an actual change to the default value. We don't need to keep changes to default.
public bool CheckAgainstDefault( MetaManipulation m ) public bool CheckAgainstDefault( MetaManipulation m )
{ {
return m.Type switch try
{ {
MetaType.Imc => GetDefaultImcFile( m.ImcIdentifier.ObjectType, m.ImcIdentifier.PrimaryId, m.ImcIdentifier.SecondaryId ) return m.Type switch
?.GetValue( m ).Equal( m.ImcValue ) {
?? true, MetaType.Imc => GetDefaultImcFile( m.ImcIdentifier.ObjectType, m.ImcIdentifier.PrimaryId, m.ImcIdentifier.SecondaryId )
MetaType.Gmp => GetDefaultGmpFile()?.GetEntry( m.GmpIdentifier.SetId ) ?.GetValue( m ).Equal( m.ImcValue )
== m.GmpValue, ?? true,
MetaType.Eqp => GetDefaultEqpFile()?.GetEntry( m.EqpIdentifier.SetId ) MetaType.Gmp => GetDefaultGmpFile()?.GetEntry( m.GmpIdentifier.SetId )
.Reduce( m.EqpIdentifier.Slot ) == m.GmpValue,
== m.EqpValue, MetaType.Eqp => GetDefaultEqpFile()?.GetEntry( m.EqpIdentifier.SetId )
MetaType.Eqdp => GetDefaultEqdpFile( m.EqdpIdentifier.Slot, m.EqdpIdentifier.GenderRace )?.GetEntry( m.EqdpIdentifier.SetId ) .Reduce( m.EqpIdentifier.Slot )
.Reduce( m.EqdpIdentifier.Slot ) == m.EqpValue,
== m.EqdpValue, MetaType.Eqdp => GetDefaultEqdpFile( m.EqdpIdentifier.Slot, m.EqdpIdentifier.GenderRace )
MetaType.Est => GetDefaultEstFile( m.EstIdentifier.ObjectType, m.EstIdentifier.EquipSlot, m.EstIdentifier.BodySlot ) ?.GetEntry( m.EqdpIdentifier.SetId )
?.GetEntry( m.EstIdentifier.GenderRace, m.EstIdentifier.PrimaryId ) .Reduce( m.EqdpIdentifier.Slot )
== m.EstValue, == m.EqdpValue,
MetaType.Rsp => GetDefaultCmpFile()?[ m.RspIdentifier.SubRace ][ m.RspIdentifier.Attribute ] MetaType.Est => GetDefaultEstFile( m.EstIdentifier.ObjectType, m.EstIdentifier.EquipSlot, m.EstIdentifier.BodySlot )
== m.RspValue, ?.GetEntry( m.EstIdentifier.GenderRace, m.EstIdentifier.PrimaryId )
_ => throw new NotImplementedException(), == m.EstValue,
}; MetaType.Rsp => GetDefaultCmpFile()?[ m.RspIdentifier.SubRace ][ m.RspIdentifier.Attribute ]
== m.RspValue,
_ => false,
};
}
catch( Exception e )
{
PluginLog.Error( $"Could not obtain default value for {m.CorrespondingFilename()} - {m.IdentifierString()}:\n{e}" );
}
return false;
} }
public object? GetDefaultValue( MetaManipulation m ) public object? GetDefaultValue( MetaManipulation m )
{ {
return m.Type switch try
{ {
MetaType.Imc => GetDefaultImcFile( m.ImcIdentifier.ObjectType, m.ImcIdentifier.PrimaryId, m.ImcIdentifier.SecondaryId ) return m.Type switch
?.GetValue( m ), {
MetaType.Gmp => GetDefaultGmpFile()?.GetEntry( m.GmpIdentifier.SetId ), MetaType.Imc => GetDefaultImcFile( m.ImcIdentifier.ObjectType, m.ImcIdentifier.PrimaryId, m.ImcIdentifier.SecondaryId )
MetaType.Eqp => GetDefaultEqpFile()?.GetEntry( m.EqpIdentifier.SetId ) ?.GetValue( m ),
.Reduce( m.EqpIdentifier.Slot ), MetaType.Gmp => GetDefaultGmpFile()?.GetEntry( m.GmpIdentifier.SetId ),
MetaType.Eqdp => GetDefaultEqdpFile( m.EqdpIdentifier.Slot, m.EqdpIdentifier.GenderRace )?.GetEntry( m.EqdpIdentifier.SetId ) MetaType.Eqp => GetDefaultEqpFile()?.GetEntry( m.EqpIdentifier.SetId )
.Reduce( m.EqdpIdentifier.Slot ), .Reduce( m.EqpIdentifier.Slot ),
MetaType.Est => GetDefaultEstFile( m.EstIdentifier.ObjectType, m.EstIdentifier.EquipSlot, m.EstIdentifier.BodySlot ) MetaType.Eqdp => GetDefaultEqdpFile( m.EqdpIdentifier.Slot, m.EqdpIdentifier.GenderRace )
?.GetEntry( m.EstIdentifier.GenderRace, m.EstIdentifier.PrimaryId ), ?.GetEntry( m.EqdpIdentifier.SetId )
MetaType.Rsp => GetDefaultCmpFile()?[ m.RspIdentifier.SubRace ][ m.RspIdentifier.Attribute ], .Reduce( m.EqdpIdentifier.Slot ),
_ => throw new NotImplementedException(), MetaType.Est => GetDefaultEstFile( m.EstIdentifier.ObjectType, m.EstIdentifier.EquipSlot, m.EstIdentifier.BodySlot )
}; ?.GetEntry( m.EstIdentifier.GenderRace, m.EstIdentifier.PrimaryId ),
MetaType.Rsp => GetDefaultCmpFile()?[ m.RspIdentifier.SubRace ][ m.RspIdentifier.Attribute ],
_ => false,
};
}
catch( Exception e )
{
PluginLog.Error( $"Could not obtain default value for {m.CorrespondingFilename()} - {m.IdentifierString()}:\n{e}" );
}
return false;
} }
// Create a deep copy of a default file as a new file. // Create a deep copy of a default file as a new file.