using Dalamud.Game.ClientState.Objects.Enums; using Penumbra.GameData.Actors; using Penumbra.GameData.Enums; using PenumbraExtensions = Penumbra.GameData.Actors.ActorIdentifierExtensions; namespace CustomizePlus.GameData.Extensions; public static class ActorIdentifierExtensions { /// /// Get actor name. Without owner's name if this is owned object. /// /// /// /// public static string ToNameWithoutOwnerName(this ActorIdentifier identifier) { if (!identifier.IsValid) return "Invalid"; if (identifier.Type != IdentifierType.Owned) return identifier.ToName(); if (PenumbraExtensions.Manager == null) throw new Exception("ActorIdentifier.Manager is not initialized"); return PenumbraExtensions.Manager.Data.ToName(identifier.Kind, identifier.DataId); } /// /// Wrapper around Incognito which returns non-incognito name in debug builds /// /// /// public static string IncognitoDebug(this ActorIdentifier identifier) { if (!identifier.IsValid) return "Invalid"; try { #if !INCOGNIFY_STRINGS return identifier.ToString(); #else return identifier.Incognito(null); #endif } catch (Exception e) { #if DEBUG throw; #else return "Unknown"; #endif } } /// /// For now used to determine if root scaling should be allowed or not /// /// /// public static bool IsAllowedForProfiles(this ActorIdentifier identifier) { if (!identifier.IsValid) return false; switch (identifier.Type) { case IdentifierType.Player: case IdentifierType.Retainer: case IdentifierType.Npc: return true; case IdentifierType.Owned: return identifier.Kind == ObjectKind.BattleNpc || //identifier.Kind == ObjectKind.MountType || identifier.Kind == ObjectKind.Companion; default: return false; } } /// /// Get "true" actor for special actors. Returns ActorIdentifier.Invalid for non-special actors or if actor cannot be found. /// /// /// /// public static ActorIdentifier GetTrueActorForSpecialType(this ActorIdentifier identifier) { if (!identifier.IsValid) return ActorIdentifier.Invalid; if (identifier.Type != IdentifierType.Special) return ActorIdentifier.Invalid; if (PenumbraExtensions.Manager == null) throw new Exception("ActorIdentifier.Manager is not initialized"); switch (identifier.Special) { case ScreenActor.GPosePlayer: case ScreenActor.CharacterScreen: case ScreenActor.FittingRoom: case ScreenActor.DyePreview: case ScreenActor.Portrait: return PenumbraExtensions.Manager.GetCurrentPlayer(); case ScreenActor.ExamineScreen: var examineIdentifier = PenumbraExtensions.Manager.GetInspectPlayer(); if (!examineIdentifier.IsValid) examineIdentifier = PenumbraExtensions.Manager.GetGlamourPlayer(); //returns ActorIdentifier.Invalid if player is invalid if (!examineIdentifier.IsValid) return ActorIdentifier.Invalid; return examineIdentifier; case ScreenActor.Card6: case ScreenActor.Card7: case ScreenActor.Card8: return PenumbraExtensions.Manager.GetCardPlayer(); } return ActorIdentifier.Invalid; } }