Fixed CharEquipment wrong order of rings, fixed some GPose redraw stuff, gave some variables actual names.

This commit is contained in:
Ottermandias 2021-07-23 12:54:58 +02:00
parent c7d22935ef
commit f372cc001f
5 changed files with 40 additions and 29 deletions

View file

@ -12,24 +12,24 @@ namespace Penumbra.Game
[StructLayout( LayoutKind.Sequential, Pack = 1 )] [StructLayout( LayoutKind.Sequential, Pack = 1 )]
internal readonly struct Weapon internal readonly struct Weapon
{ {
public readonly ushort _1; public readonly ushort Set;
public readonly ushort _2; public readonly ushort Type;
public readonly ushort _3; public readonly ushort Variant;
public readonly byte _4; public readonly byte Stain;
public override string ToString() public override string ToString()
=> $"{_1},{_2},{_3},{_4}"; => $"{Set},{Type},{Variant},{Stain}";
} }
[StructLayout( LayoutKind.Sequential, Pack = 1 )] [StructLayout( LayoutKind.Sequential, Pack = 1 )]
internal readonly struct Equip internal readonly struct Equip
{ {
public readonly ushort _1; public readonly ushort Set;
public readonly byte _2; public readonly byte Variant;
public readonly byte _3; public readonly byte Stain;
public override string ToString() public override string ToString()
=> $"{_1},{_2},{_3}"; => $"{Set},{Variant},{Stain}";
} }
private const int MainWeaponOffset = 0x0F08; private const int MainWeaponOffset = 0x0F08;
@ -48,8 +48,8 @@ namespace Penumbra.Game
internal readonly Equip Ear; internal readonly Equip Ear;
internal readonly Equip Neck; internal readonly Equip Neck;
internal readonly Equip Wrist; internal readonly Equip Wrist;
internal readonly Equip LFinger;
internal readonly Equip RFinger; internal readonly Equip RFinger;
internal readonly Equip LFinger;
internal readonly ushort IsSet; // Also fills struct size to 56, a multiple of 8. internal readonly ushort IsSet; // Also fills struct size to 56, a multiple of 8.
public CharEquipment() public CharEquipment()

View file

