mirror of
https://github.com/xivdev/Penumbra.git
synced 2025-12-13 12:14:17 +01:00
Female Hrothgar resource handle related fixes...
This commit is contained in:
parent
5ed80c753f
commit
c7344efdc2
4 changed files with 25 additions and 18 deletions
|
|
@ -3,6 +3,7 @@ using System.Linq;
|
||||||
using Dalamud.Hooking;
|
using Dalamud.Hooking;
|
||||||
using Dalamud.Logging;
|
using Dalamud.Logging;
|
||||||
using Dalamud.Utility.Signatures;
|
using Dalamud.Utility.Signatures;
|
||||||
|
using ImGuiScene;
|
||||||
|
|
||||||
namespace Penumbra.Interop;
|
namespace Penumbra.Interop;
|
||||||
|
|
||||||
|
|
@ -32,7 +33,7 @@ public unsafe class CharacterUtility : IDisposable
|
||||||
.Append( Structs.CharacterUtility.GmpIdx )
|
.Append( Structs.CharacterUtility.GmpIdx )
|
||||||
#endif
|
#endif
|
||||||
#if USE_EQDP
|
#if USE_EQDP
|
||||||
.Concat( Enumerable.Range( Structs.CharacterUtility.EqdpStartIdx, Structs.CharacterUtility.NumEqdpFiles ) )
|
.Concat( Enumerable.Range( Structs.CharacterUtility.EqdpStartIdx, Structs.CharacterUtility.NumEqdpFiles ).Where( i => i != 17 ) ) // TODO: Female Hrothgar
|
||||||
#endif
|
#endif
|
||||||
#if USE_CMP
|
#if USE_CMP
|
||||||
.Append( Structs.CharacterUtility.HumanCmpIdx )
|
.Append( Structs.CharacterUtility.HumanCmpIdx )
|
||||||
|
|
@ -42,7 +43,7 @@ public unsafe class CharacterUtility : IDisposable
|
||||||
#endif
|
#endif
|
||||||
.ToArray();
|
.ToArray();
|
||||||
|
|
||||||
private static readonly int[] ReverseIndices
|
public static readonly int[] ReverseIndices
|
||||||
= Enumerable.Range( 0, Structs.CharacterUtility.NumResources )
|
= Enumerable.Range( 0, Structs.CharacterUtility.NumResources )
|
||||||
.Select( i => Array.IndexOf( RelevantIndices, i ) ).ToArray();
|
.Select( i => Array.IndexOf( RelevantIndices, i ) ).ToArray();
|
||||||
|
|
||||||
|
|
@ -86,20 +87,22 @@ public unsafe class CharacterUtility : IDisposable
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the data of one of the stored resources to a given pointer and length.
|
// Set the data of one of the stored resources to a given pointer and length.
|
||||||
public bool SetResource( int idx, IntPtr data, int length )
|
public bool SetResource( int resourceIdx, IntPtr data, int length )
|
||||||
{
|
{
|
||||||
var resource = ( Structs.ResourceHandle* )Address->Resources[ idx ];
|
var resource = Address->Resource( resourceIdx );
|
||||||
var ret = resource->SetData( data, length );
|
var ret = resource->SetData( data, length );
|
||||||
PluginLog.Verbose( "Set resource {Idx} to 0x{NewData:X} ({NewLength} bytes).", idx, ( ulong )data, length );
|
PluginLog.Verbose( "Set resource {Idx} to 0x{NewData:X} ({NewLength} bytes).", resourceIdx, ( ulong )data, length );
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset the data of one of the stored resources to its default values.
|
// Reset the data of one of the stored resources to its default values.
|
||||||
public void ResetResource( int fileIdx )
|
public void ResetResource( int resourceIdx )
|
||||||
{
|
{
|
||||||
var (data, size) = DefaultResources[ ReverseIndices[ fileIdx ] ];
|
var relevantIdx = ReverseIndices[ resourceIdx ];
|
||||||
var resource = ( Structs.ResourceHandle* )Address->Resources[ fileIdx ];
|
var (data, length) = DefaultResources[ relevantIdx ];
|
||||||
resource->SetData( data, size );
|
var resource = Address->Resource( resourceIdx );
|
||||||
|
PluginLog.Verbose( "Reset resource {Idx} to default at 0x{DefaultData:X} ({NewLength} bytes).", resourceIdx, ( ulong )data, length );
|
||||||
|
resource->SetData( data, length );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return all relevant resources to the default resource.
|
// Return all relevant resources to the default resource.
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,9 @@ namespace Penumbra.Interop.Structs;
|
||||||
[StructLayout( LayoutKind.Explicit )]
|
[StructLayout( LayoutKind.Explicit )]
|
||||||
public unsafe struct CharacterUtility
|
public unsafe struct CharacterUtility
|
||||||
{
|
{
|
||||||
|
// TODO: female Hrothgar
|
||||||
public static readonly int[] EqdpIndices
|
public static readonly int[] EqdpIndices
|
||||||
= Enumerable.Range( EqdpStartIdx, NumEqdpFiles ).ToArray();
|
= Enumerable.Range( EqdpStartIdx, NumEqdpFiles ).Where( i => i != EqdpStartIdx + 15 ).ToArray();
|
||||||
|
|
||||||
public const int NumResources = 85;
|
public const int NumResources = 85;
|
||||||
public const int EqpIdx = 0;
|
public const int EqpIdx = 0;
|
||||||
|
|
@ -41,7 +42,7 @@ public unsafe struct CharacterUtility
|
||||||
1301 => EqdpStartIdx + 12,
|
1301 => EqdpStartIdx + 12,
|
||||||
1401 => EqdpStartIdx + 13,
|
1401 => EqdpStartIdx + 13,
|
||||||
1501 => EqdpStartIdx + 14,
|
1501 => EqdpStartIdx + 14,
|
||||||
1601 => EqdpStartIdx + 15, // Does not exist yet
|
1601 => EqdpStartIdx + 15, // TODO: female Hrothgar
|
||||||
1701 => EqdpStartIdx + 16,
|
1701 => EqdpStartIdx + 16,
|
||||||
1801 => EqdpStartIdx + 17,
|
1801 => EqdpStartIdx + 17,
|
||||||
0104 => EqdpStartIdx + 18,
|
0104 => EqdpStartIdx + 18,
|
||||||
|
|
|
||||||
|
|
@ -120,8 +120,10 @@ public sealed unsafe class ExpandedEqdpFile : MetaBaseFile
|
||||||
=> GetDefault( Index, setIdx );
|
=> GetDefault( Index, setIdx );
|
||||||
|
|
||||||
public static EqdpEntry GetDefault( int fileIdx, int setIdx )
|
public static EqdpEntry GetDefault( int fileIdx, int setIdx )
|
||||||
|
=> GetDefault( ( byte* )Penumbra.CharacterUtility.DefaultResource( fileIdx ).Address, setIdx );
|
||||||
|
|
||||||
|
public static EqdpEntry GetDefault( byte* data, int setIdx )
|
||||||
{
|
{
|
||||||
var data = ( byte* )Penumbra.CharacterUtility.DefaultResource( fileIdx ).Address;
|
|
||||||
var blockSize = *( ushort* )( data + IdentifierSize );
|
var blockSize = *( ushort* )( data + IdentifierSize );
|
||||||
var totalBlockCount = *( ushort* )( data + IdentifierSize + 2 );
|
var totalBlockCount = *( ushort* )( data + IdentifierSize + 2 );
|
||||||
|
|
||||||
|
|
@ -138,7 +140,6 @@ public sealed unsafe class ExpandedEqdpFile : MetaBaseFile
|
||||||
}
|
}
|
||||||
|
|
||||||
var blockData = ( ushort* )( data + IdentifierSize + PreambleSize + totalBlockCount * 2 + block * 2 );
|
var blockData = ( ushort* )( data + IdentifierSize + PreambleSize + totalBlockCount * 2 + block * 2 );
|
||||||
var x = new ReadOnlySpan< ushort >( blockData, blockSize );
|
|
||||||
return ( EqdpEntry )( *( blockData + setIdx % blockSize ) );
|
return ( EqdpEntry )( *( blockData + setIdx % blockSize ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ using Penumbra.GameData.Enums;
|
||||||
using Penumbra.Interop.Structs;
|
using Penumbra.Interop.Structs;
|
||||||
using Penumbra.Meta.Files;
|
using Penumbra.Meta.Files;
|
||||||
using Penumbra.Meta.Manipulations;
|
using Penumbra.Meta.Manipulations;
|
||||||
|
using Penumbra.Util;
|
||||||
|
|
||||||
namespace Penumbra.Meta.Manager;
|
namespace Penumbra.Meta.Manager;
|
||||||
|
|
||||||
|
|
@ -13,7 +14,7 @@ public partial class MetaManager
|
||||||
{
|
{
|
||||||
public struct MetaManagerEqdp : IDisposable
|
public struct MetaManagerEqdp : IDisposable
|
||||||
{
|
{
|
||||||
public ExpandedEqdpFile?[] Files = new ExpandedEqdpFile?[CharacterUtility.NumEqdpFiles];
|
public ExpandedEqdpFile?[] Files = new ExpandedEqdpFile?[CharacterUtility.NumEqdpFiles - 1]; // TODO: female Hrothgar
|
||||||
|
|
||||||
public readonly Dictionary< EqdpManipulation, Mod.Mod > Manipulations = new();
|
public readonly Dictionary< EqdpManipulation, Mod.Mod > Manipulations = new();
|
||||||
|
|
||||||
|
|
@ -23,9 +24,9 @@ public partial class MetaManager
|
||||||
[Conditional( "USE_EQDP" )]
|
[Conditional( "USE_EQDP" )]
|
||||||
public void SetFiles()
|
public void SetFiles()
|
||||||
{
|
{
|
||||||
foreach( var idx in CharacterUtility.EqdpIndices )
|
for( var i = 0; i < CharacterUtility.EqdpIndices.Length; ++i )
|
||||||
{
|
{
|
||||||
SetFile( Files[ idx - CharacterUtility.EqdpStartIdx ], idx );
|
SetFile( Files[ i ], CharacterUtility.EqdpIndices[ i ] );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -57,7 +58,8 @@ public partial class MetaManager
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var file = Files[ m.FileIndex() - 2 ] ??= new ExpandedEqdpFile( Names.CombinedRace( m.Gender, m.Race ), m.Slot.IsAccessory() );
|
var file = Files[ Array.IndexOf( CharacterUtility.EqdpIndices, m.FileIndex() ) ] ??=
|
||||||
|
new ExpandedEqdpFile( Names.CombinedRace( m.Gender, m.Race ), m.Slot.IsAccessory() ); // TODO: female Hrothgar
|
||||||
return m.Apply( file );
|
return m.Apply( file );
|
||||||
#else
|
#else
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -65,7 +67,7 @@ public partial class MetaManager
|
||||||
}
|
}
|
||||||
|
|
||||||
public ExpandedEqdpFile? File( GenderRace race, bool accessory )
|
public ExpandedEqdpFile? File( GenderRace race, bool accessory )
|
||||||
=> Files[ CharacterUtility.EqdpIdx( race, accessory ) - CharacterUtility.EqdpStartIdx ];
|
=> Files[ Array.IndexOf( CharacterUtility.EqdpIndices, CharacterUtility.EqdpIdx( race, accessory ) ) ]; // TODO: female Hrothgar
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue