@@ -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 < IpcCallerBrio > _logger ;
private readonly DalamudUtilService _dalamudUtilService ;
private readonly ICallGateSubscriber < ( int , int ) > _brioApiVersion ;
private readonly ICallGateSubscriber < bool , bool , bool , Task < IGameObject > > _brioSpawnActorAsync ;
private readonly ICallGateSubscriber < IGameObject , bool > _brioDespawnActor ;
private readonly ICallGateSubscriber < IGameObject , Vector3 ? , Quaternion ? , Vector3 ? , bool , bool > _brioSetModelTransform ;
private readonly ICallGateSubscriber < IGameObject , ( Vector3 ? , Quaternion ? , Vector3 ? ) > _brioGetModelTransform ;
private readonly ICallGateSubscriber < IGameObject , string > _brioGetPoseAsJson ;
private readonly ICallGateSubscriber < IGameObject , string , bool , bool > _brioSetPoseFromJson ;
private readonly ICallGateSubscriber < IGameObject , bool > _brioFreezeActor ;
private readonly ICallGateSubscriber < bool > _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 < IpcCallerBrio > 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 ;
_brio ApiVersion = dalamudPluginInterface . GetIpcSubscriber < ( int , int ) > ( "Brio.ApiVersion" );
_brioS pawnActorAsync = dalamudPluginInterface . GetIpcSubscriber < bool , bool , bool , Task < IGameObject > > ( "Brio.Actor.SpawnExAsync" );
_brioD espawnActor = dalamudPluginInterface. GetIpcSubscriber < IGameObject , bool > ( "Brio.Actor.Despawn" ) ;
_brioSetModelTransform = dalamudPluginInterface . GetIpcSubscriber < IGameObject , Vector3 ? , Quaternion ? , Vector3 ? , bool , bool > ( "Brio.Actor.SetModelTransform" ) ;
_brioG etModelTransform = dalamudPluginInterface. GetIpcSubscriber < IGameObject , ( Vector3 ? , Quaternion ? , Vector3 ? ) > ( "Brio.Actor.GetModelTransform" ) ;
_brioGetPoseAsJson = dalamudPluginInterface . GetIpcSubscriber < IGameObject , string > ( "Brio.Actor.Pose.GetPoseAsJson" ) ;
_brioSetPoseFromJson = dalamudPluginInterface . GetIpcSubscriber < IGameObject , string , bool , bool > ( "Brio.Actor.Pose.LoadFromJson" ) ;
_brioFreezeActor = dalamudPluginInterface . GetIpcSubscriber < IGameObject , bool > ( "Brio.Actor.Freeze" ) ;
_brioFreezePhysics = dalamudPluginInterface . GetIpcSubscriber < bool > ( "Brio.FreezePhysics" ) ;
_apiVersion = new ApiVersion ( dalamudPluginInterface ) ;
_s pawnActor = new SpawnActor ( dalamudPluginInterface ) ;
_d espawnActor = new DespawnActor ( dalamudPluginInterface ) ;
_s etModelTransform = 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 _brioS pawnActorAsync . InvokeFunc ( false , false , true ) . ConfigureAwait ( false ) ;
return await _dalamudUtilService . RunOnFrameworkThread ( ( ) = > _s pawnActor . Invoke( Brio . API . Enums . SpawnFlags . Default , true ) ) .ConfigureAwait ( false ) ;
}
public async Task < bool > 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 ( ( ) = > _brioD espawnActor . InvokeFunc ( gameObject ) ) . ConfigureAwait ( false ) ;
return await _dalamudUtilService . RunOnFrameworkThread ( ( ) = > _d espawnActor . Invoke ( gameObject ) ) . ConfigureAwait ( false ) ;
}
public async Task < bool > 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 ( ( ) = > _brioS etModelTransform . InvokeFunc ( gameObject ,
return await _dalamudUtilService . RunOnFrameworkThread ( ( ) = > _s etModelTransform . 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 ( ( ) = > _brioG etModelTransform . InvokeFunc ( gameObject ) ) . ConfigureAwait ( false ) ;
//_logger.LogDebug("Getting Transform from Actor {actor}", gameObject.Name.TextValue);
var data = await _dalamudUtilService . RunOnFrameworkThread ( ( ) = > _g etModelTransform . 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 ( ( ) = > _brioG etPoseAsJson . InvokeFunc ( gameObject ) ) . ConfigureAwait ( false ) ;
return await _dalamudUtilService . RunOnFrameworkThread ( ( ) = > _g etPoseAsJson . Invoke ( gameObject ) ) . ConfigureAwait ( false ) ;
}
public async Task < bool > 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 ( ( ) = > _brioG etPoseAsJson . InvokeFunc ( gameObject ) ) . ConfigureAwait ( false ) ;
var currentPose = await _dalamudUtilService . RunOnFrameworkThread ( ( ) = > _g etPoseAsJson . Invoke ( gameObject ) ) . ConfigureAwait ( false ) ;
applicablePose [ "ModelDifference" ] = JsonNode . Parse ( JsonNode . Parse ( currentPose ) ! [ "ModelDifference" ] ! . ToJsonString ( ) ) ;
await _dalamudUtilService . RunOnFrameworkThread ( ( ) = >
{
_brioF reezeActor . InvokeFunc ( gameObject ) ;
_brioF reezePhysics . InvokeFunc ( ) ;
_f reezeActor . Invoke ( gameObject ) ;
_f reezePhysics . Invoke ( ) ;
} ) . ConfigureAwait ( false ) ;
return await _dalamudUtilService . RunOnFrameworkThread ( ( ) = > _brioS etPoseFromJson . InvokeFunc ( gameObject , applicablePose . ToJsonString ( ) , false ) ) . ConfigureAwait ( false ) ;
return await _dalamudUtilService . RunOnFrameworkThread ( ( ) = > _s etPoseFromJson . Invoke ( gameObject , applicablePose . ToJsonString ( ) , false ) ) . ConfigureAwait ( false ) ;
}
protected override IpcConnectionState EvaluateState ( )
@@ -139,8 +143,8 @@ public sealed class IpcCallerBrio : IpcServiceBase
try
{
var version = _brioA piVersion . InvokeFunc ( ) ;
return version . Item1 = = 2 & & version . Item2 > = 0
var version = _a piVersion . Invoke ( ) ;
return version . Item1 = = 3 & & version . Item2 > = 0
? IpcConnectionState . Available
: IpcConnectionState . VersionMismatch ;
}