From 7baed8d4301c5af28dd13e9ed9adf1a6dbc0bf1e Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Wed, 28 Sep 2022 23:02:42 +0200 Subject: [PATCH] Add resetting to cutscene actors. --- .../Interop/Resolver/CutsceneCharacters.cs | 43 +++++++++++++++++-- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/Penumbra/Interop/Resolver/CutsceneCharacters.cs b/Penumbra/Interop/Resolver/CutsceneCharacters.cs index e8c1f05e..b055320a 100644 --- a/Penumbra/Interop/Resolver/CutsceneCharacters.cs +++ b/Penumbra/Interop/Resolver/CutsceneCharacters.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; +using Dalamud.Game.ClientState.Conditions; using Dalamud.Hooking; using Dalamud.Utility.Signatures; using FFXIVClientStructs.FFXIV.Client.Game.Object; @@ -22,7 +23,10 @@ public class CutsceneCharacters : IDisposable .Select( i => KeyValuePair.Create( i, this[ i ] ?? Dalamud.Objects[ i ]! ) ); public CutsceneCharacters() - => SignatureHelper.Initialise( this ); + { + SignatureHelper.Initialise( this ); + Dalamud.Conditions.ConditionChange += Reset; + } // Get the related actor to a cutscene actor. // Does not check for valid input index. @@ -48,6 +52,36 @@ public class CutsceneCharacters : IDisposable return -1; } + public void Reset( ConditionFlag flag, bool value ) + { + switch( flag ) + { + case ConditionFlag.BetweenAreas: + case ConditionFlag.BetweenAreas51: + if( !value ) + { + return; + } + + break; + case ConditionFlag.OccupiedInCutSceneEvent: + case ConditionFlag.WatchingCutscene: + case ConditionFlag.WatchingCutscene78: + if( value ) + { + return; + } + + break; + default: return; + } + + for( var i = 0; i < _copiedCharacters.Length; ++i ) + { + _copiedCharacters[ i ] = -1; + } + } + public void Enable() => _copyCharacterHook.Enable(); @@ -55,8 +89,10 @@ public class CutsceneCharacters : IDisposable => _copyCharacterHook.Disable(); public void Dispose() - => _copyCharacterHook.Dispose(); - + { + _copyCharacterHook.Dispose(); + Dalamud.Conditions.ConditionChange -= Reset; + } private unsafe delegate ulong CopyCharacterDelegate( GameObject* target, GameObject* source, uint unk ); @@ -73,6 +109,7 @@ public class CutsceneCharacters : IDisposable ? -1 : source->ObjectIndex; _copiedCharacters[ target->ObjectIndex - CutsceneStartIdx ] = ( short )parent; + Penumbra.Log.Debug( $"Set cutscene character {target->ObjectIndex} to {parent}." ); } } catch