feat: allow specifying specific jobs to alternate

This commit is contained in:
Anna 2024-07-31 22:04:46 -04:00
parent 07b62ba03b
commit 5b9d07e1bb
Signed by: anna
GPG Key ID: D0943384CD9F87D1
3 changed files with 62 additions and 5 deletions

View File

@ -17,7 +17,9 @@ public class Configuration : IPluginConfiguration {
public int BarMulBlue = 100;
public MeterMode Mode = MeterMode.Mana;
public bool Alternate = true;
public List<uint> AlternateJobs = [];
public bool ManaModeAlternateOnlyManaUsers = true;
public bool AlternateChocobo = true;
public float AlternateSeconds = 3.0f;
public bool OnlyAlternateInCombat = true;
public uint TextColour = 0xEDFFEC;

View File

@ -74,7 +74,7 @@ public class Plugin : IDalamudPlugin {
[Signature("E8 ?? ?? ?? ?? E9 ?? ?? ?? ?? FE C2")]
internal unsafe delegate* unmanaged<byte*, byte, void> 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;
}

View File

@ -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<ClassJob> Jobs { get; }
public PluginUi(Plugin plugin) {
this.Plugin = plugin;
this.Jobs = [.. this.Plugin.DataManager.GetExcelSheet<ClassJob>()!
.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();