From e512d32cd1878fc8a6f4c61d35151e40d0b95111 Mon Sep 17 00:00:00 2001 From: Anna Date: Wed, 17 Mar 2021 22:12:51 -0400 Subject: [PATCH] feat: disable HudSwap on load --- HUD Manager/HudSwapMurderer.cs | 94 ++++++++++++++++++++++++++++++++++ HUD Manager/Plugin.cs | 3 ++ 2 files changed, 97 insertions(+) create mode 100755 HUD Manager/HudSwapMurderer.cs diff --git a/HUD Manager/HudSwapMurderer.cs b/HUD Manager/HudSwapMurderer.cs new file mode 100755 index 0000000..4cdcddf --- /dev/null +++ b/HUD Manager/HudSwapMurderer.cs @@ -0,0 +1,94 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using Dalamud.Plugin; + +namespace HUD_Manager { + public class HudSwapMurderer { + private Plugin Plugin { get; } + + public HudSwapMurderer(Plugin plugin) { + this.Plugin = plugin; + + this.Murder(); + Oppress(); + } + + /// + /// Kill any existing HudSwap instance. + /// + private void Murder() { + // get dalamud + var dalamudField = this.Plugin.Interface.GetType().GetField("dalamud", BindingFlags.Instance | BindingFlags.NonPublic); + var dalamud = (Dalamud.Dalamud?) dalamudField?.GetValue(this.Plugin.Interface); + if (dalamud == null) { + PluginLog.LogWarning("Could not kill HudSwap since Dalamud field was null"); + return; + } + + // get the plugin manager + var managerProp = dalamud.GetType().GetProperty("PluginManager", BindingFlags.Instance | BindingFlags.NonPublic); + var manager = managerProp?.GetValue(dalamud); + if (manager == null) { + PluginLog.LogWarning("Could not kill HudSwap since PluginManager property was null"); + return; + } + + // get the method to disable plugins + var disablePluginMethod = manager.GetType().GetMethod("DisablePlugin", BindingFlags.Instance | BindingFlags.Public); + if (disablePluginMethod == null) { + PluginLog.LogWarning("Could not kill HudSwap since DisablePlugin method was null"); + return; + } + + // get the list of plugins + var pluginsField = manager.GetType().GetField("Plugins", BindingFlags.Instance | BindingFlags.Public); + var plugins = (List<(IDalamudPlugin plugin, PluginDefinition def, DalamudPluginInterface PluginInterface, bool IsRaw)>?) pluginsField?.GetValue(manager); + if (plugins == null) { + PluginLog.LogWarning("Could not kill HudSwap since Plugins field was null"); + return; + } + + var hudSwapDefs = plugins + .Select(info => info.def) + .Where(def => def.InternalName == "HudSwap") + .ToArray(); + + foreach (var def in hudSwapDefs) { + disablePluginMethod.Invoke(manager, new object[] {def}); + } + } + + /// + /// Prevent HudSwap from ever rising again. + /// + private static void Oppress() { + var hudSwapInstallPath = Path.Combine(new[] { + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "XIVLauncher", + "installedPlugins", + "HudSwap", + }); + + if (!Directory.Exists(hudSwapInstallPath)) { + return; + } + + foreach (var version in Directory.EnumerateDirectories(hudSwapInstallPath)) { + var disabledPath = Path.Combine(new[] { + hudSwapInstallPath, + version, + ".disabled", + }); + + try { + File.Create(disabledPath).Dispose(); + } catch (IOException ex) { + PluginLog.LogWarning($"Failed to oppress HudSwap {version}:\n{ex}"); + } + } + } + } +} diff --git a/HUD Manager/Plugin.cs b/HUD Manager/Plugin.cs index 51ffd72..d774920 100644 --- a/HUD Manager/Plugin.cs +++ b/HUD Manager/Plugin.cs @@ -25,6 +25,9 @@ namespace HUD_Manager { public void Initialize(DalamudPluginInterface pluginInterface) { this.Interface = pluginInterface; + // it's time to do a murder + _ = new HudSwapMurderer(this); + this.Config = Migrator.LoadConfig(this); this.Config.Initialize(this.Interface); this.Config.Save();