mirror of
https://github.com/xivdev/Penumbra.git
synced 2025-12-12 10:17:22 +01:00
Fixed CharEquipment wrong order of rings, fixed some GPose redraw stuff, gave some variables actual names.
This commit is contained in:
parent
c7d22935ef
commit
f372cc001f
5 changed files with 40 additions and 29 deletions
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue