diff --git a/Penumbra/Game/RefreshActors.cs b/Penumbra/Game/RefreshActors.cs new file mode 100644 index 000000000..16a8f9343 --- /dev/null +++ b/Penumbra/Game/RefreshActors.cs @@ -0,0 +1,54 @@ +using System.Runtime.InteropServices; +using Dalamud.Game.ClientState.Actors; +using Dalamud.Game.ClientState.Actors.Types; +using System.Threading.Tasks; + +namespace Penumbra +{ + public static class RefreshActors + { + 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 renderModePtr = ptr + RenderModeOffset; + var renderStatus = Marshal.ReadInt32(renderModePtr); + + async void DrawObject(int delay) + { + Marshal.WriteInt32(renderModePtr, renderStatus | ModelInvisibilityFlag); + await Task.Delay(delay); + Marshal.WriteInt32(renderModePtr, renderStatus & ~ModelInvisibilityFlag); + } + + if (actor.ObjectKind == Dalamud.Game.ClientState.Actors.ObjectKind.Player) + { + DrawObject(RenderTaskPlayerDelay); + await Task.Delay(RenderTaskPlayerDelay); + } + else + DrawObject(RenderTaskOtherDelay); + + } + + public static void RedrawSpecific(ActorTable actors, string name) + { + if (name?.Length == 0) + RedrawAll(actors); + + foreach (var actor in actors) + if (actor.Name == name) + Redraw(actor); + } + + public static void RedrawAll(ActorTable actors) + { + foreach (var actor in actors) + Redraw(actor); + } + } +} diff --git a/Penumbra/Importer/TexToolsImport.cs b/Penumbra/Importer/TexToolsImport.cs index 9ec04a571..ee6b1fec9 100644 --- a/Penumbra/Importer/TexToolsImport.cs +++ b/Penumbra/Importer/TexToolsImport.cs @@ -58,7 +58,10 @@ public void ImportModPack( FileInfo modPackFile ) case ".ttmp2": ImportV2ModPack( modPackFile ); - return; + return; + + default: + throw new ArgumentException( $"Unrecognized modpack format: {modPackFile.Extension}", nameof(modPackFile) ); } State = ImporterState.Done; @@ -237,19 +240,22 @@ private void AddMeta( DirectoryInfo baseFolder, DirectoryInfo groupFolder,ModGro GroupName = group.GroupName, Options = new List