f37369cdda
Co-authored-by: Cursor <cursoragent@cursor.com>
247 lines
8.6 KiB
C#
247 lines
8.6 KiB
C#
using Dalamud.Game.ClientState.JobGauge.Types;
|
|
using Dalamud.Game.ClientState.Objects.SubKinds;
|
|
using Dalamud.Game.ClientState.Objects.Types;
|
|
using HSUI.Config;
|
|
using HSUI.Config.Attributes;
|
|
using HSUI.Enums;
|
|
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;
|
|
|
|
namespace HSUI.Interface.Jobs
|
|
{
|
|
public class ReaperHud : JobHud
|
|
{
|
|
private new ReaperConfig Config => (ReaperConfig)_config;
|
|
|
|
public ReaperHud(JobConfig config, string? displayName = null) : base(config, displayName)
|
|
{
|
|
}
|
|
|
|
protected override (List<Vector2>, List<Vector2>) ChildrenPositionsAndSizes()
|
|
{
|
|
List<Vector2> positions = new();
|
|
List<Vector2> sizes = new();
|
|
|
|
if (Config.DeathsDesignBar.Enabled)
|
|
{
|
|
positions.Add(Config.Position + Config.DeathsDesignBar.Position);
|
|
sizes.Add(Config.DeathsDesignBar.Size);
|
|
}
|
|
|
|
if (Config.SoulBar.Enabled)
|
|
{
|
|
positions.Add(Config.Position + Config.SoulBar.Position);
|
|
sizes.Add(Config.SoulBar.Size);
|
|
}
|
|
|
|
if (Config.ShroudBar.Enabled)
|
|
{
|
|
positions.Add(Config.Position + Config.ShroudBar.Position);
|
|
sizes.Add(Config.ShroudBar.Size);
|
|
}
|
|
|
|
if (Config.DeathGauge.Enabled)
|
|
{
|
|
positions.Add(Config.Position + Config.DeathGauge.Position);
|
|
sizes.Add(Config.DeathGauge.Size);
|
|
}
|
|
|
|
return (positions, sizes);
|
|
}
|
|
|
|
public override void DrawJobHud(Vector2 origin, IPlayerCharacter player)
|
|
{
|
|
Vector2 pos = origin + Config.Position;
|
|
RPRGauge gauge = Plugin.JobGauges.Get<RPRGauge>();
|
|
|
|
if (Config.DeathsDesignBar.Enabled)
|
|
{
|
|
DrawDeathsDesignBar(pos, player);
|
|
}
|
|
|
|
if (Config.SoulBar.Enabled)
|
|
{
|
|
DrawSoulGauge(pos, gauge, player);
|
|
}
|
|
|
|
if (Config.ShroudBar.Enabled)
|
|
{
|
|
DrawShroudGauge(pos, gauge, player);
|
|
}
|
|
|
|
if (Config.DeathGauge.Enabled)
|
|
{
|
|
DrawDeathGauge(pos, gauge, player);
|
|
}
|
|
}
|
|
|
|
private void DrawDeathsDesignBar(Vector2 origin, IPlayerCharacter player)
|
|
{
|
|
IGameObject? actor = Plugin.TargetManager.SoftTarget ?? Plugin.TargetManager.Target;
|
|
float duration = 0f;
|
|
|
|
if (actor is IBattleChara target)
|
|
{
|
|
duration = Utils.StatusListForBattleChara(target).FirstOrDefault(o => o.StatusId is 2586 && o.SourceId == player.GameObjectId && o.RemainingTime > 0)?.RemainingTime ?? 0f;
|
|
}
|
|
|
|
if (!Config.DeathsDesignBar.HideWhenInactive || duration > 0)
|
|
{
|
|
Config.DeathsDesignBar.Label.SetValue(duration);
|
|
|
|
BarHud[] bars = BarUtilities.GetChunkedProgressBars(Config.DeathsDesignBar, 2, duration, 60f, 0f, player);
|
|
foreach (BarHud bar in bars)
|
|
{
|
|
AddDrawActions(bar.GetDrawActions(origin, Config.DeathsDesignBar.StrataLevel));
|
|
}
|
|
}
|
|
}
|
|
|
|
private void DrawSoulGauge(Vector2 origin, RPRGauge gauge, IPlayerCharacter player)
|
|
{
|
|
float soul = gauge.Soul;
|
|
|
|
if (!Config.SoulBar.HideWhenInactive || soul > 0)
|
|
{
|
|
Config.SoulBar.Label.SetValue(soul);
|
|
|
|
BarHud[] bars = BarUtilities.GetChunkedProgressBars(Config.SoulBar, 2, soul, 100f, 0f, player);
|
|
foreach (BarHud bar in bars)
|
|
{
|
|
AddDrawActions(bar.GetDrawActions(origin, Config.SoulBar.StrataLevel));
|
|
}
|
|
}
|
|
}
|
|
|
|
private void DrawShroudGauge(Vector2 origin, RPRGauge gauge, IPlayerCharacter player)
|
|
{
|
|
float shroud = gauge.Shroud;
|
|
|
|
if (!Config.ShroudBar.HideWhenInactive || shroud > 0)
|
|
{
|
|
Config.ShroudBar.Label.SetValue(shroud);
|
|
|
|
BarHud[] bars = BarUtilities.GetChunkedProgressBars(Config.ShroudBar, 2, shroud, 100f, 0f, player);
|
|
foreach (BarHud bar in bars)
|
|
{
|
|
AddDrawActions(bar.GetDrawActions(origin, Config.ShroudBar.StrataLevel));
|
|
}
|
|
}
|
|
}
|
|
|
|
private void DrawDeathGauge(Vector2 origin, RPRGauge gauge, IPlayerCharacter player)
|
|
{
|
|
var lemureShroud = gauge.LemureShroud;
|
|
var voidShroud = gauge.VoidShroud;
|
|
|
|
if (!Config.DeathGauge.HideWhenInactive || gauge.EnshroudedTimeRemaining > 0)
|
|
{
|
|
var deathChunks = new Tuple<PluginConfigColor, float, LabelConfig?>[5];
|
|
|
|
int i = 0;
|
|
for (; i < lemureShroud && i < deathChunks.Length; i++)
|
|
{
|
|
deathChunks[i] = new(Config.DeathGauge.LemureShroudColor, 1f, i == 2 ? Config.DeathGauge.EnshroudTimerLabel : null);
|
|
}
|
|
|
|
for (; i < lemureShroud + voidShroud && i < deathChunks.Length; i++)
|
|
{
|
|
deathChunks[i] = new(Config.DeathGauge.VoidShroudColor, 1f, i == 2 ? Config.DeathGauge.EnshroudTimerLabel : null);
|
|
}
|
|
|
|
for (; i < deathChunks.Length; i++)
|
|
{
|
|
deathChunks[i] = new(Config.DeathGauge.VoidShroudColor, 0f, i == 2 ? Config.DeathGauge.EnshroudTimerLabel : null);
|
|
}
|
|
|
|
Config.DeathGauge.EnshroudTimerLabel.SetValue(gauge.EnshroudedTimeRemaining / 1000);
|
|
|
|
BarHud[] bars = BarUtilities.GetChunkedBars(Config.DeathGauge, deathChunks, player);
|
|
foreach (BarHud bar in bars)
|
|
{
|
|
AddDrawActions(bar.GetDrawActions(origin, Config.DeathGauge.StrataLevel));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
[Section("Job Specific Bars")]
|
|
[SubSection("Melee", 0)]
|
|
[SubSection("Reaper", 1)]
|
|
public class ReaperConfig : JobConfig
|
|
{
|
|
[JsonIgnore] public override uint JobId => JobIDs.RPR;
|
|
|
|
public new static ReaperConfig DefaultConfig()
|
|
{
|
|
var config = new ReaperConfig();
|
|
config.DeathsDesignBar.UseChunks = false;
|
|
config.DeathsDesignBar.Label.Enabled = true;
|
|
|
|
config.SoulBar.UseChunks = false;
|
|
config.SoulBar.Label.Enabled = true;
|
|
|
|
config.ShroudBar.UseChunks = false;
|
|
config.ShroudBar.Label.Enabled = true;
|
|
|
|
config.DeathGauge.EnshroudTimerLabel.HideIfZero = true;
|
|
|
|
return config;
|
|
}
|
|
|
|
[NestedConfig("Death's Design Bar", 35)]
|
|
public ChunkedProgressBarConfig DeathsDesignBar = new ChunkedProgressBarConfig(
|
|
new(0, -10),
|
|
new(254, 20),
|
|
new PluginConfigColor(new Vector4(145f / 255f, 0f / 255f, 25f / 255f, 100f / 100f))
|
|
);
|
|
|
|
[NestedConfig("Soul Bar", 40)]
|
|
public ChunkedProgressBarConfig SoulBar = new ChunkedProgressBarConfig(
|
|
new(0, -32),
|
|
new(254, 20),
|
|
new PluginConfigColor(new Vector4(254f / 255f, 21f / 255f, 94f / 255f, 100f / 100f))
|
|
);
|
|
|
|
[NestedConfig("Shroud Bar", 45)]
|
|
public ChunkedProgressBarConfig ShroudBar = new ChunkedProgressBarConfig(
|
|
new(0, -54),
|
|
new(254, 20),
|
|
new PluginConfigColor(new Vector4(0f / 255f, 176f / 255f, 196f / 255f, 100f / 100f))
|
|
);
|
|
|
|
[NestedConfig("Death Gauge", 50)]
|
|
public DeathGauge DeathGauge = new DeathGauge(
|
|
new(0, -76),
|
|
new(254, 20),
|
|
new PluginConfigColor(new(0, 0, 0, 0))
|
|
);
|
|
}
|
|
|
|
[DisableParentSettings("FillColor")]
|
|
public class DeathGauge : ChunkedBarConfig
|
|
{
|
|
[ColorEdit4("Lemure Shroud Color")]
|
|
[Order(21)]
|
|
public PluginConfigColor LemureShroudColor = new PluginConfigColor(new Vector4(0f / 255f, 176f / 255f, 196f / 255f, 100f / 100f));
|
|
|
|
[ColorEdit4("Void Shroud Color")]
|
|
[Order(22)]
|
|
public PluginConfigColor VoidShroudColor = new PluginConfigColor(new Vector4(150f / 255f, 90f / 255f, 144f / 255f, 100f / 100f));
|
|
|
|
[NestedConfig("Enshroud Duration Text", 50, spacing = true)]
|
|
public NumericLabelConfig EnshroudTimerLabel;
|
|
|
|
public DeathGauge(Vector2 position, Vector2 size, PluginConfigColor fillColor, int padding = 2) : base(position, size, fillColor, padding)
|
|
{
|
|
EnshroudTimerLabel = new NumericLabelConfig(Vector2.Zero, "", DrawAnchor.Center, DrawAnchor.Center);
|
|
}
|
|
}
|
|
}
|