f37369cdda
Co-authored-by: Cursor <cursoragent@cursor.com>
345 lines
12 KiB
C#
345 lines
12 KiB
C#
using Dalamud.Game.ClientState.JobGauge.Types;
|
|
using Dalamud.Game.ClientState.Objects.SubKinds;
|
|
using HSUI.Config;
|
|
using HSUI.Config.Attributes;
|
|
using HSUI.Helpers;
|
|
using HSUI.Interface.Bars;
|
|
using HSUI.Interface.GeneralElements;
|
|
using Newtonsoft.Json;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Numerics;
|
|
using Dalamud.Game.ClientState.Statuses;
|
|
|
|
namespace HSUI.Interface.Jobs
|
|
{
|
|
public class DarkKnightHud : JobHud
|
|
{
|
|
private new DarkKnightConfig Config => (DarkKnightConfig)_config;
|
|
|
|
public DarkKnightHud(DarkKnightConfig config, string? displayName = null) : base(config, displayName)
|
|
{
|
|
}
|
|
|
|
protected override (List<Vector2>, List<Vector2>) ChildrenPositionsAndSizes()
|
|
{
|
|
List<Vector2> positions = new();
|
|
List<Vector2> sizes = new();
|
|
|
|
if (Config.ManaBar.Enabled)
|
|
{
|
|
positions.Add(Config.Position + Config.ManaBar.Position);
|
|
sizes.Add(Config.ManaBar.Size);
|
|
}
|
|
|
|
if (Config.BloodGauge.Enabled)
|
|
{
|
|
positions.Add(Config.Position + Config.BloodGauge.Position);
|
|
sizes.Add(Config.BloodGauge.Size);
|
|
}
|
|
|
|
if (Config.DarksideBar.Enabled)
|
|
{
|
|
positions.Add(Config.Position + Config.DarksideBar.Position);
|
|
sizes.Add(Config.DarksideBar.Size);
|
|
}
|
|
|
|
if (Config.BloodWeaponBar.Enabled)
|
|
{
|
|
positions.Add(Config.Position + Config.BloodWeaponBar.Position);
|
|
sizes.Add(Config.BloodWeaponBar.Size);
|
|
}
|
|
|
|
if (Config.DeliriumBar.Enabled)
|
|
{
|
|
positions.Add(Config.Position + Config.DeliriumBar.Position);
|
|
sizes.Add(Config.DeliriumBar.Size);
|
|
}
|
|
|
|
if (Config.LivingShadowBar.Enabled)
|
|
{
|
|
positions.Add(Config.Position + Config.LivingShadowBar.Position);
|
|
sizes.Add(Config.LivingShadowBar.Size);
|
|
}
|
|
|
|
return (positions, sizes);
|
|
}
|
|
|
|
public override void DrawJobHud(Vector2 origin, IPlayerCharacter player)
|
|
{
|
|
Vector2 pos = origin + Config.Position;
|
|
|
|
if (Config.ManaBar.Enabled)
|
|
{
|
|
DrawManaBar(pos, player);
|
|
}
|
|
|
|
if (Config.BloodGauge.Enabled)
|
|
{
|
|
DrawBloodGauge(pos, player);
|
|
}
|
|
|
|
if (Config.DarksideBar.Enabled)
|
|
{
|
|
DrawDarkside(pos, player);
|
|
}
|
|
|
|
if (Config.BloodWeaponBar.Enabled)
|
|
{
|
|
DrawBloodWeaponBar(pos, player);
|
|
}
|
|
|
|
if (Config.DeliriumBar.Enabled)
|
|
{
|
|
DrawDeliriumBar(pos, player);
|
|
}
|
|
|
|
if (Config.LivingShadowBar.Enabled)
|
|
{
|
|
DrawLivingShadowBar(pos, player);
|
|
}
|
|
}
|
|
|
|
private unsafe void DrawManaBar(Vector2 origin, IPlayerCharacter player)
|
|
{
|
|
DRKGauge gauge = Plugin.JobGauges.Get<DRKGauge>();
|
|
|
|
if (Config.ManaBar.HideWhenInactive && !gauge.HasDarkArts && player.CurrentMp == player.MaxMp)
|
|
{
|
|
return;
|
|
}
|
|
|
|
Config.ManaBar.UsePartialFillColor = !gauge.HasDarkArts;
|
|
|
|
Config.ManaBar.Label.SetValue(player.CurrentMp);
|
|
|
|
// hardcoded 9k as maxMP so the chunks are each 3k since that's what a DRK wants to see
|
|
BarHud[] bars = BarUtilities.GetChunkedProgressBars(
|
|
Config.ManaBar,
|
|
gauge.HasDarkArts ? 1 : 3,
|
|
player.CurrentMp,
|
|
Config.ManaBar.ShowFullMana ? player.MaxMp : 9000,
|
|
0f,
|
|
player,
|
|
null,
|
|
gauge.HasDarkArts ? Config.ManaBar.DarkArtsColor : Config.ManaBar.FillColor
|
|
);
|
|
|
|
foreach (BarHud bar in bars)
|
|
{
|
|
AddDrawActions(bar.GetDrawActions(origin, Config.ManaBar.StrataLevel));
|
|
}
|
|
}
|
|
|
|
private void DrawDarkside(Vector2 origin, IPlayerCharacter player)
|
|
{
|
|
DRKGauge gauge = Plugin.JobGauges.Get<DRKGauge>();
|
|
if (Config.DarksideBar.HideWhenInactive && gauge.DarksideTimeRemaining == 0)
|
|
{
|
|
return;
|
|
};
|
|
|
|
float timer = Math.Abs(gauge.DarksideTimeRemaining) / 1000;
|
|
|
|
Config.DarksideBar.Label.SetValue(timer);
|
|
|
|
BarHud bar = BarUtilities.GetProgressBar(Config.DarksideBar, timer, 60, 0, player);
|
|
AddDrawActions(bar.GetDrawActions(origin, Config.DarksideBar.StrataLevel));
|
|
}
|
|
|
|
private void DrawBloodGauge(Vector2 origin, IPlayerCharacter player)
|
|
{
|
|
DRKGauge gauge = Plugin.JobGauges.Get<DRKGauge>();
|
|
if (Config.BloodGauge.HideWhenInactive && gauge.Blood <= 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
Config.BloodGauge.Label.SetValue(gauge.Blood);
|
|
|
|
BarHud[] bars = BarUtilities.GetChunkedProgressBars(Config.BloodGauge, 2, gauge.Blood, 100, 0, player);
|
|
foreach (BarHud bar in bars)
|
|
{
|
|
AddDrawActions(bar.GetDrawActions(origin, Config.BloodGauge.StrataLevel));
|
|
}
|
|
}
|
|
|
|
private void DrawBloodWeaponBar(Vector2 origin, IPlayerCharacter player)
|
|
{
|
|
IStatus? bloodWeaponBuff = Utils.StatusListForBattleChara(player).FirstOrDefault(o => o.StatusId is 742);
|
|
float duration = bloodWeaponBuff?.RemainingTime ?? 0f;
|
|
int stacks = bloodWeaponBuff?.Param ?? 0;
|
|
|
|
if (Config.BloodWeaponBar.HideWhenInactive && duration <= 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var chunks = new Tuple<PluginConfigColor, float, LabelConfig?>[3];
|
|
|
|
for (int i = 0; i < 3; i++)
|
|
{
|
|
chunks[i] = new(Config.BloodWeaponBar.FillColor, i < stacks ? 1 : 0, i == 1 ? Config.BloodWeaponBar.Label : null);
|
|
}
|
|
|
|
if(Config.BloodWeaponBar.FillDirection is BarDirection.Left or BarDirection.Up)
|
|
{
|
|
chunks = chunks.Reverse().ToArray();
|
|
}
|
|
|
|
Config.BloodWeaponBar.Label.SetValue(duration);
|
|
|
|
BarHud[] bars = BarUtilities.GetChunkedBars(Config.BloodWeaponBar, chunks, player);
|
|
foreach (BarHud bar in bars)
|
|
{
|
|
AddDrawActions(bar.GetDrawActions(origin, Config.BloodWeaponBar.StrataLevel));
|
|
}
|
|
}
|
|
|
|
private void DrawDeliriumBar(Vector2 origin, IPlayerCharacter player)
|
|
{
|
|
IStatus? deliriumBuff = Utils.StatusListForBattleChara(player).FirstOrDefault(o => o.StatusId is 1972);
|
|
float deliriumDuration = Math.Max(0f, deliriumBuff?.RemainingTime ?? 0f);
|
|
int stacks = deliriumBuff?.Param ?? 0;
|
|
|
|
if (Config.DeliriumBar.HideWhenInactive && deliriumDuration <= 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var chunks = new Tuple<PluginConfigColor, float, LabelConfig?>[3];
|
|
for (int i = 0; i < 3; i++)
|
|
{
|
|
chunks[i] = new(Config.DeliriumBar.FillColor, i < stacks ? 1 : 0, i == 1 ? Config.DeliriumBar.Label : null);
|
|
}
|
|
|
|
if(Config.DeliriumBar.FillDirection is BarDirection.Left or BarDirection.Up)
|
|
{
|
|
chunks = chunks.Reverse().ToArray();
|
|
}
|
|
|
|
Config.DeliriumBar.Label.SetValue(deliriumDuration);
|
|
|
|
BarHud[] bars = BarUtilities.GetChunkedBars(Config.DeliriumBar, chunks, player);
|
|
foreach (BarHud bar in bars)
|
|
{
|
|
AddDrawActions(bar.GetDrawActions(origin, Config.DeliriumBar.StrataLevel));
|
|
}
|
|
}
|
|
|
|
private unsafe void DrawLivingShadowBar(Vector2 origin, IPlayerCharacter player)
|
|
{
|
|
DRKGauge gauge = Plugin.JobGauges.Get<DRKGauge>();
|
|
|
|
if (Config.LivingShadowBar.HideWhenInactive && gauge.ShadowTimeRemaining <= 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
float timer = Math.Abs(gauge.ShadowTimeRemaining) / 1000;
|
|
Config.LivingShadowBar.Label.SetValue(timer);
|
|
|
|
BarHud bar = BarUtilities.GetProgressBar(Config.LivingShadowBar, timer, 20, 0, player);
|
|
AddDrawActions(bar.GetDrawActions(origin, Config.LivingShadowBar.StrataLevel));
|
|
}
|
|
}
|
|
|
|
[Section("Job Specific Bars")]
|
|
[SubSection("Tank", 0)]
|
|
[SubSection("Dark Knight", 1)]
|
|
public class DarkKnightConfig : JobConfig
|
|
{
|
|
[JsonIgnore] public override uint JobId => JobIDs.DRK;
|
|
public new static DarkKnightConfig DefaultConfig()
|
|
{
|
|
var config = new DarkKnightConfig();
|
|
|
|
config.ManaBar.Label.FontID = FontsConfig.DefaultMediumFontKey;
|
|
config.ManaBar.UsePartialFillColor = true;
|
|
|
|
config.DarksideBar.Label.FontID = FontsConfig.DefaultMediumFontKey;
|
|
config.DarksideBar.ThresholdConfig.Enabled = true;
|
|
|
|
config.BloodGauge.Label.FontID = FontsConfig.DefaultMediumFontKey;
|
|
config.BloodGauge.UsePartialFillColor = true;
|
|
|
|
return config;
|
|
}
|
|
|
|
[NestedConfig("Mana Bar", 30)]
|
|
public DarkKnightManaBarConfig ManaBar = new DarkKnightManaBarConfig(
|
|
new Vector2(0, -61),
|
|
new Vector2(254, 10),
|
|
new PluginConfigColor(new Vector4(0f / 255f, 162f / 255f, 252f / 255f, 100f / 100f))
|
|
);
|
|
|
|
[NestedConfig("Blood Gauge", 35)]
|
|
public ChunkedProgressBarConfig BloodGauge = new ChunkedProgressBarConfig(
|
|
new Vector2(0, -49),
|
|
new Vector2(254, 10),
|
|
new PluginConfigColor(new Vector4(216f / 255f, 0f / 255f, 73f / 255f, 100f / 100f)),
|
|
2,
|
|
new PluginConfigColor(new Vector4(180f / 255f, 180f / 255f, 180f / 255f, 100f / 100f))
|
|
);
|
|
|
|
[NestedConfig("Darkside Bar", 40)]
|
|
public ProgressBarConfig DarksideBar = new ProgressBarConfig(
|
|
new Vector2(0, -73),
|
|
new Vector2(254, 10),
|
|
new PluginConfigColor(new Vector4(209f / 255f, 38f / 255f, 73f / 204f, 100f / 100f)),
|
|
BarDirection.Right,
|
|
new PluginConfigColor(new Vector4(160f / 255f, 0f / 255f, 0f / 255f, 100f / 100f)),
|
|
5
|
|
);
|
|
|
|
[NestedConfig("Blood Weapon Bar", 45)]
|
|
public DarkKnightChunkedBarConfig BloodWeaponBar = new DarkKnightChunkedBarConfig(
|
|
new Vector2(-64, -32),
|
|
new Vector2(126, 20),
|
|
new PluginConfigColor(new Vector4(160f / 255f, 0f / 255f, 0f / 255f, 100f / 100f))
|
|
);
|
|
|
|
[NestedConfig("Delirium Bar", 50)]
|
|
public DarkKnightChunkedBarConfig DeliriumBar = new DarkKnightChunkedBarConfig(
|
|
new Vector2(64, -32),
|
|
new Vector2(126, 20),
|
|
new PluginConfigColor(new Vector4(255f / 255f, 255f / 255f, 255f / 255f, 100f / 100f))
|
|
);
|
|
|
|
[NestedConfig("Living Shadow Bar", 55)]
|
|
public ProgressBarConfig LivingShadowBar = new ProgressBarConfig(
|
|
new Vector2(0, -10),
|
|
new Vector2(254, 20),
|
|
new PluginConfigColor(new Vector4(255f / 255f, 105f / 255f, 205f / 255f, 100f / 100f))
|
|
);
|
|
}
|
|
|
|
[Exportable(false)]
|
|
public class DarkKnightManaBarConfig : ChunkedProgressBarConfig
|
|
{
|
|
[ColorEdit4("Dark Arts Color" + "##MP")]
|
|
[Order(26)]
|
|
public PluginConfigColor DarkArtsColor = new PluginConfigColor(new Vector4(210f / 255f, 33f / 255f, 33f / 255f, 100f / 100f));
|
|
|
|
[Checkbox("Show mana values up to 10k (will break thresholds)", spacing = true)]
|
|
[Order(27)]
|
|
public bool ShowFullMana = false;
|
|
|
|
public DarkKnightManaBarConfig(Vector2 position, Vector2 size, PluginConfigColor fillColor)
|
|
: base(position, size, fillColor)
|
|
{
|
|
}
|
|
}
|
|
|
|
[Exportable(false)]
|
|
[DisableParentSettings("UseChunks", "LabelMode")]
|
|
public class DarkKnightChunkedBarConfig : ChunkedProgressBarConfig
|
|
{
|
|
public DarkKnightChunkedBarConfig(Vector2 position, Vector2 size, PluginConfigColor fillColor)
|
|
: base(position, size, fillColor)
|
|
{
|
|
}
|
|
}
|
|
}
|