From 46f7b458809bc698f2c868847a8dddf036badce5 Mon Sep 17 00:00:00 2001
From: RisaDev <151885272+RisaDev@users.noreply.github.com>
Date: Sun, 6 Apr 2025 21:18:36 +0300
Subject: [PATCH] Switch to ActorObjectManager provided by Penumbra.GameData
---
CustomizePlus.GameData/Data/ActorData.cs | 46 ----
.../Services/CutsceneService.cs | 1 +
.../Services/ObjectManager.cs | 247 ------------------
CustomizePlus.GameData/packages.lock.json | 52 ++++
.../Armatures/Services/ArmatureManager.cs | 14 +-
CustomizePlus/Core/ServiceManagerBuilder.cs | 5 +-
.../Game/Services/GameObjectService.cs | 18 +-
CustomizePlus/Profiles/ProfileManager.cs | 5 +-
.../MainWindow/Tabs/Debug/IPCTestTab.cs | 9 +-
.../Tabs/Debug/StateMonitoringTab.cs | 9 +-
CustomizePlus/packages.lock.json | 102 ++++++++
submodules/OtterGui | 2 +-
submodules/Penumbra.GameData | 2 +-
13 files changed, 182 insertions(+), 330 deletions(-)
delete mode 100644 CustomizePlus.GameData/Data/ActorData.cs
delete mode 100644 CustomizePlus.GameData/Services/ObjectManager.cs
create mode 100644 CustomizePlus.GameData/packages.lock.json
create mode 100644 CustomizePlus/packages.lock.json
diff --git a/CustomizePlus.GameData/Data/ActorData.cs b/CustomizePlus.GameData/Data/ActorData.cs
deleted file mode 100644
index 95d3540..0000000
--- a/CustomizePlus.GameData/Data/ActorData.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-using Penumbra.GameData.Interop;
-
-namespace CustomizePlus.GameData.Data;
-
-///
-/// A single actor with its label and the list of associated game objects.
-///
-public readonly struct ActorData
-{
- public readonly List Objects;
- public readonly string Label;
-
- public bool Valid
- => Objects.Count > 0;
-
- public ActorData(Actor actor, string label)
- {
- Objects = new List { actor };
- Label = label;
- }
-
- public static readonly ActorData Invalid = new(false);
-
- private ActorData(bool _)
- {
- Objects = new List(0);
- Label = string.Empty;
- }
-
- /*public LazyString ToLazyString(string invalid)
- {
- var objects = Objects;
- return Valid
- ? new LazyString(() => string.Join(", ", objects.Select(o => o.ToString())))
- : new LazyString(() => invalid);
- }*/
-
- private ActorData(List objects, string label)
- {
- Objects = objects;
- Label = label;
- }
-
- public ActorData OnlyGPose()
- => new(Objects.Where(o => o.IsGPoseOrCutscene).ToList(), Label);
-}
diff --git a/CustomizePlus.GameData/Services/CutsceneService.cs b/CustomizePlus.GameData/Services/CutsceneService.cs
index 4ab0ecd..7d596ef 100644
--- a/CustomizePlus.GameData/Services/CutsceneService.cs
+++ b/CustomizePlus.GameData/Services/CutsceneService.cs
@@ -5,6 +5,7 @@ using FFXIVClientStructs.FFXIV.Client.Game.Character;
using FFXIVClientStructs.FFXIV.Client.Game.Object;
using OtterGui.Services;
using Penumbra.GameData.Enums;
+using Penumbra.GameData.Interop;
using Penumbra.String;
using System.Diagnostics;
diff --git a/CustomizePlus.GameData/Services/ObjectManager.cs b/CustomizePlus.GameData/Services/ObjectManager.cs
deleted file mode 100644
index d2e2b43..0000000
--- a/CustomizePlus.GameData/Services/ObjectManager.cs
+++ /dev/null
@@ -1,247 +0,0 @@
-using CustomizePlus.GameData.Data;
-using Dalamud.Game.ClientState.Objects;
-using Dalamud.Plugin;
-using Dalamud.Plugin.Services;
-using FFXIVClientStructs.FFXIV.Client.Game.Control;
-using FFXIVClientStructs.FFXIV.Client.UI.Agent;
-using OtterGui.Log;
-using Penumbra.GameData.Actors;
-using Penumbra.GameData.Enums;
-using Penumbra.GameData.Interop;
-using Penumbra.String;
-
-namespace CustomizePlus.GameData.Services;
-
-public class ObjectManager(
- IFramework framework,
- IClientState clientState,
- IObjectTable objects,
- IDalamudPluginInterface pi,
- Logger log,
- ActorManager actors,
- ITargetManager targets)
- : global::Penumbra.GameData.Interop.ObjectManager(pi, log, framework, objects)
-{
- public DateTime LastUpdate
- => LastFrame;
-
- private DateTime _identifierUpdate;
-
- public bool IsInGPose => clientState.IsGPosing;
- //c+ custom
- public bool IsInLobby { get; private set; }
- public ushort World { get; private set; }
-
- private readonly Dictionary _identifiers = new(200);
- private readonly Dictionary _allWorldIdentifiers = new(200);
- private readonly Dictionary _nonOwnedIdentifiers = new(200);
-
- public IReadOnlyDictionary Identifiers
- => _identifiers;
-
- public override bool Update()
- {
- if (!base.Update() && _identifierUpdate >= LastUpdate)
- return false;
-
- _identifierUpdate = LastUpdate;
- World = (ushort)(Player.Valid ? Player.HomeWorld : 0);
- _identifiers.Clear();
- _allWorldIdentifiers.Clear();
- _nonOwnedIdentifiers.Clear();
-
- foreach (var actor in BattleNpcs.Concat(CutsceneCharacters))
- {
- if (actor.Identifier(actors, out var identifier))
- HandleIdentifier(identifier, actor);
- }
-
- void AddSpecial(ScreenActor idx, string label)
- {
- var actor = this[(int)idx];
- if (actor.Identifier(actors, out var ident))
- {
- var data = new ActorData(actor, label);
- _identifiers.Add(ident, data);
- }
- }
-
- AddSpecial(ScreenActor.CharacterScreen, "Character Screen Actor");
- AddSpecial(ScreenActor.ExamineScreen, "Examine Screen Actor");
- AddSpecial(ScreenActor.FittingRoom, "Fitting Room Actor");
- AddSpecial(ScreenActor.DyePreview, "Dye Preview Actor");
- AddSpecial(ScreenActor.Portrait, "Portrait Actor");
- AddSpecial(ScreenActor.Card6, "Card Actor 6");
- AddSpecial(ScreenActor.Card7, "Card Actor 7");
- AddSpecial(ScreenActor.Card8, "Card Actor 8");
-
- foreach (var actor in EventNpcs)
- {
- if (actor.Identifier(actors, out var identifier))
- HandleIdentifier(identifier, actor);
- }
-
- //C+ custom
- IsInLobby = AddLobbyCharacters();
-
- return true;
- }
-
- private void HandleIdentifier(ActorIdentifier identifier, Actor character)
- {
- if (!identifier.IsValid)
- return;
-
- if (!_identifiers.TryGetValue(identifier, out var data))
- {
- data = new ActorData(character, identifier.ToString());
- _identifiers[identifier] = data;
- }
- else
- {
- data.Objects.Add(character);
- }
-
- if (identifier.Type is IdentifierType.Player or IdentifierType.Owned)
- {
- var allWorld = actors.CreateIndividualUnchecked(identifier.Type, identifier.PlayerName, ushort.MaxValue,
- identifier.Kind,
- identifier.DataId);
-
- if (!_allWorldIdentifiers.TryGetValue(allWorld, out var allWorldData))
- {
- allWorldData = new ActorData(character, allWorld.ToString());
- _allWorldIdentifiers[allWorld] = allWorldData;
- }
- else
- {
- allWorldData.Objects.Add(character);
- }
- }
-
- if (identifier.Type is IdentifierType.Owned)
- {
- var nonOwned = actors.CreateNpc(identifier.Kind, identifier.DataId);
- if (!_nonOwnedIdentifiers.TryGetValue(nonOwned, out var nonOwnedData))
- {
- nonOwnedData = new ActorData(character, nonOwned.ToString());
- _nonOwnedIdentifiers[nonOwned] = nonOwnedData;
- }
- else
- {
- nonOwnedData.Objects.Add(character);
- }
- }
- }
-
- public Actor GPosePlayer
- => this[(int)ScreenActor.GPosePlayer];
-
- public Actor Player
- => this[0];
-
- public unsafe Actor Target
- => clientState.IsGPosing ? TargetSystem.Instance()->GPoseTarget : TargetSystem.Instance()->Target;
-
- public Actor Focus
- => targets.FocusTarget?.Address ?? nint.Zero;
-
- public Actor MouseOver
- => targets.MouseOverTarget?.Address ?? nint.Zero;
-
- public (ActorIdentifier Identifier, ActorData Data) PlayerData
- {
- get
- {
- Update();
- return Player.Identifier(actors, out var ident) && _identifiers.TryGetValue(ident, out var data)
- ? (ident, data)
- : (ident, ActorData.Invalid);
- }
- }
-
- public (ActorIdentifier Identifier, ActorData Data) TargetData
- {
- get
- {
- Update();
- return Target.Identifier(actors, out var ident) && _identifiers.TryGetValue(ident, out var data)
- ? (ident, data)
- : (ident, ActorData.Invalid);
- }
- }
-
- /// Also handles All Worlds players and non-owned NPCs.
- public bool ContainsKey(ActorIdentifier key)
- => Identifiers.ContainsKey(key) || _allWorldIdentifiers.ContainsKey(key) || _nonOwnedIdentifiers.ContainsKey(key);
-
- public bool TryGetValue(ActorIdentifier key, out ActorData value)
- => Identifiers.TryGetValue(key, out value);
-
- public bool TryGetValueAllWorld(ActorIdentifier key, out ActorData value)
- => _allWorldIdentifiers.TryGetValue(key, out value);
-
- public bool TryGetValueNonOwned(ActorIdentifier key, out ActorData value)
- => _nonOwnedIdentifiers.TryGetValue(key, out value);
-
- public ActorData this[ActorIdentifier key]
- => Identifiers[key];
-
- public IEnumerable Keys
- => Identifiers.Keys;
-
- public IEnumerable Values
- => Identifiers.Values;
-
- public bool GetName(string lowerName, out Actor actor)
- {
- (actor, var ret) = lowerName switch
- {
- "" => (Actor.Null, true),
- "" => (Player, true),
- "self" => (Player, true),
- "" => (Target, true),
- "target" => (Target, true),
- "" => (Focus, true),
- "focus" => (Focus, true),
- "" => (MouseOver, true),
- "mouseover" => (MouseOver, true),
- _ => (Actor.Null, false),
- };
- return ret;
- }
-
- //c+ custom
- private unsafe bool AddLobbyCharacters()
- {
- if (clientState.IsLoggedIn)
- return false;
-
- var agent = AgentLobby.Instance();
- if (agent == null)
- return false;
-
- var span = agent->LobbyData.CharaSelectEntries.AsSpan();
-
- // The lobby uses the first 8 cutscene actors.
- int cnt = 0;
- foreach (var actor in CutsceneCharacters.Take(8))
- {
- if (!actor.Valid) //shouldn't happen so should be safe to break?
- break;
-
- if (cnt >= span.Length)
- break;
-
- if (span[cnt].Value == null) //should mean the end of valid actors so should be safe to break?
- break;
-
- var chara = span[cnt].Value;
- HandleIdentifier(actors.CreatePlayer(new ByteString(chara->Name), chara->HomeWorldId), actor);
-
- cnt++;
- }
-
- return true;
- }
-}
diff --git a/CustomizePlus.GameData/packages.lock.json b/CustomizePlus.GameData/packages.lock.json
new file mode 100644
index 0000000..41726c1
--- /dev/null
+++ b/CustomizePlus.GameData/packages.lock.json
@@ -0,0 +1,52 @@
+{
+ "version": 1,
+ "dependencies": {
+ "net9.0-windows7.0": {
+ "DotNet.ReproducibleBuilds": {
+ "type": "Direct",
+ "requested": "[1.2.25, )",
+ "resolved": "1.2.25",
+ "contentHash": "xCXiw7BCxHJ8pF6wPepRUddlh2dlQlbr81gXA72hdk4FLHkKXas7EH/n+fk5UCA/YfMqG1Z6XaPiUjDbUNBUzg=="
+ },
+ "JetBrains.Annotations": {
+ "type": "Transitive",
+ "resolved": "2024.3.0",
+ "contentHash": "ox5pkeLQXjvJdyAB4b2sBYAlqZGLh3PjSnP1bQNVx72ONuTJ9+34/+Rq91Fc0dG29XG9RgZur9+NcP4riihTug=="
+ },
+ "Microsoft.Extensions.DependencyInjection": {
+ "type": "Transitive",
+ "resolved": "9.0.2",
+ "contentHash": "ZffbJrskOZ40JTzcTyKwFHS5eACSWp2bUQBBApIgGV+es8RaTD4OxUG7XxFr3RIPLXtYQ1jQzF2DjKB5fZn7Qg==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.2"
+ }
+ },
+ "Microsoft.Extensions.DependencyInjection.Abstractions": {
+ "type": "Transitive",
+ "resolved": "9.0.2",
+ "contentHash": "MNe7GSTBf3jQx5vYrXF0NZvn6l7hUKF6J54ENfAgCO8y6xjN1XUmKKWG464LP2ye6QqDiA1dkaWEZBYnhoZzjg=="
+ },
+ "ottergui": {
+ "type": "Project",
+ "dependencies": {
+ "JetBrains.Annotations": "[2024.3.0, )",
+ "Microsoft.Extensions.DependencyInjection": "[9.0.2, )"
+ }
+ },
+ "penumbra.api": {
+ "type": "Project"
+ },
+ "penumbra.gamedata": {
+ "type": "Project",
+ "dependencies": {
+ "OtterGui": "[1.0.0, )",
+ "Penumbra.Api": "[5.6.1, )",
+ "Penumbra.String": "[1.0.6, )"
+ }
+ },
+ "penumbra.string": {
+ "type": "Project"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/CustomizePlus/Armatures/Services/ArmatureManager.cs b/CustomizePlus/Armatures/Services/ArmatureManager.cs
index cdb3c1b..93a1abe 100644
--- a/CustomizePlus/Armatures/Services/ArmatureManager.cs
+++ b/CustomizePlus/Armatures/Services/ArmatureManager.cs
@@ -19,7 +19,6 @@ using OtterGui.Log;
using Penumbra.GameData.Actors;
using Penumbra.GameData.Enums;
using Penumbra.GameData.Interop;
-using ObjectManager = CustomizePlus.GameData.Services.ObjectManager;
namespace CustomizePlus.Armatures.Services;
@@ -32,7 +31,7 @@ public unsafe sealed class ArmatureManager : IDisposable
private readonly ProfileChanged _profileChangedEvent;
private readonly Logger _logger;
private readonly FrameworkManager _framework;
- private readonly ObjectManager _objectManager;
+ private readonly ActorObjectManager _objectManager;
private readonly ActorManager _actorManager;
private readonly GPoseService _gposeService;
private readonly ArmatureChanged _event;
@@ -53,7 +52,7 @@ public unsafe sealed class ArmatureManager : IDisposable
ProfileChanged profileChangedEvent,
Logger logger,
FrameworkManager framework,
- ObjectManager objectManager,
+ ActorObjectManager objectManager,
ActorManager actorManager,
GPoseService gposeService,
ArmatureChanged @event)
@@ -125,8 +124,6 @@ public unsafe sealed class ArmatureManager : IDisposable
///
private void RefreshArmatures()
{
- _objectManager.Update();
-
var currentTime = DateTime.UtcNow;
var armatureExpirationDateTime = currentTime.AddSeconds(-30);
foreach (var kvPair in Armatures.ToList())
@@ -134,7 +131,7 @@ public unsafe sealed class ArmatureManager : IDisposable
var armature = kvPair.Value;
//Only remove armatures which haven't been seen for a while
//But remove armatures of special actors (like examine screen) right away
- if (!_objectManager.Identifiers.ContainsKey(kvPair.Value.ActorIdentifier) &&
+ if (!_objectManager.ContainsKey(kvPair.Value.ActorIdentifier) &&
(armature.LastSeen <= armatureExpirationDateTime || armature.ActorIdentifier.Type == IdentifierType.Special))
{
_logger.Debug($"Removing armature {armature} because {kvPair.Key.IncognitoDebug()} is gone");
@@ -147,7 +144,7 @@ public unsafe sealed class ArmatureManager : IDisposable
armature.IsVisible = armature.LastSeen.AddSeconds(1) >= currentTime;
}
- foreach (var obj in _objectManager.Identifiers)
+ foreach (var obj in _objectManager)
{
var actorIdentifier = obj.Key.CreatePermanent();
if (!Armatures.ContainsKey(actorIdentifier))
@@ -243,9 +240,8 @@ public unsafe sealed class ArmatureManager : IDisposable
///
private bool TryLinkSkeleton(Armature armature)
{
- _objectManager.Update();
- if (!_objectManager.Identifiers.ContainsKey(armature.ActorIdentifier))
+ if (!_objectManager.ContainsKey(armature.ActorIdentifier))
return false;
var actor = _objectManager[armature.ActorIdentifier].Objects[0];
diff --git a/CustomizePlus/Core/ServiceManagerBuilder.cs b/CustomizePlus/Core/ServiceManagerBuilder.cs
index f18f770..c92ee41 100644
--- a/CustomizePlus/Core/ServiceManagerBuilder.cs
+++ b/CustomizePlus/Core/ServiceManagerBuilder.cs
@@ -31,6 +31,7 @@ using OtterGui.Log;
using OtterGui.Raii;
using OtterGui.Services;
using Penumbra.GameData.Actors;
+using Penumbra.GameData.Interop;
using Penumbra.GameData.Structs;
namespace CustomizePlus.Core;
@@ -60,7 +61,7 @@ public static class ServiceManagerBuilder
services.AddIServices(typeof(EquipItem).Assembly);
services.AddIServices(typeof(Plugin).Assembly);
- services.AddIServices(typeof(ObjectManager).Assembly);
+ services.AddIServices(typeof(CutsceneService).Assembly);
services.AddIServices(typeof(ImRaii).Assembly);
services.CreateProvider();
@@ -206,7 +207,7 @@ public static class ServiceManagerBuilder
.AddSingleton()
.AddSingleton()
.AddSingleton(p => new CutsceneResolver(idx => (short)p.GetRequiredService().GetParentIndex(idx)))
- .AddSingleton();
+ .AddSingleton();
return services;
}
diff --git a/CustomizePlus/Game/Services/GameObjectService.cs b/CustomizePlus/Game/Services/GameObjectService.cs
index 627cc1c..25bfbf7 100644
--- a/CustomizePlus/Game/Services/GameObjectService.cs
+++ b/CustomizePlus/Game/Services/GameObjectService.cs
@@ -5,7 +5,6 @@ using Dalamud.Plugin.Services;
using Penumbra.GameData.Actors;
using Penumbra.GameData.Enums;
using Penumbra.GameData.Interop;
-using ObjectManager = CustomizePlus.GameData.Services.ObjectManager;
using DalamudGameObject = Dalamud.Game.ClientState.Objects.Types.IGameObject;
using CustomizePlus.Configuration.Data;
using FFXIVClientStructs.FFXIV.Client.Game.Object;
@@ -17,13 +16,13 @@ public class GameObjectService
{
private readonly ActorManager _actorManager;
private readonly IObjectTable _objectTable;
- private readonly ObjectManager _objectManager;
+ private readonly ActorObjectManager _objectManager;
private readonly PluginConfiguration _configuration;
public GameObjectService(
ActorManager actorManager,
IObjectTable objectTable,
- ObjectManager objectManager,
+ ActorObjectManager objectManager,
PluginConfiguration configuration)
{
_actorManager = actorManager;
@@ -62,9 +61,7 @@ public class GameObjectService
///
public IEnumerable<(ActorIdentifier, Actor)> FindActorsByName(string name)
{
- _objectManager.Update();
-
- foreach (var kvPair in _objectManager.Identifiers)
+ foreach (var kvPair in _objectManager)
{
var identifier = kvPair.Key;
@@ -92,9 +89,7 @@ public class GameObjectService
if (!identifier.IsValid)
yield break;
- _objectManager.Update();
-
- foreach (var kvPair in _objectManager.Identifiers)
+ foreach (var kvPair in _objectManager)
{
var objectIdentifier = kvPair.Key;
@@ -116,7 +111,6 @@ public class GameObjectService
public Actor GetLocalPlayerActor()
{
- _objectManager.Update();
return _objectManager.Player;
}
@@ -179,10 +173,10 @@ public class GameObjectService
///
public Actor? GetActorByObjectIndex(ushort objectIndex)
{
- if (objectIndex < 0 || objectIndex >= _objectManager.TotalCount)
+ if (objectIndex < 0 || objectIndex >= _objectManager.Objects.TotalCount)
return null;
- var ptr = _objectManager[(int)objectIndex];
+ var ptr = _objectManager.Objects[(int)objectIndex];
return ptr;
}
diff --git a/CustomizePlus/Profiles/ProfileManager.cs b/CustomizePlus/Profiles/ProfileManager.cs
index f595ac4..edd24ed 100644
--- a/CustomizePlus/Profiles/ProfileManager.cs
+++ b/CustomizePlus/Profiles/ProfileManager.cs
@@ -27,7 +27,6 @@ using Penumbra.GameData.Enums;
using Penumbra.GameData.Interop;
using System.Runtime.Serialization;
using CustomizePlus.Game.Services;
-using ObjectManager = CustomizePlus.GameData.Services.ObjectManager;
using System.Threading.Tasks;
using OtterGui.Classes;
@@ -45,7 +44,7 @@ public partial class ProfileManager : IDisposable
private readonly PluginConfiguration _configuration;
private readonly ActorManager _actorManager;
private readonly GameObjectService _gameObjectService;
- private readonly ObjectManager _objectManager;
+ private readonly ActorObjectManager _objectManager;
private readonly ReverseNameDicts _reverseNameDicts;
private readonly MessageService _messageService;
private readonly ProfileChanged _event;
@@ -66,7 +65,7 @@ public partial class ProfileManager : IDisposable
PluginConfiguration configuration,
ActorManager actorManager,
GameObjectService gameObjectService,
- ObjectManager objectManager,
+ ActorObjectManager objectManager,
ReverseNameDicts reverseNameDicts,
MessageService messageService,
ProfileChanged @event,
diff --git a/CustomizePlus/UI/Windows/MainWindow/Tabs/Debug/IPCTestTab.cs b/CustomizePlus/UI/Windows/MainWindow/Tabs/Debug/IPCTestTab.cs
index 88e45c9..55251c5 100644
--- a/CustomizePlus/UI/Windows/MainWindow/Tabs/Debug/IPCTestTab.cs
+++ b/CustomizePlus/UI/Windows/MainWindow/Tabs/Debug/IPCTestTab.cs
@@ -20,6 +20,7 @@ using CustomizePlus.Core.Extensions;
using CustomizePlus.Configuration.Data;
using CustomizePlus.Api.Data;
using CustomizePlus.GameData.Extensions;
+using Penumbra.GameData.Interop;
namespace CustomizePlus.UI.Windows.MainWindow.Tabs.Debug;
@@ -33,7 +34,7 @@ public class IPCTestTab //: IDisposable
private readonly ProfileManager _profileManager;
private readonly PopupSystem _popupSystem;
private readonly GameObjectService _gameObjectService;
- private readonly ObjectManager _objectManager;
+ private readonly ActorObjectManager _objectManager;
private readonly ActorManager _actorManager;
private readonly Logger _logger;
@@ -92,7 +93,7 @@ public class IPCTestTab //: IDisposable
IObjectTable objectTable,
ProfileManager profileManager,
PopupSystem popupSystem,
- ObjectManager objectManager,
+ ActorObjectManager objectManager,
GameObjectService gameObjectService,
ActorManager actorManager,
Logger logger,
@@ -115,8 +116,6 @@ public class IPCTestTab //: IDisposable
public unsafe void Draw()
{
- _objectManager.Update();
-
if (_targetCharacterName == null)
_targetCharacterName = _gameObjectService.GetCurrentPlayerName();
@@ -136,7 +135,7 @@ public class IPCTestTab //: IDisposable
if (ImGui.Button("Owned Actors Temporary Profile Test"))
{
bool found = false;
- foreach(var obj in _objectManager)
+ foreach(var obj in _objectManager.Objects)
{
if (!obj.Identifier(_actorManager, out var ownedIdent) ||
ownedIdent.Type != Penumbra.GameData.Enums.IdentifierType.Owned ||
diff --git a/CustomizePlus/UI/Windows/MainWindow/Tabs/Debug/StateMonitoringTab.cs b/CustomizePlus/UI/Windows/MainWindow/Tabs/Debug/StateMonitoringTab.cs
index 39c8c75..6c669c2 100644
--- a/CustomizePlus/UI/Windows/MainWindow/Tabs/Debug/StateMonitoringTab.cs
+++ b/CustomizePlus/UI/Windows/MainWindow/Tabs/Debug/StateMonitoringTab.cs
@@ -13,6 +13,7 @@ using CustomizePlus.Core.Extensions;
using System.Numerics;
using CustomizePlus.Game.Services;
using CustomizePlus.Core.Data;
+using Penumbra.GameData.Interop;
namespace CustomizePlus.UI.Windows.MainWindow.Tabs.Debug;
@@ -21,14 +22,14 @@ public class StateMonitoringTab
private readonly ProfileManager _profileManager;
private readonly TemplateManager _templateManager;
private readonly ArmatureManager _armatureManager;
- private readonly ObjectManager _objectManager;
+ private readonly ActorObjectManager _objectManager;
private readonly GameObjectService _gameObjectService;
public StateMonitoringTab(
ProfileManager profileManager,
TemplateManager templateManager,
ArmatureManager armatureManager,
- ObjectManager objectManager,
+ ActorObjectManager objectManager,
GameObjectService gameObjectService)
{
_profileManager = profileManager;
@@ -55,7 +56,7 @@ public class StateMonitoringTab
if (showArmatures)
DrawArmatures();
- var showObjectManager = ImGui.CollapsingHeader($"Object manager ({_objectManager.Identifiers.Count})###objectmanager_header");
+ var showObjectManager = ImGui.CollapsingHeader($"Object manager ({_objectManager.Count})###objectmanager_header");
if (showObjectManager)
DrawObjectManager();
@@ -93,7 +94,7 @@ public class StateMonitoringTab
private void DrawObjectManager()
{
- foreach (var kvPair in _objectManager.Identifiers)
+ foreach (var kvPair in _objectManager)
{
var show = ImGui.CollapsingHeader($"{kvPair.Key} ({kvPair.Value.Objects.Count} objects)###object-{kvPair.Key}");
diff --git a/CustomizePlus/packages.lock.json b/CustomizePlus/packages.lock.json
new file mode 100644
index 0000000..e3a3200
--- /dev/null
+++ b/CustomizePlus/packages.lock.json
@@ -0,0 +1,102 @@
+{
+ "version": 1,
+ "dependencies": {
+ "net9.0-windows7.0": {
+ "DalamudPackager": {
+ "type": "Direct",
+ "requested": "[12.0.0, )",
+ "resolved": "12.0.0",
+ "contentHash": "J5TJLV3f16T/E2H2P17ClWjtfEBPpq3yxvqW46eN36JCm6wR+EaoaYkqG9Rm5sHqs3/nK/vKjWWyvEs/jhKoXw=="
+ },
+ "DotNet.ReproducibleBuilds": {
+ "type": "Direct",
+ "requested": "[1.2.25, )",
+ "resolved": "1.2.25",
+ "contentHash": "xCXiw7BCxHJ8pF6wPepRUddlh2dlQlbr81gXA72hdk4FLHkKXas7EH/n+fk5UCA/YfMqG1Z6XaPiUjDbUNBUzg=="
+ },
+ "GitInfo": {
+ "type": "Direct",
+ "requested": "[3.3.5, )",
+ "resolved": "3.3.5",
+ "contentHash": "xt8tAMq42KompgmZI5fpko9IY9cuGqjvNFCc+B6iZeoCHlqcbuGZz33SFD+jTsPZTFfrxqTXvywm/s8DcFcEIg==",
+ "dependencies": {
+ "ThisAssembly.Constants": "1.4.1"
+ }
+ },
+ "Microsoft.Extensions.DependencyInjection": {
+ "type": "Direct",
+ "requested": "[9.0.2, )",
+ "resolved": "9.0.2",
+ "contentHash": "ZffbJrskOZ40JTzcTyKwFHS5eACSWp2bUQBBApIgGV+es8RaTD4OxUG7XxFr3RIPLXtYQ1jQzF2DjKB5fZn7Qg==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.2"
+ }
+ },
+ "StyleCop.Analyzers": {
+ "type": "Direct",
+ "requested": "[1.1.118, )",
+ "resolved": "1.1.118",
+ "contentHash": "Onx6ovGSqXSK07n/0eM3ZusiNdB6cIlJdabQhWGgJp3Vooy9AaLS/tigeybOJAobqbtggTamoWndz72JscZBvw=="
+ },
+ "JetBrains.Annotations": {
+ "type": "Transitive",
+ "resolved": "2024.3.0",
+ "contentHash": "ox5pkeLQXjvJdyAB4b2sBYAlqZGLh3PjSnP1bQNVx72ONuTJ9+34/+Rq91Fc0dG29XG9RgZur9+NcP4riihTug=="
+ },
+ "Microsoft.CSharp": {
+ "type": "Transitive",
+ "resolved": "4.7.0",
+ "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA=="
+ },
+ "Microsoft.Extensions.DependencyInjection.Abstractions": {
+ "type": "Transitive",
+ "resolved": "9.0.2",
+ "contentHash": "MNe7GSTBf3jQx5vYrXF0NZvn6l7hUKF6J54ENfAgCO8y6xjN1XUmKKWG464LP2ye6QqDiA1dkaWEZBYnhoZzjg=="
+ },
+ "System.Threading.Tasks.Extensions": {
+ "type": "Transitive",
+ "resolved": "4.5.4",
+ "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg=="
+ },
+ "ThisAssembly.Constants": {
+ "type": "Transitive",
+ "resolved": "1.4.1",
+ "contentHash": "sV0CDYlC6YSIkYbdwd4+jRinLb888Dac71pmNhF2Ll6UXY1J+1oVt3EfmX6euXEKz2RLdfV+4GyZctfEA0NSqA==",
+ "dependencies": {
+ "Microsoft.CSharp": "4.7.0",
+ "System.Threading.Tasks.Extensions": "4.5.4"
+ }
+ },
+ "customizeplus.gamedata": {
+ "type": "Project",
+ "dependencies": {
+ "Penumbra.GameData": "[1.0.0, )"
+ }
+ },
+ "ecommonslite": {
+ "type": "Project"
+ },
+ "ottergui": {
+ "type": "Project",
+ "dependencies": {
+ "JetBrains.Annotations": "[2024.3.0, )",
+ "Microsoft.Extensions.DependencyInjection": "[9.0.2, )"
+ }
+ },
+ "penumbra.api": {
+ "type": "Project"
+ },
+ "penumbra.gamedata": {
+ "type": "Project",
+ "dependencies": {
+ "OtterGui": "[1.0.0, )",
+ "Penumbra.Api": "[5.6.1, )",
+ "Penumbra.String": "[1.0.6, )"
+ }
+ },
+ "penumbra.string": {
+ "type": "Project"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/submodules/OtterGui b/submodules/OtterGui
index 3396ee1..f53fd22 160000
--- a/submodules/OtterGui
+++ b/submodules/OtterGui
@@ -1 +1 @@
-Subproject commit 3396ee176fa72ad2dfb2de3294f7125ebce4dae5
+Subproject commit f53fd227a242435ce44a9fe9c5e847d0ca788869
diff --git a/submodules/Penumbra.GameData b/submodules/Penumbra.GameData
index ab63da8..801e98a 160000
--- a/submodules/Penumbra.GameData
+++ b/submodules/Penumbra.GameData
@@ -1 +1 @@
-Subproject commit ab63da8047f3d99240159bb1b17dbcb61d77326a
+Subproject commit 801e98a2956d707a25fd19bdfa46dc674c95365d