diff --git a/Penumbra.GameData/Actors/ActorManager.Identifiers.cs b/Penumbra.GameData/Actors/ActorManager.Identifiers.cs index ec0782fb..c5066174 100644 --- a/Penumbra.GameData/Actors/ActorManager.Identifiers.cs +++ b/Penumbra.GameData/Actors/ActorManager.Identifiers.cs @@ -107,9 +107,9 @@ public partial class ActorManager } /// - /// Compute an ActorIdentifier from a GameObject. + /// Compute an ActorIdentifier from a GameObject. If check is true, the values are checked for validity. /// - public unsafe ActorIdentifier FromObject(FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject* actor) + public unsafe ActorIdentifier FromObject(FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject* actor, bool check = true) { if (actor == null) return ActorIdentifier.Invalid; @@ -119,11 +119,11 @@ public partial class ActorManager { var parentIdx = _toParentIdx(idx); if (parentIdx >= 0) - return FromObject((FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject*)_objects.GetObjectAddress(parentIdx)); + return FromObject((FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject*)_objects.GetObjectAddress(parentIdx), check); } else if (idx is >= (ushort)SpecialActor.CharacterScreen and <= (ushort)SpecialActor.Portrait) { - return CreateSpecial((SpecialActor)idx); + return CreateIndividualUnchecked(IdentifierType.Special, ByteString.Empty, idx, ObjectKind.None, uint.MaxValue); } switch ((ObjectKind)actor->ObjectKind) @@ -132,7 +132,9 @@ public partial class ActorManager { var name = new ByteString(actor->Name); var homeWorld = ((FFXIVClientStructs.FFXIV.Client.Game.Character.Character*)actor)->HomeWorld; - return CreatePlayer(name, homeWorld); + return check + ? CreatePlayer(name, homeWorld) + : CreateIndividualUnchecked(IdentifierType.Player, name, homeWorld, ObjectKind.None, uint.MaxValue); } case ObjectKind.BattleNpc: { @@ -146,14 +148,24 @@ public partial class ActorManager var name = new ByteString(owner->GameObject.Name); var homeWorld = owner->HomeWorld; - return CreateOwned(name, homeWorld, ObjectKind.BattleNpc, - ((FFXIVClientStructs.FFXIV.Client.Game.Character.Character*)actor)->NameID); + return check + ? CreateOwned(name, homeWorld, ObjectKind.BattleNpc, + ((FFXIVClientStructs.FFXIV.Client.Game.Character.Character*)actor)->NameID) + : CreateIndividualUnchecked(IdentifierType.Owned, name, homeWorld, ObjectKind.BattleNpc, + ((FFXIVClientStructs.FFXIV.Client.Game.Character.Character*)actor)->NameID); } - return CreateNpc(ObjectKind.BattleNpc, ((FFXIVClientStructs.FFXIV.Client.Game.Character.Character*)actor)->NameID, - actor->ObjectIndex); + return check + ? CreateNpc(ObjectKind.BattleNpc, ((FFXIVClientStructs.FFXIV.Client.Game.Character.Character*)actor)->NameID, + actor->ObjectIndex) + : CreateIndividualUnchecked(IdentifierType.Npc, ByteString.Empty, actor->ObjectIndex, ObjectKind.BattleNpc, + ((FFXIVClientStructs.FFXIV.Client.Game.Character.Character*)actor)->NameID); } - case ObjectKind.EventNpc: return CreateNpc(ObjectKind.EventNpc, actor->DataID, actor->ObjectIndex); + case ObjectKind.EventNpc: + return check + ? CreateNpc(ObjectKind.EventNpc, actor->DataID, actor->ObjectIndex) + : CreateIndividualUnchecked(IdentifierType.Npc, ByteString.Empty, actor->ObjectIndex, ObjectKind.EventNpc, + actor->ObjectIndex); case ObjectKind.MountType: case ObjectKind.Companion: case (ObjectKind)15: // TODO: CS Update @@ -166,7 +178,10 @@ public partial class ActorManager return ActorIdentifier.Invalid; var dataId = GetCompanionId(actor, &owner->GameObject); - return CreateOwned(new ByteString(owner->GameObject.Name), owner->HomeWorld, (ObjectKind)actor->ObjectKind, dataId); + return check + ? CreateOwned(new ByteString(owner->GameObject.Name), owner->HomeWorld, (ObjectKind)actor->ObjectKind, dataId) + : CreateIndividualUnchecked(IdentifierType.Owned, new ByteString(owner->GameObject.Name), owner->HomeWorld, + (ObjectKind)actor->ObjectKind, dataId); } default: return ActorIdentifier.Invalid; } @@ -187,8 +202,8 @@ public partial class ActorManager }; } - public unsafe ActorIdentifier FromObject(GameObject? actor) - => FromObject((FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject*)(actor?.Address ?? IntPtr.Zero)); + public unsafe ActorIdentifier FromObject(GameObject? actor, bool check = true) + => FromObject((FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject*)(actor?.Address ?? IntPtr.Zero), check); public ActorIdentifier CreateIndividual(IdentifierType type, ByteString name, ushort homeWorld, ObjectKind kind, uint dataId) => type switch diff --git a/Penumbra/Collections/IndividualCollections.Access.cs b/Penumbra/Collections/IndividualCollections.Access.cs index 29c403d7..f09dadb0 100644 --- a/Penumbra/Collections/IndividualCollections.Access.cs +++ b/Penumbra/Collections/IndividualCollections.Access.cs @@ -76,10 +76,10 @@ public sealed partial class IndividualCollections : IReadOnlyList< (string Displ } public bool TryGetCollection( GameObject? gameObject, out ModCollection? collection ) - => TryGetCollection( _actorManager.FromObject( gameObject ), out collection ); + => TryGetCollection( _actorManager.FromObject( gameObject, false ), out collection ); public unsafe bool TryGetCollection( FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject* gameObject, out ModCollection? collection ) - => TryGetCollection( _actorManager.FromObject( gameObject ), out collection ); + => TryGetCollection( _actorManager.FromObject( gameObject, false ), out collection ); private bool CheckWorlds( ActorIdentifier identifier, out ModCollection? collection ) { diff --git a/Penumbra/Interop/Resolver/PathResolver.DrawObjectState.cs b/Penumbra/Interop/Resolver/PathResolver.DrawObjectState.cs index 3f53c089..bf335f55 100644 --- a/Penumbra/Interop/Resolver/PathResolver.DrawObjectState.cs +++ b/Penumbra/Interop/Resolver/PathResolver.DrawObjectState.cs @@ -8,7 +8,6 @@ using FFXIVClientStructs.FFXIV.Client.Game.Object; using Penumbra.Api; using FFXIVClientStructs.FFXIV.Client.Graphics.Scene; using OtterGui.Classes; -using Penumbra.GameData.Actors; using Penumbra.GameData.Enums; using Penumbra.String.Classes; diff --git a/Penumbra/Interop/Resolver/PathResolver.Identification.cs b/Penumbra/Interop/Resolver/PathResolver.Identification.cs index d7b25cd3..18c55ca8 100644 --- a/Penumbra/Interop/Resolver/PathResolver.Identification.cs +++ b/Penumbra/Interop/Resolver/PathResolver.Identification.cs @@ -38,7 +38,7 @@ public unsafe partial class PathResolver } else { - var identifier = Penumbra.Actors.FromObject( gameObject ); + var identifier = Penumbra.Actors.FromObject( gameObject, false ); var collection = CollectionByIdentifier( identifier ) ?? CheckYourself( identifier, gameObject ) ?? CollectionByAttributes( gameObject ) diff --git a/Penumbra/UI/ConfigWindow.DebugTab.cs b/Penumbra/UI/ConfigWindow.DebugTab.cs index 1818fbe8..4142faa5 100644 --- a/Penumbra/UI/ConfigWindow.DebugTab.cs +++ b/Penumbra/UI/ConfigWindow.DebugTab.cs @@ -190,7 +190,7 @@ public partial class ConfigWindow { ImGuiUtil.DrawTableColumn( $"{( ( GameObject* )obj.Address )->ObjectIndex}" ); ImGuiUtil.DrawTableColumn( $"0x{obj.Address:X}" ); - var identifier = Penumbra.Actors.FromObject( obj ); + var identifier = Penumbra.Actors.FromObject( obj, true ); ImGuiUtil.DrawTableColumn( Penumbra.Actors.ToString( identifier ) ); ImGuiUtil.DrawTableColumn( identifier.DataId.ToString() ); }