diff --git a/LightlessSync/Interop/Ipc/IpcCallerBrio.cs b/LightlessSync/Interop/Ipc/IpcCallerBrio.cs index 83105d9..0ddaed8 100644 --- a/LightlessSync/Interop/Ipc/IpcCallerBrio.cs +++ b/LightlessSync/Interop/Ipc/IpcCallerBrio.cs @@ -1,6 +1,6 @@ -using Dalamud.Game.ClientState.Objects.Types; +using Brio.API; +using Dalamud.Game.ClientState.Objects.Types; using Dalamud.Plugin; -using Dalamud.Plugin.Ipc; using LightlessSync.API.Dto.CharaData; using LightlessSync.Interop.Ipc.Framework; using LightlessSync.Services; @@ -13,21 +13,23 @@ namespace LightlessSync.Interop.Ipc; public sealed class IpcCallerBrio : IpcServiceBase { - private static readonly IpcServiceDescriptor BrioDescriptor = new("Brio", "Brio", new Version(0, 0, 0, 0)); + private static readonly IpcServiceDescriptor BrioDescriptor = new("Brio", "Brio", new Version(3, 0, 0, 0)); private readonly ILogger _logger; private readonly DalamudUtilService _dalamudUtilService; - private readonly ICallGateSubscriber<(int, int)> _brioApiVersion; - private readonly ICallGateSubscriber> _brioSpawnActorAsync; - private readonly ICallGateSubscriber _brioDespawnActor; - private readonly ICallGateSubscriber _brioSetModelTransform; - private readonly ICallGateSubscriber _brioGetModelTransform; - private readonly ICallGateSubscriber _brioGetPoseAsJson; - private readonly ICallGateSubscriber _brioSetPoseFromJson; - private readonly ICallGateSubscriber _brioFreezeActor; - private readonly ICallGateSubscriber _brioFreezePhysics; + private readonly ApiVersion _apiVersion; + private readonly SpawnActor _spawnActor; + private readonly DespawnActor _despawnActor; + private readonly SetModelTransform _setModelTransform; + private readonly GetModelTransform _getModelTransform; + + private readonly GetPoseAsJson _getPoseAsJson; + private readonly LoadPoseFromJson _setPoseFromJson; + + private readonly FreezeActor _freezeActor; + private readonly FreezePhysics _freezePhysics; public IpcCallerBrio(ILogger logger, IDalamudPluginInterface dalamudPluginInterface, DalamudUtilService dalamudUtilService, LightlessMediator mediator) : base(logger, mediator, dalamudPluginInterface, BrioDescriptor) @@ -35,15 +37,18 @@ public sealed class IpcCallerBrio : IpcServiceBase _logger = logger; _dalamudUtilService = dalamudUtilService; - _brioApiVersion = dalamudPluginInterface.GetIpcSubscriber<(int, int)>("Brio.ApiVersion"); - _brioSpawnActorAsync = dalamudPluginInterface.GetIpcSubscriber>("Brio.Actor.SpawnExAsync"); - _brioDespawnActor = dalamudPluginInterface.GetIpcSubscriber("Brio.Actor.Despawn"); - _brioSetModelTransform = dalamudPluginInterface.GetIpcSubscriber("Brio.Actor.SetModelTransform"); - _brioGetModelTransform = dalamudPluginInterface.GetIpcSubscriber("Brio.Actor.GetModelTransform"); - _brioGetPoseAsJson = dalamudPluginInterface.GetIpcSubscriber("Brio.Actor.Pose.GetPoseAsJson"); - _brioSetPoseFromJson = dalamudPluginInterface.GetIpcSubscriber("Brio.Actor.Pose.LoadFromJson"); - _brioFreezeActor = dalamudPluginInterface.GetIpcSubscriber("Brio.Actor.Freeze"); - _brioFreezePhysics = dalamudPluginInterface.GetIpcSubscriber("Brio.FreezePhysics"); + _apiVersion = new ApiVersion(dalamudPluginInterface); + _spawnActor = new SpawnActor(dalamudPluginInterface); + _despawnActor = new DespawnActor(dalamudPluginInterface); + + _setModelTransform = new SetModelTransform(dalamudPluginInterface); + _getModelTransform = new GetModelTransform(dalamudPluginInterface); + + _getPoseAsJson = new GetPoseAsJson(dalamudPluginInterface); + _setPoseFromJson = new LoadPoseFromJson(dalamudPluginInterface); + + _freezeActor = new FreezeActor(dalamudPluginInterface); + _freezePhysics = new FreezePhysics(dalamudPluginInterface); CheckAPI(); } @@ -52,7 +57,7 @@ public sealed class IpcCallerBrio : IpcServiceBase { if (!APIAvailable) return null; _logger.LogDebug("Spawning Brio Actor"); - return await _brioSpawnActorAsync.InvokeFunc(false, false, true).ConfigureAwait(false); + return await _dalamudUtilService.RunOnFrameworkThread(() => _spawnActor.Invoke(Brio.API.Enums.SpawnFlags.Default, true)).ConfigureAwait(false); } public async Task DespawnActorAsync(nint address) @@ -61,7 +66,7 @@ public sealed class IpcCallerBrio : IpcServiceBase var gameObject = await _dalamudUtilService.CreateGameObjectAsync(address).ConfigureAwait(false); if (gameObject == null) return false; _logger.LogDebug("Despawning Brio Actor {actor}", gameObject.Name.TextValue); - return await _dalamudUtilService.RunOnFrameworkThread(() => _brioDespawnActor.InvokeFunc(gameObject)).ConfigureAwait(false); + return await _dalamudUtilService.RunOnFrameworkThread(() => _despawnActor.Invoke(gameObject)).ConfigureAwait(false); } public async Task ApplyTransformAsync(nint address, WorldData data) @@ -71,7 +76,7 @@ public sealed class IpcCallerBrio : IpcServiceBase if (gameObject == null) return false; _logger.LogDebug("Applying Transform to Actor {actor}", gameObject.Name.TextValue); - return await _dalamudUtilService.RunOnFrameworkThread(() => _brioSetModelTransform.InvokeFunc(gameObject, + return await _dalamudUtilService.RunOnFrameworkThread(() => _setModelTransform.Invoke(gameObject, new Vector3(data.PositionX, data.PositionY, data.PositionZ), new Quaternion(data.RotationX, data.RotationY, data.RotationZ, data.RotationW), new Vector3(data.ScaleX, data.ScaleY, data.ScaleZ), false)).ConfigureAwait(false); @@ -82,8 +87,7 @@ public sealed class IpcCallerBrio : IpcServiceBase if (!APIAvailable) return default; var gameObject = await _dalamudUtilService.CreateGameObjectAsync(address).ConfigureAwait(false); if (gameObject == null) return default; - var data = await _dalamudUtilService.RunOnFrameworkThread(() => _brioGetModelTransform.InvokeFunc(gameObject)).ConfigureAwait(false); - //_logger.LogDebug("Getting Transform from Actor {actor}", gameObject.Name.TextValue); + var data = await _dalamudUtilService.RunOnFrameworkThread(() => _getModelTransform.Invoke(gameObject)).ConfigureAwait(false); return new WorldData() { @@ -107,7 +111,7 @@ public sealed class IpcCallerBrio : IpcServiceBase if (gameObject == null) return null; _logger.LogDebug("Getting Pose from Actor {actor}", gameObject.Name.TextValue); - return await _dalamudUtilService.RunOnFrameworkThread(() => _brioGetPoseAsJson.InvokeFunc(gameObject)).ConfigureAwait(false); + return await _dalamudUtilService.RunOnFrameworkThread(() => _getPoseAsJson.Invoke(gameObject)).ConfigureAwait(false); } public async Task SetPoseAsync(nint address, string pose) @@ -118,15 +122,15 @@ public sealed class IpcCallerBrio : IpcServiceBase _logger.LogDebug("Setting Pose to Actor {actor}", gameObject.Name.TextValue); var applicablePose = JsonNode.Parse(pose)!; - var currentPose = await _dalamudUtilService.RunOnFrameworkThread(() => _brioGetPoseAsJson.InvokeFunc(gameObject)).ConfigureAwait(false); + var currentPose = await _dalamudUtilService.RunOnFrameworkThread(() => _getPoseAsJson.Invoke(gameObject)).ConfigureAwait(false); applicablePose["ModelDifference"] = JsonNode.Parse(JsonNode.Parse(currentPose)!["ModelDifference"]!.ToJsonString()); await _dalamudUtilService.RunOnFrameworkThread(() => { - _brioFreezeActor.InvokeFunc(gameObject); - _brioFreezePhysics.InvokeFunc(); + _freezeActor.Invoke(gameObject); + _freezePhysics.Invoke(); }).ConfigureAwait(false); - return await _dalamudUtilService.RunOnFrameworkThread(() => _brioSetPoseFromJson.InvokeFunc(gameObject, applicablePose.ToJsonString(), false)).ConfigureAwait(false); + return await _dalamudUtilService.RunOnFrameworkThread(() => _setPoseFromJson.Invoke(gameObject, applicablePose.ToJsonString(), false)).ConfigureAwait(false); } protected override IpcConnectionState EvaluateState() @@ -139,8 +143,8 @@ public sealed class IpcCallerBrio : IpcServiceBase try { - var version = _brioApiVersion.InvokeFunc(); - return version.Item1 == 2 && version.Item2 >= 0 + var version = _apiVersion.Invoke(); + return version.Item1 == 3 && version.Item2 >= 0 ? IpcConnectionState.Available : IpcConnectionState.VersionMismatch; } diff --git a/LightlessSync/LightlessSync.csproj b/LightlessSync/LightlessSync.csproj index 11b9c14..10f147f 100644 --- a/LightlessSync/LightlessSync.csproj +++ b/LightlessSync/LightlessSync.csproj @@ -28,6 +28,7 @@ + diff --git a/LightlessSync/packages.lock.json b/LightlessSync/packages.lock.json index 830a83c..61c2acc 100644 --- a/LightlessSync/packages.lock.json +++ b/LightlessSync/packages.lock.json @@ -8,6 +8,12 @@ "resolved": "2.0.0", "contentHash": "v447kojeuNYSY5dvtVGG2bv1+M3vOWJXcrYWwXho/2uUpuwK6qPeu5WSMlqLm4VRJu96kysVO11La0zN3dLAuQ==" }, + "Brio.API": { + "type": "Direct", + "requested": "[3.0.0, )", + "resolved": "3.0.0", + "contentHash": "0g7BTpSj/Nwfnpkz3R2FCzDIauhUdCb5zEt9cBWB0xrDrhugvUW7/irRyB48gyHDaK4Cv13al2IGrfW7l/jBUg==" + }, "DalamudPackager": { "type": "Direct", "requested": "[14.0.0, )", @@ -139,19 +145,6 @@ "resolved": "16.3.0", "contentHash": "SgMOdxbz8X65z8hraIs6hOEdnkH6hESTAIUa7viEngHOYaH+6q5XJmwr1+yb9vJpNQ19hCQY69xbFsLtXpobQA==" }, - "BCnEncoder.Net": { - "type": "Transitive", - "resolved": "2.2.1", - "contentHash": "tI5+/OQo0kciLqWrViRjpOH+IL3FjexYnoWZajiGV41g/EM9CGbWsxsPzBDmpoxNkrV9uox/EtIhCIi9chBSFw==", - "dependencies": { - "CommunityToolkit.HighPerformance": "8.4.0" - } - }, - "CommunityToolkit.HighPerformance": { - "type": "Transitive", - "resolved": "8.4.0", - "contentHash": "flxspiBs0G/0GMp7IK2J2ijV9bTG6hEwFc/z6ekHqB6nwRJ4Ry2yLdx+TkbCUYFCl4XhABkAwomeKbT6zM2Zlg==" - }, "FlatSharp.Compiler": { "type": "Transitive", "resolved": "7.9.0", @@ -468,11 +461,6 @@ "Microsoft.Extensions.Primitives": "9.0.3" } }, - "Microsoft.Extensions.ObjectPool": { - "type": "Transitive", - "resolved": "10.0.0", - "contentHash": "bpeCq0IYmVLACyEUMzFIOQX+zZUElG1t+nu1lSxthe7B+1oNYking7b91305+jNB6iwojp9fqTY9O+Nh7ULQxg==" - }, "Microsoft.Extensions.Options": { "type": "Transitive", "resolved": "9.0.3",