Let Eqdp change all files in the racial tree instead of just the own race code.

This commit is contained in:
Ottermandias 2022-09-18 13:40:56 +02:00
parent 358064cd5f
commit 257c0d390b
3 changed files with 76 additions and 18 deletions

@ -1 +1 @@
Subproject commit 28c4d8564296484b3d0fc0d2ea275cded8b1daa2 Subproject commit 98064e790042c90c82a58fbfa79201bd69800758

View file

@ -1,9 +1,13 @@
using System; using System;
using System.Linq;
using Dalamud.Hooking; using Dalamud.Hooking;
using Dalamud.Utility.Signatures; using Dalamud.Utility.Signatures;
using FFXIVClientStructs.FFXIV.Client.Graphics.Scene; using FFXIVClientStructs.FFXIV.Client.Graphics.Scene;
using OtterGui.Classes;
using Penumbra.Collections;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
using ObjectType = FFXIVClientStructs.FFXIV.Client.Graphics.Scene.ObjectType; using ObjectType = FFXIVClientStructs.FFXIV.Client.Graphics.Scene.ObjectType;
using static Penumbra.GameData.Enums.GenderRace;
namespace Penumbra.Interop.Resolver; namespace Penumbra.Interop.Resolver;
@ -77,10 +81,8 @@ public unsafe partial class PathResolver
var collection = GetResolveData( drawObject ); var collection = GetResolveData( drawObject );
if( collection.Valid ) if( collection.Valid )
{ {
var race = GetDrawObjectGenderRace( drawObject );
using var eqp = collection.ModCollection.TemporarilySetEqpFile(); using var eqp = collection.ModCollection.TemporarilySetEqpFile();
using var eqdp1 = collection.ModCollection.TemporarilySetEqdpFile( race, false ); using var eqdp = ResolveEqdpData( collection.ModCollection, GetDrawObjectGenderRace( drawObject ), true, true );
using var eqdp2 = collection.ModCollection.TemporarilySetEqdpFile( race, true );
_onModelLoadCompleteHook.Original.Invoke( drawObject ); _onModelLoadCompleteHook.Original.Invoke( drawObject );
} }
else else
@ -106,10 +108,8 @@ public unsafe partial class PathResolver
var collection = GetResolveData( drawObject ); var collection = GetResolveData( drawObject );
if( collection.Valid ) if( collection.Valid )
{ {
var race = GetDrawObjectGenderRace( drawObject ); using var eqp = collection.ModCollection.TemporarilySetEqpFile();
using var eqp = collection.ModCollection.TemporarilySetEqpFile(); using var eqdp = ResolveEqdpData( collection.ModCollection, GetDrawObjectGenderRace( drawObject ), true, true );
using var eqdp1 = collection.ModCollection.TemporarilySetEqdpFile( race, false );
using var eqdp2 = collection.ModCollection.TemporarilySetEqdpFile( race, true );
_updateModelsHook.Original.Invoke( drawObject ); _updateModelsHook.Original.Invoke( drawObject );
} }
else else
@ -130,7 +130,7 @@ public unsafe partial class PathResolver
} }
} }
return GenderRace.Unknown; return Unknown;
} }
public static GenderRace GetHumanGenderRace( IntPtr human ) public static GenderRace GetHumanGenderRace( IntPtr human )
@ -203,5 +203,69 @@ public unsafe partial class PathResolver
using var eqp = resolveData.Valid ? resolveData.ModCollection.TemporarilySetEqpFile() : null; using var eqp = resolveData.Valid ? resolveData.ModCollection.TemporarilySetEqpFile() : null;
return _changeCustomize.Original( human, data, skipEquipment ); return _changeCustomize.Original( human, data, skipEquipment );
} }
public static DisposableContainer ResolveEqdpData( ModCollection collection, GenderRace race, bool equipment, bool accessory )
{
DisposableContainer Convert( params GenderRace[] races )
{
var equipmentEnumerable =
equipment
? races.Select( r => collection.TemporarilySetEqdpFile( r, false ) )
: Array.Empty<IDisposable?>().AsEnumerable();
var accessoryEnumerable =
accessory
? races.Select( r => collection.TemporarilySetEqdpFile( r, true ) )
: Array.Empty<IDisposable?>().AsEnumerable();
return new DisposableContainer( equipmentEnumerable.Concat( accessoryEnumerable ) );
}
return race switch
{
MidlanderMale => Convert( MidlanderMale ),
HighlanderMale => Convert( MidlanderMale, HighlanderMale ),
ElezenMale => Convert( MidlanderMale, ElezenMale ),
MiqoteMale => Convert( MidlanderMale, MiqoteMale ),
RoegadynMale => Convert( MidlanderMale, RoegadynMale ),
LalafellMale => Convert( MidlanderMale, LalafellMale ),
AuRaMale => Convert( MidlanderMale, AuRaMale ),
HrothgarMale => Convert( MidlanderMale, RoegadynMale, HrothgarMale ),
VieraMale => Convert( MidlanderMale, VieraMale ),
MidlanderFemale => Convert( MidlanderMale, MidlanderFemale ),
HighlanderFemale => Convert( MidlanderMale, MidlanderFemale, HighlanderFemale ),
ElezenFemale => Convert( MidlanderMale, MidlanderFemale, ElezenFemale ),
MiqoteFemale => Convert( MidlanderMale, MidlanderFemale, MiqoteFemale ),
RoegadynFemale => Convert( MidlanderMale, MidlanderFemale, RoegadynFemale ),
LalafellFemale => Convert( MidlanderMale, LalafellMale, LalafellFemale ),
AuRaFemale => Convert( MidlanderMale, MidlanderFemale, AuRaFemale ),
HrothgarFemale => Convert( MidlanderMale, MidlanderFemale, RoegadynFemale, HrothgarFemale ),
VieraFemale => Convert( MidlanderMale, MidlanderFemale, VieraFemale ),
MidlanderMaleNpc => Convert( MidlanderMale, MidlanderMaleNpc ),
HighlanderMaleNpc => Convert( MidlanderMale, HighlanderMale, HighlanderMaleNpc ),
ElezenMaleNpc => Convert( MidlanderMale, ElezenMale, ElezenMaleNpc ),
MiqoteMaleNpc => Convert( MidlanderMale, MiqoteMale, MiqoteMaleNpc ),
RoegadynMaleNpc => Convert( MidlanderMale, RoegadynMale, RoegadynMaleNpc ),
LalafellMaleNpc => Convert( MidlanderMale, LalafellMale, LalafellMaleNpc ),
AuRaMaleNpc => Convert( MidlanderMale, AuRaMale, AuRaMaleNpc ),
HrothgarMaleNpc => Convert( MidlanderMale, RoegadynMale, HrothgarMale, HrothgarMaleNpc ),
VieraMaleNpc => Convert( MidlanderMale, VieraMale, VieraMaleNpc ),
MidlanderFemaleNpc => Convert( MidlanderMale, MidlanderFemale, MidlanderFemaleNpc ),
HighlanderFemaleNpc => Convert( MidlanderMale, MidlanderFemale, HighlanderFemale, HighlanderFemaleNpc ),
ElezenFemaleNpc => Convert( MidlanderMale, MidlanderFemale, ElezenFemale, ElezenFemaleNpc ),
MiqoteFemaleNpc => Convert( MidlanderMale, MidlanderFemale, MiqoteFemale, MiqoteFemaleNpc ),
RoegadynFemaleNpc => Convert( MidlanderMale, MidlanderFemale, RoegadynFemale, RoegadynFemaleNpc ),
LalafellFemaleNpc => Convert( MidlanderMale, LalafellMale, LalafellFemale, LalafellFemaleNpc ),
AuRaFemaleNpc => Convert( MidlanderMale, MidlanderFemale, AuRaFemale, AuRaFemaleNpc ),
HrothgarFemaleNpc => Convert( MidlanderMale, MidlanderFemale, RoegadynFemale, HrothgarFemale, HrothgarFemaleNpc ),
VieraFemaleNpc => Convert( MidlanderMale, MidlanderFemale, VieraFemale, VieraFemaleNpc ),
UnknownMaleNpc => Convert( MidlanderMale, UnknownMaleNpc ),
UnknownFemaleNpc => Convert( MidlanderMale, MidlanderFemale, UnknownFemaleNpc ),
_ => DisposableContainer.Empty,
};
}
} }
} }

View file

@ -143,21 +143,15 @@ public partial class PathResolver
private IntPtr ResolveMdlHuman( IntPtr drawObject, IntPtr path, IntPtr unk3, uint modelType ) private IntPtr ResolveMdlHuman( IntPtr drawObject, IntPtr path, IntPtr unk3, uint modelType )
{ {
CharacterUtility.List.MetaReverter? Get() DisposableContainer Get()
{ {
if( modelType > 9 ) if( modelType > 9 )
{ {
return null; return DisposableContainer.Empty;
}
var race = MetaState.GetHumanGenderRace( drawObject );
if( race == GenderRace.Unknown )
{
return null;
} }
var data = GetResolveData( drawObject ); var data = GetResolveData( drawObject );
return !data.Valid ? null : data.ModCollection.TemporarilySetEqdpFile( race, modelType > 4 ); return !data.Valid ? DisposableContainer.Empty : MetaState.ResolveEqdpData(data.ModCollection, MetaState.GetHumanGenderRace( drawObject ), modelType < 5, modelType > 4);
} }
using var eqdp = Get(); using var eqdp = Get();