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 )]
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()

View file

@ -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;
}
}

View file

@ -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

View file

@ -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
}

View file

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