From 5b9d07e1bb6152f3c6726c8177b177a96a4c9ab5 Mon Sep 17 00:00:00 2001 From: Anna Date: Wed, 31 Jul 2024 22:04:46 -0400 Subject: [PATCH] feat: allow specifying specific jobs to alternate --- Configuration.cs | 2 ++ Plugin.cs | 14 +++++++++---- PluginUi.cs | 51 +++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 62 insertions(+), 5 deletions(-) diff --git a/Configuration.cs b/Configuration.cs index 71b22a8..fac7d5d 100644 --- a/Configuration.cs +++ b/Configuration.cs @@ -17,7 +17,9 @@ public class Configuration : IPluginConfiguration { public int BarMulBlue = 100; public MeterMode Mode = MeterMode.Mana; public bool Alternate = true; + public List AlternateJobs = []; public bool ManaModeAlternateOnlyManaUsers = true; + public bool AlternateChocobo = true; public float AlternateSeconds = 3.0f; public bool OnlyAlternateInCombat = true; public uint TextColour = 0xEDFFEC; diff --git a/Plugin.cs b/Plugin.cs index f6552d6..8568e52 100644 --- a/Plugin.cs +++ b/Plugin.cs @@ -74,7 +74,7 @@ public class Plugin : IDalamudPlugin { [Signature("E8 ?? ?? ?? ?? E9 ?? ?? ?? ?? FE C2")] internal unsafe delegate* unmanaged PlaySound; - private readonly byte[] _manaUsers = [ + internal readonly byte[] ManaUsers = [ 6, // cnj 7, // thm 19, // pld @@ -100,6 +100,12 @@ public class Plugin : IDalamudPlugin { this.Ui = new PluginUi(this); this.Commands = new Commands(this); + if (this.Config.ManaModeAlternateOnlyManaUsers) { + this.Config.ManaModeAlternateOnlyManaUsers = false; + this.Config.AlternateJobs.AddRange(this.ManaUsers.Select(cj => (uint) cj)); + this.SaveConfig(); + } + this.AddonLifecycle!.RegisterListener(AddonEvent.PostUpdate, "_PartyList", this.UpdateList); this.ContextMenu!.OnMenuOpened += this.MenuOpened; @@ -630,7 +636,7 @@ public class Plugin : IDalamudPlugin { var hasTimer = chocoboTimer != null && chocoboTimer->IsVisible(); var hasTimerIcon = chocoboTimerIcon != null && chocoboTimerIcon->IsVisible(); - if (this.Config.Alternate && (!this.Config.OnlyAlternateInCombat || inCombat) && !this._showDps) { + if (this.Config.Alternate && this.Config.AlternateChocobo && (!this.Config.OnlyAlternateInCombat || inCombat) && !this._showDps) { this.ResetMember(list, info, false, false); } else { if (hasTimer) { @@ -654,8 +660,8 @@ public class Plugin : IDalamudPlugin { } if (this.Config.Alternate && (!this.Config.OnlyAlternateInCombat || inCombat) && !this._showDps && info.ClassJob is { } classJob) { - var isCaster = Array.IndexOf(this._manaUsers, classJob) != -1; - if (!this.Config.ManaModeAlternateOnlyManaUsers || isCaster) { + var shouldAlternate = this.Config.AlternateJobs.Contains(classJob); + if (shouldAlternate) { this.ResetMember(list, info, false, false); return; } diff --git a/PluginUi.cs b/PluginUi.cs index e40a205..1e8aa5f 100644 --- a/PluginUi.cs +++ b/PluginUi.cs @@ -3,6 +3,7 @@ using System.Text; using Dalamud.Interface.Utility; using FFXIVClientStructs.FFXIV.Client.UI; using ImGuiNET; +using Lumina.Excel.GeneratedSheets; namespace PartyDamage; @@ -10,9 +11,16 @@ public class PluginUi : IDisposable { private Plugin Plugin { get; } internal bool Visible; + private List Jobs { get; } + public PluginUi(Plugin plugin) { this.Plugin = plugin; + this.Jobs = [.. this.Plugin.DataManager.GetExcelSheet()! + .Where(cj => cj.RowId != 0 && !string.IsNullOrWhiteSpace(cj.Name)) + .OrderBy(cj => cj.Role) + .ThenBy(cj => cj.RowId)]; + this.Plugin.Interface.UiBuilder.Draw += this.Draw; } @@ -119,7 +127,48 @@ public class PluginUi : IDisposable { using (ImGuiHelper.DisabledUnless(this.Plugin.Config is { Alternate: true, Mode: MeterMode.Mana })) { anyChanged |= ImGui.Checkbox("Only alternate when in combat", ref this.Plugin.Config.OnlyAlternateInCombat); - anyChanged |= ImGui.Checkbox("Only alternate on jobs that use mana", ref this.Plugin.Config.ManaModeAlternateOnlyManaUsers); + if (ImGui.TreeNodeEx("Jobs to alternate")) { + using var treePop = new OnDispose(ImGui.TreePop); + + if (ImGui.Button("All")) { + anyChanged = true; + this.Plugin.Config.AlternateJobs.Clear(); + this.Plugin.Config.AlternateChocobo = true; + this.Plugin.Config.AlternateJobs.AddRange(this.Jobs.Select(cj => cj.RowId)); + } + + ImGui.SameLine(); + + if (ImGui.Button("None")) { + this.Plugin.Config.AlternateJobs.Clear(); + this.Plugin.Config.AlternateChocobo = false; + anyChanged = true; + } + + ImGui.SameLine(); + + if (ImGui.Button("Mana users")) { + this.Plugin.Config.AlternateJobs.Clear(); + this.Plugin.Config.AlternateChocobo = false; + this.Plugin.Config.AlternateJobs.AddRange(this.Plugin.ManaUsers.Select(cj => (uint) cj)); + anyChanged = true; + } + + foreach (var job in this.Jobs) { + var alternate = this.Plugin.Config.AlternateJobs.Contains(job.RowId); + if (ImGui.Checkbox(job.Name, ref alternate)) { + anyChanged = true; + + if (alternate && !this.Plugin.Config.AlternateJobs.Contains(job.RowId)) { + this.Plugin.Config.AlternateJobs.Add(job.RowId); + } else { + this.Plugin.Config.AlternateJobs.Remove(job.RowId); + } + } + } + } + + anyChanged |= ImGui.Checkbox("Chocobo", ref this.Plugin.Config.AlternateChocobo); } ImGui.Spacing();