mirror of
https://github.com/xivdev/Penumbra.git
synced 2025-12-13 12:14:17 +01:00
Another try to fix reloading getting stuck.
This commit is contained in:
parent
75b141f653
commit
47ccbfa4db
1 changed files with 26 additions and 10 deletions
|
|
@ -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();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue