diff --git a/Penumbra/Game/CharEquipment.cs b/Penumbra/Game/CharEquipment.cs index 8ccbc76d..e863c3bd 100644 --- a/Penumbra/Game/CharEquipment.cs +++ b/Penumbra/Game/CharEquipment.cs @@ -12,24 +12,24 @@ namespace Penumbra.Game [StructLayout( LayoutKind.Sequential, Pack = 1 )] internal readonly struct Weapon { - public readonly ushort _1; - public readonly ushort _2; - public readonly ushort _3; - public readonly byte _4; + public readonly ushort Set; + public readonly ushort Type; + public readonly ushort Variant; + public readonly byte Stain; public override string ToString() - => $"{_1},{_2},{_3},{_4}"; + => $"{Set},{Type},{Variant},{Stain}"; } [StructLayout( LayoutKind.Sequential, Pack = 1 )] internal readonly struct Equip { - public readonly ushort _1; - public readonly byte _2; - public readonly byte _3; + public readonly ushort Set; + public readonly byte Variant; + public readonly byte Stain; public override string ToString() - => $"{_1},{_2},{_3}"; + => $"{Set},{Variant},{Stain}"; } private const int MainWeaponOffset = 0x0F08; @@ -48,8 +48,8 @@ namespace Penumbra.Game internal readonly Equip Ear; internal readonly Equip Neck; internal readonly Equip Wrist; - internal readonly Equip LFinger; internal readonly Equip RFinger; + internal readonly Equip LFinger; internal readonly ushort IsSet; // Also fills struct size to 56, a multiple of 8. public CharEquipment() diff --git a/Penumbra/Game/ObjectIdentification.cs b/Penumbra/Game/ObjectIdentification.cs index 9f3ed287..6d21047a 100644 --- a/Penumbra/Game/ObjectIdentification.cs +++ b/Penumbra/Game/ObjectIdentification.cs @@ -146,8 +146,9 @@ namespace Penumbra.Game idx = ~idx; } + var endIdx = idx + 1; - while( endIdx < list.Count && maskedKey == ( list[endIdx].Item1 & mask ) ) + while( endIdx < list.Count && maskedKey == ( list[ endIdx ].Item1 & mask ) ) { ++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 ) { case EquipSlot.MainHand: 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; } 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; } } diff --git a/Penumbra/Interop/PlayerWatcher.cs b/Penumbra/Interop/PlayerWatcher.cs index 2d8a3256..8c983571 100644 --- a/Penumbra/Interop/PlayerWatcher.cs +++ b/Penumbra/Interop/PlayerWatcher.cs @@ -86,12 +86,20 @@ namespace Penumbra.Interop var gPoseActor = actors[ ActorRefresher.GPosePlayerActorIdx ]; if( gPoseActor == null ) { + if( _lastGPoseAddress != IntPtr.Zero && actors[ 0 ] != null && _equip.ContainsKey( actors[ 0 ].Name ) ) + { + ActorChanged?.Invoke( actors[ 0 ] ); + } + _lastGPoseAddress = IntPtr.Zero; } else if( gPoseActor.Address != _lastGPoseAddress ) { _lastGPoseAddress = gPoseActor.Address; - ActorChanged?.Invoke( gPoseActor ); + if( _equip.ContainsKey( gPoseActor.Name ) ) + { + ActorChanged?.Invoke( gPoseActor ); + } } for( var i = 0; i < ActorsPerFrame; ++i ) @@ -100,7 +108,7 @@ namespace Penumbra.Interop ? _frameTicker + 2 : 0; - var actor = actors[ _frameTicker ]; + var actor = _frameTicker == 0 && gPoseActor != null ? gPoseActor : actors[ _frameTicker ]; if( actor == null || actor.ObjectKind != ObjectKind.Player || actor.Name == null diff --git a/Penumbra/UI/MenuTabs/TabDebug.cs b/Penumbra/UI/MenuTabs/TabDebug.cs index 87bc5f8b..931fba73 100644 --- a/Penumbra/UI/MenuTabs/TabDebug.cs +++ b/Penumbra/UI/MenuTabs/TabDebug.cs @@ -64,17 +64,17 @@ namespace Penumbra.UI ImGui.Text( "(not set)" ); } 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.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.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.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.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.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.TableNextColumn(); @@ -94,17 +94,17 @@ namespace Penumbra.UI ImGui.TableNextRow(); 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.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.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.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.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.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 } diff --git a/Penumbra/UI/SettingsMenu.cs b/Penumbra/UI/SettingsMenu.cs index 0ba17ec2..b1db0930 100644 --- a/Penumbra/UI/SettingsMenu.cs +++ b/Penumbra/UI/SettingsMenu.cs @@ -65,7 +65,7 @@ namespace Penumbra.UI _collectionsTab.Draw(); _importTab.Draw(); - if( Service.Get().Valid && !_importTab.IsImporting() ) + if( Service< ModManager >.Get().Valid && !_importTab.IsImporting() ) { _browserTab.Draw(); InstalledTab.Draw();