Another try to fix reloading getting stuck.

This commit is contained in:
Ottermandias 2021-07-05 21:20:31 +02:00
parent 75b141f653
commit 47ccbfa4db

View file

@ -21,12 +21,17 @@ namespace Penumbra.Interop
public class ActorRefresher : IDisposable public class ActorRefresher : IDisposable
{ {
private const int RenderModeOffset = 0x0104; [Flags]
private const int ModelInvisibilityFlag = 0b10; private enum LoadingFlags : int
private const int ModelIsLoadingFlag = 0x800; {
private const int SomeNpcRenderFlag = 0x900; Invisibility = 0x00_02,
private const int UnloadAllRedrawDelay = 250; IsLoading = 0x08_00,
private const int NpcActorId = -536870912; SomeNpcFlag = 0x01_00,
}
private const int RenderModeOffset = 0x0104;
private const int UnloadAllRedrawDelay = 250;
private const int NpcActorId = -536870912;
private readonly DalamudPluginInterface _pi; private readonly DalamudPluginInterface _pi;
private readonly ModManager _mods; private readonly ModManager _mods;
@ -63,7 +68,7 @@ namespace Penumbra.Interop
{ {
if( renderPtr != IntPtr.Zero ) if( renderPtr != IntPtr.Zero )
{ {
*( int* )renderPtr |= ModelInvisibilityFlag; *( LoadingFlags* )renderPtr |= LoadingFlags.Invisibility;
} }
} }
@ -71,8 +76,8 @@ namespace Penumbra.Interop
{ {
if( renderPtr != IntPtr.Zero ) if( renderPtr != IntPtr.Zero )
{ {
var loadingFlags = *( int* )renderPtr; var loadingFlags = *( LoadingFlags* )renderPtr;
return loadingFlags != 0 && loadingFlags != SomeNpcRenderFlag; return loadingFlags != 0 && !loadingFlags.HasFlag( LoadingFlags.SomeNpcFlag );
} }
return false; return false;
@ -82,7 +87,7 @@ namespace Penumbra.Interop
{ {
if( renderPtr != IntPtr.Zero ) 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 ) public void RedrawAll( Redraw settings = Redraw.WithSettings )
{ {
Clear();
foreach( var actor in _pi.ClientState.Actors ) foreach( var actor in _pi.ClientState.Actors )
{ {
RedrawActor( actor, settings ); RedrawActor( actor, settings );
@ -283,6 +289,7 @@ namespace Penumbra.Interop
private void UnloadAll() private void UnloadAll()
{ {
Clear();
foreach( var a in _pi.ClientState.Actors ) foreach( var a in _pi.ClientState.Actors )
{ {
WriteInvisible( a.Address + RenderModeOffset ); WriteInvisible( a.Address + RenderModeOffset );
@ -291,6 +298,7 @@ namespace Penumbra.Interop
private void RedrawAllWithoutSettings() private void RedrawAllWithoutSettings()
{ {
Clear();
foreach( var a in _pi.ClientState.Actors ) foreach( var a in _pi.ClientState.Actors )
{ {
WriteVisible( a.Address + RenderModeOffset ); WriteVisible( a.Address + RenderModeOffset );
@ -299,6 +307,7 @@ namespace Penumbra.Interop
public async void UnloadAtOnceRedrawWithSettings() public async void UnloadAtOnceRedrawWithSettings()
{ {
Clear();
UnloadAll(); UnloadAll();
await Task.Delay( UnloadAllRedrawDelay ); await Task.Delay( UnloadAllRedrawDelay );
RedrawAll( Redraw.RedrawWithSettings ); RedrawAll( Redraw.RedrawWithSettings );
@ -306,11 +315,18 @@ namespace Penumbra.Interop
public async void UnloadAtOnceRedrawWithoutSettings() public async void UnloadAtOnceRedrawWithoutSettings()
{ {
Clear();
UnloadAll(); UnloadAll();
await Task.Delay( UnloadAllRedrawDelay ); await Task.Delay( UnloadAllRedrawDelay );
RedrawAllWithoutSettings(); RedrawAllWithoutSettings();
} }
public void Clear()
{
RestoreSettings();
_currentFrame = 0;
}
public void Dispose() public void Dispose()
{ {
RevertSettings(); RevertSettings();