Merge branch 'deduplicate' of https://github.com/Ottermandias/Penumbra into deduplicate

This commit is contained in:
goat 2021-01-28 17:52:49 +01:00
commit d6266b7f02
6 changed files with 26 additions and 24 deletions

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 RenderTaskDelay = 75; private const int RenderTaskPlayerDelay = 75;
private const int RenderTaskOtherDelay = 25;
private enum RenderMode : int private const int ModelInvisibilityFlag = 0b10;
{
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)

View file

@ -99,6 +99,7 @@ namespace Penumbra.Models
inOption = true; inOption = true;
foreach (var value in values) foreach (var value in values)
option.AddFile(relName1, value); option.AddFile(relName1, value);
option.OptionFiles.Remove(relName2);
} }
} }
} }

View file

@ -184,9 +184,13 @@ namespace Penumbra.Mods
for(var i = 0; i < group.Options.Count; ++i) for(var i = 0; i < group.Options.Count; ++i)
{ {
if ((setting & (1 << i)) != 0) if ((setting & (1 << i)) != 0)
{
if (group.Options[i].OptionFiles.TryGetValue(relativeFilePath, out paths)) if (group.Options[i].OptionFiles.TryGetValue(relativeFilePath, out paths))
AddFiles(paths); AddFiles(paths);
} }
else if (group.Options[i].OptionFiles.ContainsKey(relativeFilePath))
doNotAdd = true;
}
break; break;
} }
} }

View file

@ -23,6 +23,7 @@ namespace Penumbra.Mods
return; return;
} }
ModFiles.Clear();
// we don't care about any _files_ in the root dir, but any folders should be a game folder/file combo // 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() ) foreach( var dir in ModBasePath.EnumerateDirectories() )
{ {

View file

@ -228,6 +228,8 @@ namespace Penumbra.UI
{ {
new Deduplicator(Mod.Mod.ModBasePath, Meta).Run(); 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); _base._menu._effectiveTab.RebuildFileList(_base._plugin.Configuration.ShowAdvanced);
} }
if( ImGui.IsItemHovered() ) if( ImGui.IsItemHovered() )

View file

@ -260,6 +260,8 @@ namespace Penumbra.UI
_mod.Mod.Meta = ModMeta.LoadFromFile(metaPath) ?? _mod.Mod.Meta; _mod.Mod.Meta = ModMeta.LoadFromFile(metaPath) ?? _mod.Mod.Meta;
_base._menu._installedTab._modPanel._details.ResetState(); _base._menu._installedTab._modPanel._details.ResetState();
} }
_mod.Mod.RefreshModFiles();
_base._plugin.ModManager.CalculateEffectiveFileList();
} }
public string SaveCurrentMod() public string SaveCurrentMod()