Switch to ActorObjectManager provided by Penumbra.GameData

This commit is contained in:
RisaDev
2025-04-06 21:18:36 +03:00
parent a8a056aed3
commit 46f7b45880
13 changed files with 182 additions and 330 deletions

View File

@@ -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
/// </summary>
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
/// </summary>
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];

View File

@@ -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<CutsceneService>()
.AddSingleton<GameEventManager>()
.AddSingleton(p => new CutsceneResolver(idx => (short)p.GetRequiredService<CutsceneService>().GetParentIndex(idx)))
.AddSingleton<ObjectManager>();
.AddSingleton<ActorObjectManager>();
return services;
}

View File

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

View File

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

View File

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

View File

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

View File

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