From 47ccbfa4db5a85ee99d392a37c0dc1da53878fa1 Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Mon, 5 Jul 2021 21:20:31 +0200 Subject: [PATCH] Another try to fix reloading getting stuck. --- Penumbra/Interop/ActorRefresher.cs | 36 +++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/Penumbra/Interop/ActorRefresher.cs b/Penumbra/Interop/ActorRefresher.cs index 41fa5982..94c09563 100644 --- a/Penumbra/Interop/ActorRefresher.cs +++ b/Penumbra/Interop/ActorRefresher.cs @@ -21,12 +21,17 @@ namespace Penumbra.Interop public class ActorRefresher : IDisposable { - private const int RenderModeOffset = 0x0104; - private const int ModelInvisibilityFlag = 0b10; - private const int ModelIsLoadingFlag = 0x800; - private const int SomeNpcRenderFlag = 0x900; - private const int UnloadAllRedrawDelay = 250; - private const int NpcActorId = -536870912; + [Flags] + private enum LoadingFlags : int + { + Invisibility = 0x00_02, + IsLoading = 0x08_00, + SomeNpcFlag = 0x01_00, + } + + private const int RenderModeOffset = 0x0104; + private const int UnloadAllRedrawDelay = 250; + private const int NpcActorId = -536870912; private readonly DalamudPluginInterface _pi; private readonly ModManager _mods; @@ -63,7 +68,7 @@ namespace Penumbra.Interop { if( renderPtr != IntPtr.Zero ) { - *( int* )renderPtr |= ModelInvisibilityFlag; + *( LoadingFlags* )renderPtr |= LoadingFlags.Invisibility; } } @@ -71,8 +76,8 @@ namespace Penumbra.Interop { if( renderPtr != IntPtr.Zero ) { - var loadingFlags = *( int* )renderPtr; - return loadingFlags != 0 && loadingFlags != SomeNpcRenderFlag; + var loadingFlags = *( LoadingFlags* )renderPtr; + return loadingFlags != 0 && !loadingFlags.HasFlag( LoadingFlags.SomeNpcFlag ); } return false; @@ -82,7 +87,7 @@ namespace Penumbra.Interop { if( renderPtr != IntPtr.Zero ) { - *( int* )renderPtr &= ~ModelInvisibilityFlag; + *( LoadingFlags* )renderPtr &= ~LoadingFlags.Invisibility; } } @@ -275,6 +280,7 @@ namespace Penumbra.Interop public void RedrawAll( Redraw settings = Redraw.WithSettings ) { + Clear(); foreach( var actor in _pi.ClientState.Actors ) { RedrawActor( actor, settings ); @@ -283,6 +289,7 @@ namespace Penumbra.Interop private void UnloadAll() { + Clear(); foreach( var a in _pi.ClientState.Actors ) { WriteInvisible( a.Address + RenderModeOffset ); @@ -291,6 +298,7 @@ namespace Penumbra.Interop private void RedrawAllWithoutSettings() { + Clear(); foreach( var a in _pi.ClientState.Actors ) { WriteVisible( a.Address + RenderModeOffset ); @@ -299,6 +307,7 @@ namespace Penumbra.Interop public async void UnloadAtOnceRedrawWithSettings() { + Clear(); UnloadAll(); await Task.Delay( UnloadAllRedrawDelay ); RedrawAll( Redraw.RedrawWithSettings ); @@ -306,11 +315,18 @@ namespace Penumbra.Interop public async void UnloadAtOnceRedrawWithoutSettings() { + Clear(); UnloadAll(); await Task.Delay( UnloadAllRedrawDelay ); RedrawAllWithoutSettings(); } + public void Clear() + { + RestoreSettings(); + _currentFrame = 0; + } + public void Dispose() { RevertSettings();