From 7130848fe219c7af7b14d38901cc99c765b92449 Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Thu, 28 Jan 2021 13:37:44 +0100 Subject: [PATCH] Rewrote the Redraw function according to Aers' comment. --- Penumbra/Game/RefreshActors.cs | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/Penumbra/Game/RefreshActors.cs b/Penumbra/Game/RefreshActors.cs index c5da4c47..16a8f934 100644 --- a/Penumbra/Game/RefreshActors.cs +++ b/Penumbra/Game/RefreshActors.cs @@ -7,40 +7,32 @@ namespace Penumbra { public static class RefreshActors { - private const int ObjectKindOffset = 0x008C; - private const int RenderModeOffset = 0x0104; - private const int RenderTaskDelay = 75; - - private enum RenderMode : int - { - Draw = 0, - Unload = 2 - } + private const int RenderModeOffset = 0x0104; + private const int RenderTaskPlayerDelay = 75; + private const int RenderTaskOtherDelay = 25; + private const int ModelInvisibilityFlag = 0b10; private static async void Redraw(Actor actor) { var ptr = actor.Address; - var objectKindPtr = ptr + ObjectKindOffset; var renderModePtr = ptr + RenderModeOffset; + var renderStatus = Marshal.ReadInt32(renderModePtr); - async void DrawObject() + async void DrawObject(int delay) { - Marshal.WriteInt32(renderModePtr, (int) RenderMode.Unload); - await Task.Delay(RenderTaskDelay); - Marshal.WriteInt32(renderModePtr, (int) RenderMode.Draw); + Marshal.WriteInt32(renderModePtr, renderStatus | ModelInvisibilityFlag); + await Task.Delay(delay); + Marshal.WriteInt32(renderModePtr, renderStatus & ~ModelInvisibilityFlag); } if (actor.ObjectKind == Dalamud.Game.ClientState.Actors.ObjectKind.Player) { - Marshal.WriteByte(objectKindPtr, (byte) Dalamud.Game.ClientState.Actors.ObjectKind.BattleNpc); - DrawObject(); - await Task.Delay(RenderTaskDelay); - Marshal.WriteByte(objectKindPtr, (byte) Dalamud.Game.ClientState.Actors.ObjectKind.Player); - Marshal.WriteInt32(renderModePtr, (int) RenderMode.Draw); + DrawObject(RenderTaskPlayerDelay); + await Task.Delay(RenderTaskPlayerDelay); } else - DrawObject(); - await Task.Delay(RenderTaskDelay); + DrawObject(RenderTaskOtherDelay); + } public static void RedrawSpecific(ActorTable actors, string name)