Rewrote the Redraw function according to Aers' comment.

This commit is contained in:
Ottermandias 2021-01-28 13:37:44 +01:00
parent bea196e4b6
commit 7130848fe2

View file

@ -7,40 +7,32 @@ namespace Penumbra
{ {
public static class RefreshActors public static class RefreshActors
{ {
private const int ObjectKindOffset = 0x008C; private const int RenderModeOffset = 0x0104;
private const int RenderModeOffset = 0x0104; private const int RenderTaskPlayerDelay = 75;
private const int RenderTaskDelay = 75; private const int RenderTaskOtherDelay = 25;
private const int ModelInvisibilityFlag = 0b10;
private enum RenderMode : int
{
Draw = 0,
Unload = 2
}
private static async void Redraw(Actor actor) private static async void Redraw(Actor actor)
{ {
var ptr = actor.Address; var ptr = actor.Address;
var objectKindPtr = ptr + ObjectKindOffset;
var renderModePtr = ptr + RenderModeOffset; var renderModePtr = ptr + RenderModeOffset;
var renderStatus = Marshal.ReadInt32(renderModePtr);
async void DrawObject() async void DrawObject(int delay)
{ {
Marshal.WriteInt32(renderModePtr, (int) RenderMode.Unload); Marshal.WriteInt32(renderModePtr, renderStatus | ModelInvisibilityFlag);
await Task.Delay(RenderTaskDelay); await Task.Delay(delay);
Marshal.WriteInt32(renderModePtr, (int) RenderMode.Draw); Marshal.WriteInt32(renderModePtr, renderStatus & ~ModelInvisibilityFlag);
} }
if (actor.ObjectKind == Dalamud.Game.ClientState.Actors.ObjectKind.Player) if (actor.ObjectKind == Dalamud.Game.ClientState.Actors.ObjectKind.Player)
{ {
Marshal.WriteByte(objectKindPtr, (byte) Dalamud.Game.ClientState.Actors.ObjectKind.BattleNpc); DrawObject(RenderTaskPlayerDelay);
DrawObject(); await Task.Delay(RenderTaskPlayerDelay);
await Task.Delay(RenderTaskDelay);
Marshal.WriteByte(objectKindPtr, (byte) Dalamud.Game.ClientState.Actors.ObjectKind.Player);
Marshal.WriteInt32(renderModePtr, (int) RenderMode.Draw);
} }
else else
DrawObject(); DrawObject(RenderTaskOtherDelay);
await Task.Delay(RenderTaskDelay);
} }
public static void RedrawSpecific(ActorTable actors, string name) public static void RedrawSpecific(ActorTable actors, string name)