mirror of
https://github.com/xivdev/Penumbra.git
synced 2025-12-13 12:14:17 +01:00
Another try at fixing metadata, maybe.
This commit is contained in:
parent
2ee64137a7
commit
0ff851f717
3 changed files with 50 additions and 63 deletions
|
|
@ -8,6 +8,7 @@ using System.Collections.Generic;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using Penumbra.Interop;
|
using Penumbra.Interop;
|
||||||
|
using Penumbra.Meta.Files;
|
||||||
using Penumbra.Meta.Manipulations;
|
using Penumbra.Meta.Manipulations;
|
||||||
|
|
||||||
namespace Penumbra.Collections;
|
namespace Penumbra.Collections;
|
||||||
|
|
@ -159,18 +160,23 @@ public partial class ModCollection
|
||||||
}
|
}
|
||||||
|
|
||||||
// Used for short periods of changed files.
|
// Used for short periods of changed files.
|
||||||
public CharacterUtility.List.MetaReverter? TemporarilySetEqdpFile( GenderRace genderRace, bool accessory )
|
public CharacterUtility.List.MetaReverter TemporarilySetEqdpFile( GenderRace genderRace, bool accessory )
|
||||||
=> _cache?.MetaManipulations.TemporarilySetEqdpFile( genderRace, accessory );
|
=> _cache?.MetaManipulations.TemporarilySetEqdpFile( genderRace, accessory )
|
||||||
|
?? Penumbra.CharacterUtility.TemporarilyResetResource( Interop.Structs.CharacterUtility.EqdpIdx( genderRace, accessory ) );
|
||||||
|
|
||||||
public CharacterUtility.List.MetaReverter? TemporarilySetEqpFile()
|
public CharacterUtility.List.MetaReverter TemporarilySetEqpFile()
|
||||||
=> _cache?.MetaManipulations.TemporarilySetEqpFile();
|
=> _cache?.MetaManipulations.TemporarilySetEqpFile()
|
||||||
|
?? Penumbra.CharacterUtility.TemporarilyResetResource( Interop.Structs.CharacterUtility.Index.Eqp );
|
||||||
|
|
||||||
public CharacterUtility.List.MetaReverter? TemporarilySetGmpFile()
|
public CharacterUtility.List.MetaReverter TemporarilySetGmpFile()
|
||||||
=> _cache?.MetaManipulations.TemporarilySetGmpFile();
|
=> _cache?.MetaManipulations.TemporarilySetGmpFile()
|
||||||
|
?? Penumbra.CharacterUtility.TemporarilyResetResource( Interop.Structs.CharacterUtility.Index.Gmp );
|
||||||
|
|
||||||
public CharacterUtility.List.MetaReverter? TemporarilySetCmpFile()
|
public CharacterUtility.List.MetaReverter TemporarilySetCmpFile()
|
||||||
=> _cache?.MetaManipulations.TemporarilySetCmpFile();
|
=> _cache?.MetaManipulations.TemporarilySetCmpFile()
|
||||||
|
?? Penumbra.CharacterUtility.TemporarilyResetResource( Interop.Structs.CharacterUtility.Index.HumanCmp );
|
||||||
|
|
||||||
public CharacterUtility.List.MetaReverter? TemporarilySetEstFile( EstManipulation.EstType type )
|
public CharacterUtility.List.MetaReverter TemporarilySetEstFile( EstManipulation.EstType type )
|
||||||
=> _cache?.MetaManipulations.TemporarilySetEstFile( type );
|
=> _cache?.MetaManipulations.TemporarilySetEstFile( type )
|
||||||
|
?? Penumbra.CharacterUtility.TemporarilyResetResource( ( Interop.Structs.CharacterUtility.Index )type );
|
||||||
}
|
}
|
||||||
|
|
@ -79,16 +79,9 @@ public unsafe partial class PathResolver
|
||||||
private void OnModelLoadCompleteDetour( IntPtr drawObject )
|
private void OnModelLoadCompleteDetour( IntPtr drawObject )
|
||||||
{
|
{
|
||||||
var collection = GetResolveData( drawObject );
|
var collection = GetResolveData( drawObject );
|
||||||
if( collection.Valid )
|
using var eqp = collection.ModCollection.TemporarilySetEqpFile();
|
||||||
{
|
using var eqdp = ResolveEqdpData( collection.ModCollection, GetDrawObjectGenderRace( drawObject ), true, true );
|
||||||
using var eqp = collection.ModCollection.TemporarilySetEqpFile();
|
_onModelLoadCompleteHook.Original.Invoke( drawObject );
|
||||||
using var eqdp = ResolveEqdpData( collection.ModCollection, GetDrawObjectGenderRace( drawObject ), true, true );
|
|
||||||
_onModelLoadCompleteHook.Original.Invoke( drawObject );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_onModelLoadCompleteHook.Original.Invoke( drawObject );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private delegate void UpdateModelDelegate( IntPtr drawObject );
|
private delegate void UpdateModelDelegate( IntPtr drawObject );
|
||||||
|
|
@ -106,16 +99,9 @@ public unsafe partial class PathResolver
|
||||||
}
|
}
|
||||||
|
|
||||||
var collection = GetResolveData( drawObject );
|
var collection = GetResolveData( drawObject );
|
||||||
if( collection.Valid )
|
using var eqp = collection.ModCollection.TemporarilySetEqpFile();
|
||||||
{
|
using var eqdp = ResolveEqdpData( collection.ModCollection, GetDrawObjectGenderRace( drawObject ), true, true );
|
||||||
using var eqp = collection.ModCollection.TemporarilySetEqpFile();
|
_updateModelsHook.Original.Invoke( drawObject );
|
||||||
using var eqdp = ResolveEqdpData( collection.ModCollection, GetDrawObjectGenderRace( drawObject ), true, true );
|
|
||||||
_updateModelsHook.Original.Invoke( drawObject );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_updateModelsHook.Original.Invoke( drawObject );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static GenderRace GetDrawObjectGenderRace( IntPtr drawObject )
|
private static GenderRace GetDrawObjectGenderRace( IntPtr drawObject )
|
||||||
|
|
@ -150,7 +136,7 @@ public unsafe partial class PathResolver
|
||||||
}
|
}
|
||||||
|
|
||||||
var resolveData = GetResolveData( drawObject );
|
var resolveData = GetResolveData( drawObject );
|
||||||
using var eqp = resolveData.Valid ? resolveData.ModCollection.TemporarilySetEqpFile() : null;
|
using var eqp = resolveData.ModCollection.TemporarilySetEqpFile();
|
||||||
_getEqpIndirectHook.Original( drawObject );
|
_getEqpIndirectHook.Original( drawObject );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -165,7 +151,7 @@ public unsafe partial class PathResolver
|
||||||
private byte SetupVisorDetour( IntPtr drawObject, ushort modelId, byte visorState )
|
private byte SetupVisorDetour( IntPtr drawObject, ushort modelId, byte visorState )
|
||||||
{
|
{
|
||||||
var resolveData = GetResolveData( drawObject );
|
var resolveData = GetResolveData( drawObject );
|
||||||
using var gmp = resolveData.Valid ? resolveData.ModCollection.TemporarilySetGmpFile() : null;
|
using var gmp = resolveData.ModCollection.TemporarilySetGmpFile();
|
||||||
return _setupVisorHook.Original( drawObject, modelId, visorState );
|
return _setupVisorHook.Original( drawObject, modelId, visorState );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -184,7 +170,7 @@ public unsafe partial class PathResolver
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var resolveData = GetResolveData( drawObject );
|
var resolveData = GetResolveData( drawObject );
|
||||||
using var cmp = resolveData.Valid ? resolveData.ModCollection.TemporarilySetCmpFile() : null;
|
using var cmp = resolveData.ModCollection.TemporarilySetCmpFile();
|
||||||
_rspSetupCharacterHook.Original( drawObject, unk2, unk3, unk4, unk5 );
|
_rspSetupCharacterHook.Original( drawObject, unk2, unk3, unk4, unk5 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -200,10 +186,8 @@ public unsafe partial class PathResolver
|
||||||
{
|
{
|
||||||
_inChangeCustomize = true;
|
_inChangeCustomize = true;
|
||||||
var resolveData = GetResolveData( human );
|
var resolveData = GetResolveData( human );
|
||||||
using var cmp = resolveData.Valid ? resolveData.ModCollection.TemporarilySetCmpFile() : null;
|
using var cmp = resolveData.ModCollection.TemporarilySetCmpFile();
|
||||||
using var decals = resolveData.Valid
|
using var decals = new CharacterUtility.DecalReverter( resolveData.ModCollection, DrawObjectState.UsesDecal( 0, data ) );
|
||||||
? new CharacterUtility.DecalReverter( resolveData.ModCollection, DrawObjectState.UsesDecal( 0, data ) )
|
|
||||||
: null;
|
|
||||||
return _changeCustomize.Original( human, data, skipEquipment );
|
return _changeCustomize.Original( human, data, skipEquipment );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -224,6 +208,7 @@ public unsafe partial class PathResolver
|
||||||
|
|
||||||
return race switch
|
return race switch
|
||||||
{
|
{
|
||||||
|
// @formatter:off
|
||||||
MidlanderMale => Convert( MidlanderMale ),
|
MidlanderMale => Convert( MidlanderMale ),
|
||||||
HighlanderMale => Convert( MidlanderMale, HighlanderMale ),
|
HighlanderMale => Convert( MidlanderMale, HighlanderMale ),
|
||||||
ElezenMale => Convert( MidlanderMale, ElezenMale ),
|
ElezenMale => Convert( MidlanderMale, ElezenMale ),
|
||||||
|
|
@ -245,28 +230,29 @@ public unsafe partial class PathResolver
|
||||||
VieraFemale => Convert( MidlanderMale, MidlanderFemale, VieraFemale ),
|
VieraFemale => Convert( MidlanderMale, MidlanderFemale, VieraFemale ),
|
||||||
|
|
||||||
MidlanderMaleNpc => Convert( MidlanderMale, MidlanderMaleNpc ),
|
MidlanderMaleNpc => Convert( MidlanderMale, MidlanderMaleNpc ),
|
||||||
HighlanderMaleNpc => Convert( MidlanderMale, HighlanderMale, HighlanderMaleNpc ),
|
HighlanderMaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, HighlanderMale, HighlanderMaleNpc ),
|
||||||
ElezenMaleNpc => Convert( MidlanderMale, ElezenMale, ElezenMaleNpc ),
|
ElezenMaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, ElezenMale, ElezenMaleNpc ),
|
||||||
MiqoteMaleNpc => Convert( MidlanderMale, MiqoteMale, MiqoteMaleNpc ),
|
MiqoteMaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, MiqoteMale, MiqoteMaleNpc ),
|
||||||
RoegadynMaleNpc => Convert( MidlanderMale, RoegadynMale, RoegadynMaleNpc ),
|
RoegadynMaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, RoegadynMale, RoegadynMaleNpc ),
|
||||||
LalafellMaleNpc => Convert( MidlanderMale, LalafellMale, LalafellMaleNpc ),
|
LalafellMaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, LalafellMale, LalafellMaleNpc ),
|
||||||
AuRaMaleNpc => Convert( MidlanderMale, AuRaMale, AuRaMaleNpc ),
|
AuRaMaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, AuRaMale, AuRaMaleNpc ),
|
||||||
HrothgarMaleNpc => Convert( MidlanderMale, RoegadynMale, HrothgarMale, HrothgarMaleNpc ),
|
HrothgarMaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, RoegadynMaleNpc, RoegadynMale, HrothgarMale, HrothgarMaleNpc ),
|
||||||
VieraMaleNpc => Convert( MidlanderMale, VieraMale, VieraMaleNpc ),
|
VieraMaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, VieraMale, VieraMaleNpc ),
|
||||||
|
|
||||||
MidlanderFemaleNpc => Convert( MidlanderMale, MidlanderFemale, MidlanderFemaleNpc ),
|
MidlanderFemaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, MidlanderFemale, MidlanderFemaleNpc ),
|
||||||
HighlanderFemaleNpc => Convert( MidlanderMale, MidlanderFemale, HighlanderFemale, HighlanderFemaleNpc ),
|
HighlanderFemaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, MidlanderFemale, MidlanderFemaleNpc, HighlanderFemale, HighlanderFemaleNpc ),
|
||||||
ElezenFemaleNpc => Convert( MidlanderMale, MidlanderFemale, ElezenFemale, ElezenFemaleNpc ),
|
ElezenFemaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, MidlanderFemale, MidlanderFemaleNpc, ElezenFemale, ElezenFemaleNpc ),
|
||||||
MiqoteFemaleNpc => Convert( MidlanderMale, MidlanderFemale, MiqoteFemale, MiqoteFemaleNpc ),
|
MiqoteFemaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, MidlanderFemale, MidlanderFemaleNpc, MiqoteFemale, MiqoteFemaleNpc ),
|
||||||
RoegadynFemaleNpc => Convert( MidlanderMale, MidlanderFemale, RoegadynFemale, RoegadynFemaleNpc ),
|
RoegadynFemaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, MidlanderFemale, MidlanderFemaleNpc, RoegadynFemale, RoegadynFemaleNpc ),
|
||||||
LalafellFemaleNpc => Convert( MidlanderMale, LalafellMale, LalafellFemale, LalafellFemaleNpc ),
|
LalafellFemaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, LalafellMale, LalafellMaleNpc, LalafellFemale, LalafellFemaleNpc ),
|
||||||
AuRaFemaleNpc => Convert( MidlanderMale, MidlanderFemale, AuRaFemale, AuRaFemaleNpc ),
|
AuRaFemaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, MidlanderFemale, MidlanderFemaleNpc, AuRaFemale, AuRaFemaleNpc ),
|
||||||
HrothgarFemaleNpc => Convert( MidlanderMale, MidlanderFemale, RoegadynFemale, HrothgarFemale, HrothgarFemaleNpc ),
|
HrothgarFemaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, MidlanderFemale, MidlanderFemaleNpc, RoegadynFemale, RoegadynFemaleNpc, HrothgarFemale, HrothgarFemaleNpc ),
|
||||||
VieraFemaleNpc => Convert( MidlanderMale, MidlanderFemale, VieraFemale, VieraFemaleNpc ),
|
VieraFemaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, MidlanderFemale, MidlanderFemaleNpc, VieraFemale, VieraFemaleNpc ),
|
||||||
|
|
||||||
UnknownMaleNpc => Convert( MidlanderMale, UnknownMaleNpc ),
|
UnknownMaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, UnknownMaleNpc ),
|
||||||
UnknownFemaleNpc => Convert( MidlanderMale, MidlanderFemale, UnknownFemaleNpc ),
|
UnknownFemaleNpc => Convert( MidlanderMale, MidlanderMaleNpc, MidlanderFemale, MidlanderFemaleNpc, UnknownFemaleNpc ),
|
||||||
_ => DisposableContainer.Empty,
|
_ => DisposableContainer.Empty,
|
||||||
|
// @formatter:on
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -147,13 +147,8 @@ public partial class PathResolver : IDisposable
|
||||||
|
|
||||||
private static unsafe ResolveData GetResolveData( IntPtr drawObject )
|
private static unsafe ResolveData GetResolveData( IntPtr drawObject )
|
||||||
{
|
{
|
||||||
var parent = FindParent( drawObject, out var resolveData );
|
var _ = FindParent( drawObject, out var resolveData );
|
||||||
if( parent == null || resolveData.ModCollection == Penumbra.CollectionManager.Default )
|
return resolveData;
|
||||||
{
|
|
||||||
return ResolveData.Invalid;
|
|
||||||
}
|
|
||||||
|
|
||||||
return resolveData.ModCollection.HasCache ? resolveData : ResolveData.Invalid;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal IEnumerable< KeyValuePair< Utf8String, ResolveData > > PathCollections
|
internal IEnumerable< KeyValuePair< Utf8String, ResolveData > > PathCollections
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue