From 7130848fe219c7af7b14d38901cc99c765b92449 Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Thu, 28 Jan 2021 13:37:44 +0100 Subject: [PATCH 1/4] 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) From cc17bb9928e05b590c00913b4da970d933304d20 Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Thu, 28 Jan 2021 13:56:37 +0100 Subject: [PATCH 2/4] Small fix for multi-options and effective file lists. --- Penumbra/Mods/ModManager.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Penumbra/Mods/ModManager.cs b/Penumbra/Mods/ModManager.cs index 9b2013be..8705aef1 100644 --- a/Penumbra/Mods/ModManager.cs +++ b/Penumbra/Mods/ModManager.cs @@ -184,8 +184,12 @@ namespace Penumbra.Mods for(var i = 0; i < group.Options.Count; ++i) { if ((setting & (1 << i)) != 0) + { if (group.Options[i].OptionFiles.TryGetValue(relativeFilePath, out paths)) AddFiles(paths); + } + else if (group.Options[i].OptionFiles.ContainsKey(relativeFilePath)) + doNotAdd = true; } break; } From dbcc050509bc31b5bf0923b5be1a340f6349377a Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Thu, 28 Jan 2021 15:18:30 +0100 Subject: [PATCH 3/4] Some deduplicator bugfixes. --- Penumbra/Models/Deduplicator.cs | 1 + Penumbra/Mods/ModManager.cs | 2 +- Penumbra/Mods/ResourceMod.cs | 3 ++- Penumbra/UI/TabInstalledModPanel.cs | 4 +++- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Penumbra/Models/Deduplicator.cs b/Penumbra/Models/Deduplicator.cs index cfebd60b..2059a976 100644 --- a/Penumbra/Models/Deduplicator.cs +++ b/Penumbra/Models/Deduplicator.cs @@ -99,6 +99,7 @@ namespace Penumbra.Models inOption = true; foreach (var value in values) option.AddFile(relName1, value); + option.OptionFiles.Remove(relName2); } } } diff --git a/Penumbra/Mods/ModManager.cs b/Penumbra/Mods/ModManager.cs index 8705aef1..5a9ba0fb 100644 --- a/Penumbra/Mods/ModManager.cs +++ b/Penumbra/Mods/ModManager.cs @@ -179,7 +179,7 @@ namespace Penumbra.Mods } } } - break; + break; case SelectType.Multi: for(var i = 0; i < group.Options.Count; ++i) { diff --git a/Penumbra/Mods/ResourceMod.cs b/Penumbra/Mods/ResourceMod.cs index a167ee51..3689fe40 100644 --- a/Penumbra/Mods/ResourceMod.cs +++ b/Penumbra/Mods/ResourceMod.cs @@ -22,7 +22,8 @@ namespace Penumbra.Mods PluginLog.LogError( "no basepath has been set on {ResourceModName}", Meta.Name ); return; } - + + ModFiles.Clear(); // we don't care about any _files_ in the root dir, but any folders should be a game folder/file combo foreach( var dir in ModBasePath.EnumerateDirectories() ) { diff --git a/Penumbra/UI/TabInstalledModPanel.cs b/Penumbra/UI/TabInstalledModPanel.cs index 253274ab..da38d5c8 100644 --- a/Penumbra/UI/TabInstalledModPanel.cs +++ b/Penumbra/UI/TabInstalledModPanel.cs @@ -227,7 +227,9 @@ namespace Penumbra.UI if( ImGui.Button( ButtonDeduplicate ) ) { new Deduplicator(Mod.Mod.ModBasePath, Meta).Run(); - _selector.SaveCurrentMod(); + _selector.SaveCurrentMod(); + Mod.Mod.RefreshModFiles(); + _base._plugin.ModManager.CalculateEffectiveFileList(); _base._menu._effectiveTab.RebuildFileList(_base._plugin.Configuration.ShowAdvanced); } if( ImGui.IsItemHovered() ) From 2ac935e39784c55e91b578209b96cd889eb78a28 Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Thu, 28 Jan 2021 16:06:20 +0100 Subject: [PATCH 4/4] Reload JSON should also refresh files. --- Penumbra/UI/TabInstalledSelector.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Penumbra/UI/TabInstalledSelector.cs b/Penumbra/UI/TabInstalledSelector.cs index 34b80a6d..3ea959da 100644 --- a/Penumbra/UI/TabInstalledSelector.cs +++ b/Penumbra/UI/TabInstalledSelector.cs @@ -260,6 +260,8 @@ namespace Penumbra.UI _mod.Mod.Meta = ModMeta.LoadFromFile(metaPath) ?? _mod.Mod.Meta; _base._menu._installedTab._modPanel._details.ResetState(); } + _mod.Mod.RefreshModFiles(); + _base._plugin.ModManager.CalculateEffectiveFileList(); } public string SaveCurrentMod()