f37369cdda
Co-authored-by: Cursor <cursoragent@cursor.com>
314 lines
12 KiB
C#
314 lines
12 KiB
C#
using Dalamud.Game.ClientState.Objects.SubKinds;
|
|
using Dalamud.Game.ClientState.Objects.Types;
|
|
using Dalamud.Game.ClientState.Statuses;
|
|
using HSUI.Config;
|
|
using HSUI.Config.Attributes;
|
|
using HSUI.Helpers;
|
|
using HSUI.Interface.Bars;
|
|
using Newtonsoft.Json;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Numerics;
|
|
|
|
namespace HSUI.Interface.Jobs
|
|
{
|
|
public class BlueMageHud : JobHud
|
|
{
|
|
private new BlueMageConfig Config => (BlueMageConfig)_config;
|
|
|
|
public BlueMageHud(BlueMageConfig config, string? displayName = null) : base(config, displayName)
|
|
{
|
|
}
|
|
protected override (List<Vector2>, List<Vector2>) ChildrenPositionsAndSizes()
|
|
{
|
|
List<Vector2> positions = new List<Vector2>();
|
|
List<Vector2> sizes = new List<Vector2>();
|
|
|
|
if (Config.BleedBar.Enabled)
|
|
{
|
|
positions.Add(Config.Position + Config.BleedBar.Position);
|
|
sizes.Add(Config.BleedBar.Size);
|
|
}
|
|
|
|
if (Config.WindburnBar.Enabled)
|
|
{
|
|
positions.Add(Config.Position + Config.WindburnBar.Position);
|
|
sizes.Add(Config.WindburnBar.Size);
|
|
}
|
|
|
|
if (Config.SurpanakhaBar.Enabled)
|
|
{
|
|
positions.Add(Config.Position + Config.SurpanakhaBar.Position);
|
|
sizes.Add(Config.SurpanakhaBar.Size);
|
|
}
|
|
|
|
if (Config.OffGuardBar.Enabled)
|
|
{
|
|
positions.Add(Config.Position + Config.OffGuardBar.Position);
|
|
sizes.Add(Config.OffGuardBar.Size);
|
|
}
|
|
|
|
return (positions, sizes);
|
|
}
|
|
|
|
public override void DrawJobHud(Vector2 origin, IPlayerCharacter player)
|
|
{
|
|
Vector2 pos = origin + Config.Position;
|
|
if (Config.BleedBar.Enabled)
|
|
{
|
|
DrawBleedBar(pos, player);
|
|
}
|
|
|
|
if (Config.WindburnBar.Enabled)
|
|
{
|
|
DrawWindburnBar(pos, player);
|
|
}
|
|
|
|
if (Config.SurpanakhaBar.Enabled)
|
|
{
|
|
DrawSurpanakhaBar(pos, player);
|
|
}
|
|
|
|
if (Config.OffGuardBar.Enabled)
|
|
{
|
|
DrawOffGuardBar(pos, player);
|
|
}
|
|
|
|
if (Config.MoonFluteBar.Enabled)
|
|
{
|
|
DrawMoonFluteBar(pos, player);
|
|
}
|
|
|
|
if (Config.SpellAmpBar.Enabled)
|
|
{
|
|
DrawSpellAmpBar(pos, player);
|
|
}
|
|
|
|
if (Config.TingleBar.Enabled)
|
|
{
|
|
DrawTingleBar(pos, player);
|
|
}
|
|
}
|
|
|
|
private static List<uint> BleedID = new List<uint> { 1714 };
|
|
private static List<float> BleedDurations = new List<float> { 30, 60 };
|
|
|
|
protected void DrawBleedBar(Vector2 origin, IPlayerCharacter player)
|
|
{
|
|
var target = Plugin.TargetManager.SoftTarget ?? Plugin.TargetManager.Target;
|
|
BarHud? bar = BarUtilities.GetDoTBar(Config.BleedBar, player, target, BleedID, BleedDurations);
|
|
if (bar != null)
|
|
{
|
|
AddDrawActions(bar.GetDrawActions(origin, Config.BleedBar.StrataLevel));
|
|
}
|
|
}
|
|
|
|
protected void DrawWindburnBar(Vector2 origin, IPlayerCharacter player)
|
|
{
|
|
IGameObject? target = Plugin.TargetManager.SoftTarget ?? Plugin.TargetManager.Target;
|
|
bool dotExists = false;
|
|
|
|
if (target != null && target is IBattleChara targetChara)
|
|
{
|
|
dotExists = Utils.StatusListForBattleChara(targetChara).FirstOrDefault(o => o.SourceId == player.GameObjectId && o.StatusId == 1723) != null;
|
|
}
|
|
|
|
if (dotExists)
|
|
{
|
|
BarHud? bar = BarUtilities.GetDoTBar(Config.WindburnBar, player, target, 1723, 6f);
|
|
if (bar != null)
|
|
{
|
|
AddDrawActions(bar.GetDrawActions(origin, Config.WindburnBar.StrataLevel));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
float featherRainCD = SpellHelper.Instance.GetSpellCooldown(11426);
|
|
float max = 30f;
|
|
float current = max - featherRainCD;
|
|
|
|
if (!Config.WindburnBar.HideWhenInactive || current < max)
|
|
{
|
|
Config.WindburnBar.Label.SetValue(max - current);
|
|
if (current == max)
|
|
{
|
|
Config.WindburnBar.Label.SetText("Ready");
|
|
}
|
|
|
|
BarHud bar = BarUtilities.GetProgressBar(Config.WindburnBar, current, max, 0f, player);
|
|
AddDrawActions(bar.GetDrawActions(origin, Config.WindburnBar.StrataLevel));
|
|
}
|
|
}
|
|
}
|
|
|
|
protected void DrawSurpanakhaBar(Vector2 origin, IPlayerCharacter player)
|
|
{
|
|
float surpanakhaCD = SpellHelper.Instance.GetSpellCooldown(18323);
|
|
float max = 120f;
|
|
float current = max - surpanakhaCD;
|
|
|
|
if (!Config.SurpanakhaBar.HideWhenInactive || current < max)
|
|
{
|
|
Config.SurpanakhaBar.Label.SetValue((max - current) % 30);
|
|
|
|
BarHud[] bars = BarUtilities.GetChunkedProgressBars(Config.SurpanakhaBar, 4, current, max, 0f, player);
|
|
foreach (BarHud bar in bars)
|
|
{
|
|
AddDrawActions(bar.GetDrawActions(origin, Config.SurpanakhaBar.StrataLevel));
|
|
}
|
|
}
|
|
}
|
|
|
|
protected void DrawOffGuardBar(Vector2 origin, IPlayerCharacter player)
|
|
{
|
|
var target = Plugin.TargetManager.SoftTarget ?? Plugin.TargetManager.Target;
|
|
|
|
BarHud? bar = BarUtilities.GetDoTBar(Config.OffGuardBar, player, target, 1717, 15f);
|
|
if (bar != null)
|
|
{
|
|
AddDrawActions(bar.GetDrawActions(origin, Config.OffGuardBar.StrataLevel));
|
|
}
|
|
}
|
|
|
|
protected void DrawMoonFluteBar(Vector2 origin, IPlayerCharacter player)
|
|
{
|
|
IStatus? buff = Utils.StatusListForBattleChara(player).FirstOrDefault(o => o.StatusId is 1718 or 1727 && o.RemainingTime > 0f);
|
|
if (!Config.MoonFluteBar.HideWhenInactive || buff is not null)
|
|
{
|
|
var buffColor = buff is not null ? buff.StatusId switch
|
|
{
|
|
1718 => Config.MoonFluteBar.WaxingCrescentColor,
|
|
1727 => Config.MoonFluteBar.WaningCrescentColor,
|
|
_ => Config.MoonFluteBar.WaxingCrescentColor
|
|
} : Config.MoonFluteBar.WaxingCrescentColor;
|
|
|
|
float buffDuration = buff?.RemainingTime ?? 0f;
|
|
|
|
Config.MoonFluteBar.Label.SetValue(buffDuration);
|
|
|
|
BarHud bar = BarUtilities.GetProgressBar(Config.MoonFluteBar, buffDuration, 15f, 0, player, fillColor: buffColor);
|
|
AddDrawActions(bar.GetDrawActions(origin, Config.MoonFluteBar.StrataLevel));
|
|
}
|
|
}
|
|
|
|
protected void DrawSpellAmpBar(Vector2 origin, IPlayerCharacter player)
|
|
{
|
|
IStatus? buff = Utils.StatusListForBattleChara(player).FirstOrDefault(o => o.StatusId is 2118 or 1716 && o.RemainingTime > 0f);
|
|
if (!Config.SpellAmpBar.HideWhenInactive || buff is not null)
|
|
{
|
|
var buffColor = buff is not null ? buff.StatusId switch
|
|
{
|
|
2118 => Config.SpellAmpBar.BristleColor,
|
|
1716 => Config.SpellAmpBar.WhistleColor,
|
|
_ => Config.SpellAmpBar.BristleColor
|
|
} : Config.SpellAmpBar.BristleColor;
|
|
|
|
float buffDuration = buff?.RemainingTime ?? 0f;
|
|
|
|
Config.SpellAmpBar.Label.SetValue(buffDuration);
|
|
|
|
BarHud bar = BarUtilities.GetProgressBar(Config.SpellAmpBar, buffDuration, 30f, 0, player, fillColor: buffColor);
|
|
AddDrawActions(bar.GetDrawActions(origin, Config.SpellAmpBar.StrataLevel));
|
|
}
|
|
}
|
|
|
|
protected void DrawTingleBar(Vector2 origin, IPlayerCharacter player)
|
|
{
|
|
BarHud? bar = BarUtilities.GetProcBar(Config.TingleBar, player, 2492, 15f);
|
|
if (bar != null)
|
|
{
|
|
AddDrawActions(bar.GetDrawActions(origin, Config.TingleBar.StrataLevel));
|
|
}
|
|
}
|
|
}
|
|
|
|
[Section("Job Specific Bars")]
|
|
[SubSection("Caster", 0)]
|
|
[SubSection("Blue Mage", 1)]
|
|
public class BlueMageConfig : JobConfig
|
|
{
|
|
[JsonIgnore] public override uint JobId => JobIDs.BLU;
|
|
public new static BlueMageConfig DefaultConfig()
|
|
{
|
|
var config = new BlueMageConfig();
|
|
config.UseDefaultPrimaryResourceBar = true;
|
|
|
|
return config;
|
|
}
|
|
[NestedConfig("Bleed Bar", 40)]
|
|
public ProgressBarConfig BleedBar = new ProgressBarConfig(
|
|
new(-64, -55),
|
|
new(126, 14),
|
|
new PluginConfigColor(new Vector4(106f / 255f, 237f / 255f, 241f / 255f, 100f / 100f)),
|
|
BarDirection.Left
|
|
);
|
|
[NestedConfig("Windburn Bar", 45)]
|
|
public ProgressBarConfig WindburnBar = new ProgressBarConfig(
|
|
new(64, -55),
|
|
new(126, 14),
|
|
new PluginConfigColor(new Vector4(50f / 255f, 93f / 255f, 37f / 255f, 100f / 100f))
|
|
);
|
|
[NestedConfig("Surpanakha Bar", 50)]
|
|
public ChunkedProgressBarConfig SurpanakhaBar = new ChunkedProgressBarConfig(
|
|
new(0, -39),
|
|
new(254, 14),
|
|
new PluginConfigColor(new Vector4(202f / 255f, 228f / 255f, 246f / 242f, 100f / 100f))
|
|
|
|
);
|
|
[NestedConfig("Off-Guard Bar", 55)]
|
|
public ProgressBarConfig OffGuardBar = new ProgressBarConfig(
|
|
new(0, -23),
|
|
new(254, 14),
|
|
new PluginConfigColor(new Vector4(202f / 255f, 228f / 255f, 246f / 242f, 100f / 100f))
|
|
);
|
|
|
|
[NestedConfig("Moon Flute Bar", 60)]
|
|
public MoonFluteBarConfig MoonFluteBar = new MoonFluteBarConfig(
|
|
new(0, -7),
|
|
new(84, 14),
|
|
new(new Vector4(128f / 255f, 255f / 255f, 255f / 255f, 100f / 100f))
|
|
);
|
|
[NestedConfig("Spell Amp Bar", 65)]
|
|
public SpellAmpBarConfig SpellAmpBar = new SpellAmpBarConfig(
|
|
new(-86, -7),
|
|
new(82, 14),
|
|
new(new Vector4(128f / 255f, 255f / 255f, 255f / 255f, 100f / 100f))
|
|
);
|
|
[NestedConfig("Tingle Bar", 70)]
|
|
public ProgressBarConfig TingleBar = new ProgressBarConfig(
|
|
new(86, -7),
|
|
new(82, 14),
|
|
new(new Vector4(128f / 255f, 255f / 255f, 255f / 255f, 100f / 100f))
|
|
);
|
|
}
|
|
|
|
[Exportable(false)]
|
|
public class MoonFluteBarConfig : ProgressBarConfig
|
|
{
|
|
[ColorEdit4("Waning Crescent Color")]
|
|
[Order(26)]
|
|
public PluginConfigColor WaxingCrescentColor = new(new Vector4(0f / 255f, 255f / 255f, 0f / 255f, 100f / 100f));
|
|
[ColorEdit4("Waxing Crescent Color")]
|
|
[Order(27)]
|
|
public PluginConfigColor WaningCrescentColor = new(new Vector4(255f / 255f, 0f / 255f, 0f / 255f, 100f / 100f));
|
|
public MoonFluteBarConfig(Vector2 position, Vector2 size, PluginConfigColor fillColor)
|
|
: base(position, size, fillColor)
|
|
{
|
|
}
|
|
}
|
|
[Exportable(false)]
|
|
public class SpellAmpBarConfig : ProgressBarConfig
|
|
{
|
|
[ColorEdit4("Waning Crescent Color")]
|
|
[Order(26)]
|
|
public PluginConfigColor BristleColor = new(new Vector4(0f / 255f, 255f / 255f, 0f / 255f, 100f / 100f));
|
|
[ColorEdit4("Waxing Crescent Color")]
|
|
[Order(27)]
|
|
public PluginConfigColor WhistleColor = new(new Vector4(255f / 255f, 0f / 255f, 0f / 255f, 100f / 100f));
|
|
public SpellAmpBarConfig(Vector2 position, Vector2 size, PluginConfigColor fillColor)
|
|
: base(position, size, fillColor)
|
|
{
|
|
}
|
|
}
|
|
}
|