@ -146,8 +146,9 @@ namespace Penumbra.Game
idx = ~idx; idx = ~idx;
} }
var endIdx = idx + 1; var endIdx = idx + 1;
while( endIdx < list.Count && maskedKey == ( list[endIdx].Item1 & mask ) ) while( endIdx < list.Count && maskedKey == ( list[ endIdx ].Item1 & mask ) )
{ {
++endIdx; ++endIdx;
} }
@ -290,19 +291,21 @@ namespace Penumbra.Game
} }
} }
public Item? Identify( ushort a, ushort b, ushort c, EquipSlot slot ) public Item? Identify( ushort setId, ushort weaponType, ushort variant, EquipSlot slot )
{ {
switch( slot ) switch( slot )
{ {
case EquipSlot.MainHand: case EquipSlot.MainHand:
case EquipSlot.Offhand: case EquipSlot.Offhand:
{ {
var (begin, _) = FindIndexRange( _weapons, ( ( ulong )a << 32 ) | ( ( ulong )b << 16 ) | c, 0xFFFFFFFFFFFF ); var (begin, _) = FindIndexRange( _weapons, ( ( ulong )setId << 32 ) | ( ( ulong )weaponType << 16 ) | variant,
0xFFFFFFFFFFFF );
return begin >= 0 ? _weapons[ begin ].Item2.FirstOrDefault() : null; return begin >= 0 ? _weapons[ begin ].Item2.FirstOrDefault() : null;
} }
default: default:
{ {
var (begin, _) = FindIndexRange( _equipment, ( ( ulong )a << 32 ) | ( ( ulong )slot.ToSlot() << 16 ) | b, 0xFFFFFFFFFFFF ); var (begin, _) = FindIndexRange( _equipment, ( ( ulong )setId << 32 ) | ( ( ulong )slot.ToSlot() << 16 ) | weaponType,
0xFFFFFFFFFFFF );
return begin >= 0 ? _equipment[ begin ].Item2.FirstOrDefault() : null; return begin >= 0 ? _equipment[ begin ].Item2.FirstOrDefault() : null;
} }
} }

View file

@ -86,13 +86,21 @@ namespace Penumbra.Interop
var gPoseActor = actors[ ActorRefresher.GPosePlayerActorIdx ]; var gPoseActor = actors[ ActorRefresher.GPosePlayerActorIdx ];
if( gPoseActor == null ) if( gPoseActor == null )
{ {
if( _lastGPoseAddress != IntPtr.Zero && actors[ 0 ] != null && _equip.ContainsKey( actors[ 0 ].Name ) )
{
ActorChanged?.Invoke( actors[ 0 ] );
}
_lastGPoseAddress = IntPtr.Zero; _lastGPoseAddress = IntPtr.Zero;
} }
else if( gPoseActor.Address != _lastGPoseAddress ) else if( gPoseActor.Address != _lastGPoseAddress )
{ {
_lastGPoseAddress = gPoseActor.Address; _lastGPoseAddress = gPoseActor.Address;
if( _equip.ContainsKey( gPoseActor.Name ) )
{
ActorChanged?.Invoke( gPoseActor ); ActorChanged?.Invoke( gPoseActor );
} }
}
for( var i = 0; i < ActorsPerFrame; ++i ) for( var i = 0; i < ActorsPerFrame; ++i )
{ {
@ -100,7 +108,7 @@ namespace Penumbra.Interop
? _frameTicker + 2 ? _frameTicker + 2
: 0; : 0;
var actor = actors[ _frameTicker ]; var actor = _frameTicker == 0 && gPoseActor != null ? gPoseActor : actors[ _frameTicker ];
if( actor == null if( actor == null
|| actor.ObjectKind != ObjectKind.Player || actor.ObjectKind != ObjectKind.Player
|| actor.Name == null || actor.Name == null

View file

@ -64,17 +64,17 @@ namespace Penumbra.UI
ImGui.Text( "(not set)" ); ImGui.Text( "(not set)" );
} }
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.Text( identifier.Identify( actor.Value.Mainhand._1, actor.Value.Mainhand._2, actor.Value.Mainhand._3, EquipSlot.MainHand )?.Name.ToString() ?? "Unknown" ); ImGui.Text( identifier.Identify( actor.Value.Mainhand.Set, actor.Value.Mainhand.Type, actor.Value.Mainhand.Variant, EquipSlot.MainHand )?.Name.ToString() ?? "Unknown" );
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.Text( identifier.Identify( actor.Value.Head._1, actor.Value.Head._2, 0, EquipSlot.Head )?.Name.ToString() ?? "Unknown" ); ImGui.Text( identifier.Identify( actor.Value.Head.Set, actor.Value.Head.Variant, 0, EquipSlot.Head )?.Name.ToString() ?? "Unknown" );
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.Text( identifier.Identify( actor.Value.Body._1, actor.Value.Body._2, 0, EquipSlot.Body )?.Name.ToString() ?? "Unknown" ); ImGui.Text( identifier.Identify( actor.Value.Body.Set, actor.Value.Body.Variant, 0, EquipSlot.Body )?.Name.ToString() ?? "Unknown" );
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.Text( identifier.Identify( actor.Value.Hands._1, actor.Value.Hands._2, 0, EquipSlot.Hands )?.Name.ToString() ?? "Unknown" ); ImGui.Text( identifier.Identify( actor.Value.Hands.Set, actor.Value.Hands.Variant, 0, EquipSlot.Hands )?.Name.ToString() ?? "Unknown" );
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.Text( identifier.Identify( actor.Value.Legs._1, actor.Value.Legs._2, 0, EquipSlot.Legs )?.Name.ToString() ?? "Unknown" ); ImGui.Text( identifier.Identify( actor.Value.Legs.Set, actor.Value.Legs.Variant, 0, EquipSlot.Legs )?.Name.ToString() ?? "Unknown" );
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.Text( identifier.Identify( actor.Value.Feet._1, actor.Value.Feet._2, 0, EquipSlot.Feet )?.Name.ToString() ?? "Unknown" ); ImGui.Text( identifier.Identify( actor.Value.Feet.Set, actor.Value.Feet.Variant, 0, EquipSlot.Feet )?.Name.ToString() ?? "Unknown" );
ImGui.TableNextRow(); ImGui.TableNextRow();
ImGui.TableNextColumn(); ImGui.TableNextColumn();
@ -94,17 +94,17 @@ namespace Penumbra.UI
ImGui.TableNextRow(); ImGui.TableNextRow();
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.Text( identifier.Identify( actor.Value.Offhand._1, actor.Value.Offhand._2, actor.Value.Offhand._3, EquipSlot.Offhand )?.Name.ToString() ?? "Unknown" ); ImGui.Text( identifier.Identify( actor.Value.Offhand.Set, actor.Value.Offhand.Type, actor.Value.Offhand.Variant, EquipSlot.Offhand )?.Name.ToString() ?? "Unknown" );
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.Text( identifier.Identify( actor.Value.Ear._1, actor.Value.Ear._2, 0, EquipSlot.Ears )?.Name.ToString() ?? "Unknown" ); ImGui.Text( identifier.Identify( actor.Value.Ear.Set, actor.Value.Ear.Variant, 0, EquipSlot.Ears )?.Name.ToString() ?? "Unknown" );
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.Text( identifier.Identify( actor.Value.Neck._1, actor.Value.Neck._2, 0, EquipSlot.Neck )?.Name.ToString() ?? "Unknown" ); ImGui.Text( identifier.Identify( actor.Value.Neck.Set, actor.Value.Neck.Variant, 0, EquipSlot.Neck )?.Name.ToString() ?? "Unknown" );
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.Text( identifier.Identify( actor.Value.Wrist._1, actor.Value.Wrist._2, 0, EquipSlot.Wrists )?.Name.ToString() ?? "Unknown" ); ImGui.Text( identifier.Identify( actor.Value.Wrist.Set, actor.Value.Wrist.Variant, 0, EquipSlot.Wrists )?.Name.ToString() ?? "Unknown" );
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.Text( identifier.Identify( actor.Value.LFinger._1, actor.Value.LFinger._2, 0, EquipSlot.RingL )?.Name.ToString() ?? "Unknown" ); ImGui.Text( identifier.Identify( actor.Value.LFinger.Set, actor.Value.LFinger.Variant, 0, EquipSlot.RingL )?.Name.ToString() ?? "Unknown" );
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.Text( identifier.Identify( actor.Value.RFinger._1, actor.Value.RFinger._2, 0, EquipSlot.RingL )?.Name.ToString() ?? "Unknown" ); ImGui.Text( identifier.Identify( actor.Value.RFinger.Set, actor.Value.RFinger.Variant, 0, EquipSlot.RingL )?.Name.ToString() ?? "Unknown" );
// @formatter:on // @formatter:on
} }

View file

@ -65,7 +65,7 @@ namespace Penumbra.UI
_collectionsTab.Draw(); _collectionsTab.Draw();
_importTab.Draw(); _importTab.Draw();
if( Service<ModManager>.Get().Valid && !_importTab.IsImporting() ) if( Service< ModManager >.Get().Valid && !_importTab.IsImporting() )
{ {
_browserTab.Draw(); _browserTab.Draw();
InstalledTab.Draw(); InstalledTab.Draw();