f37369cdda
Co-authored-by: Cursor <cursoragent@cursor.com>
257 lines
9.3 KiB
C#
257 lines
9.3 KiB
C#
using Dalamud.Game.ClientState.JobGauge.Types;
|
|
using Dalamud.Game.ClientState.Objects.SubKinds;
|
|
using Dalamud.Logging;
|
|
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.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Numerics;
|
|
|
|
namespace HSUI.Interface.Jobs
|
|
{
|
|
public class MachinistHud : JobHud
|
|
{
|
|
private bool _robotMaxDurationSet;
|
|
private float _robotMaxDuration;
|
|
|
|
private new MachinistConfig Config => (MachinistConfig)_config;
|
|
|
|
public MachinistHud(MachinistConfig 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.OverheatChunkedGauge.Enabled)
|
|
{
|
|
positions.Add(Config.Position + Config.OverheatChunkedGauge.Position);
|
|
sizes.Add(Config.OverheatChunkedGauge.Size);
|
|
}
|
|
|
|
if (Config.HeatGauge.Enabled)
|
|
{
|
|
positions.Add(Config.Position + Config.HeatGauge.Position);
|
|
sizes.Add(Config.HeatGauge.Size);
|
|
}
|
|
|
|
if (Config.BatteryGauge.Enabled)
|
|
{
|
|
positions.Add(Config.Position + Config.BatteryGauge.Position);
|
|
sizes.Add(Config.BatteryGauge.Size);
|
|
}
|
|
|
|
return (positions, sizes);
|
|
}
|
|
|
|
public override void DrawJobHud(Vector2 origin, IPlayerCharacter player)
|
|
{
|
|
Vector2 pos = origin + Config.Position;
|
|
|
|
if (Config.OverheatChunkedGauge.Enabled)
|
|
{
|
|
DrawOverheatBar(pos, player);
|
|
}
|
|
|
|
if (Config.HeatGauge.Enabled)
|
|
{
|
|
DrawHeatGauge(pos, player);
|
|
}
|
|
|
|
if (Config.BatteryGauge.Enabled)
|
|
{
|
|
DrawBatteryGauge(pos, player);
|
|
}
|
|
|
|
if (Config.AutomatonBar.Enabled)
|
|
{
|
|
DrawAutomatonBar(pos, player);
|
|
}
|
|
|
|
if (Config.WildfireBar.Enabled)
|
|
{
|
|
DrawWildfireBar(pos, player);
|
|
}
|
|
}
|
|
|
|
private void DrawHeatGauge(Vector2 origin, IPlayerCharacter player)
|
|
{
|
|
MCHGauge gauge = Plugin.JobGauges.Get<MCHGauge>();
|
|
|
|
if (!Config.HeatGauge.HideWhenInactive || gauge.Heat > 0)
|
|
{
|
|
Config.HeatGauge.Label.SetValue(gauge.Heat);
|
|
|
|
BarHud[] bars = BarUtilities.GetChunkedProgressBars(Config.HeatGauge, 2, gauge.Heat, 100, 0, player);
|
|
foreach (BarHud bar in bars)
|
|
{
|
|
AddDrawActions(bar.GetDrawActions(origin, Config.HeatGauge.StrataLevel));
|
|
}
|
|
}
|
|
}
|
|
|
|
private void DrawBatteryGauge(Vector2 origin, IPlayerCharacter player)
|
|
{
|
|
MCHGauge gauge = Plugin.JobGauges.Get<MCHGauge>();
|
|
|
|
if (!Config.BatteryGauge.HideWhenInactive || gauge.Battery > 0)
|
|
{
|
|
Config.BatteryGauge.Label.SetValue(gauge.Battery);
|
|
|
|
BarHud bar = BarUtilities.GetProgressBar(Config.BatteryGauge, gauge.Battery, 100f, 0f, player, Config.BatteryGauge.BatteryColor);
|
|
AddDrawActions(bar.GetDrawActions(origin, Config.BatteryGauge.StrataLevel));
|
|
}
|
|
}
|
|
|
|
private void DrawAutomatonBar(Vector2 origin, IPlayerCharacter player)
|
|
{
|
|
MCHGauge gauge = Plugin.JobGauges.Get<MCHGauge>();
|
|
|
|
if (!gauge.IsRobotActive && _robotMaxDurationSet)
|
|
{
|
|
_robotMaxDurationSet = false;
|
|
}
|
|
|
|
if (!Config.AutomatonBar.HideWhenInactive || gauge.IsRobotActive)
|
|
{
|
|
float remaining = gauge.SummonTimeRemaining / 1000f;
|
|
if (!_robotMaxDurationSet && gauge.IsRobotActive)
|
|
{
|
|
_robotMaxDuration = remaining;
|
|
_robotMaxDurationSet = true;
|
|
}
|
|
|
|
Config.AutomatonBar.Label.SetValue(remaining);
|
|
|
|
BarHud bar = BarUtilities.GetProgressBar(Config.AutomatonBar, remaining, _robotMaxDuration > 0 ? _robotMaxDuration : 1f, 0f, player);
|
|
AddDrawActions(bar.GetDrawActions(origin, Config.AutomatonBar.StrataLevel));
|
|
}
|
|
}
|
|
|
|
private void DrawOverheatBar(Vector2 origin, IPlayerCharacter player)
|
|
{
|
|
MCHGauge gauge = Plugin.JobGauges.Get<MCHGauge>();
|
|
ushort stackCount = Utils.StatusListForBattleChara(player).FirstOrDefault(o => o.StatusId is 2688)?.Param ?? 0;
|
|
|
|
if (!Config.OverheatChunkedGauge.HideWhenInactive || stackCount > 0)
|
|
{
|
|
LabelConfig[]? labels = null;
|
|
if (Config.OverheatChunkedGauge.DurationLabel.Enabled)
|
|
{
|
|
Config.OverheatChunkedGauge.DurationLabel.SetValue(gauge.OverheatTimeRemaining / 1000f);
|
|
labels = new LabelConfig[5];
|
|
labels[2] = Config.OverheatChunkedGauge.DurationLabel;
|
|
}
|
|
|
|
BarHud[] bars = BarUtilities.GetChunkedBars(Config.OverheatChunkedGauge, 5, stackCount, 5, labels: labels );
|
|
foreach (BarHud bar in bars)
|
|
{
|
|
AddDrawActions(bar.GetDrawActions(origin, Config.OverheatChunkedGauge.StrataLevel));
|
|
}
|
|
}
|
|
}
|
|
|
|
private void DrawWildfireBar(Vector2 origin, IPlayerCharacter player)
|
|
{
|
|
float wildfireDuration = Utils.StatusListForBattleChara(player).FirstOrDefault(o => o.StatusId is 1946)?.RemainingTime ?? 0f;
|
|
|
|
if (!Config.WildfireBar.HideWhenInactive || wildfireDuration > 0)
|
|
{
|
|
Config.WildfireBar.Label.SetValue(wildfireDuration);
|
|
|
|
BarHud bar = BarUtilities.GetProgressBar(Config.WildfireBar, wildfireDuration, 10, 0f, player);
|
|
AddDrawActions(bar.GetDrawActions(origin, Config.WildfireBar.StrataLevel));
|
|
}
|
|
}
|
|
}
|
|
|
|
[Section("Job Specific Bars")]
|
|
[SubSection("Ranged", 0)]
|
|
[SubSection("Machinist", 1)]
|
|
public class MachinistConfig : JobConfig
|
|
{
|
|
[JsonIgnore] public override uint JobId => JobIDs.MCH;
|
|
public new static MachinistConfig DefaultConfig()
|
|
{
|
|
var config = new MachinistConfig();
|
|
|
|
config.HeatGauge.UsePartialFillColor = true;
|
|
|
|
return config;
|
|
}
|
|
|
|
[NestedConfig("Overheat Gauge", 30)]
|
|
public MachinistOverheatBarConfig OverheatChunkedGauge = new MachinistOverheatBarConfig(
|
|
new Vector2(0, -54),
|
|
new Vector2(254, 20),
|
|
new PluginConfigColor(new Vector4(255f / 255f, 239f / 255f, 14f / 255f, 100f / 100f))
|
|
);
|
|
|
|
[NestedConfig("Heat Gauge", 35)]
|
|
public ChunkedProgressBarConfig HeatGauge = new ChunkedProgressBarConfig(
|
|
new Vector2(0, -32),
|
|
new Vector2(254, 20),
|
|
new PluginConfigColor(new Vector4(201f / 255f, 13f / 255f, 13f / 255f, 100f / 100f)),
|
|
2,
|
|
new PluginConfigColor(new Vector4(180f / 255f, 180f / 255f, 180f / 255f, 100f / 100f))
|
|
);
|
|
|
|
[NestedConfig("Battery Gauge", 40)]
|
|
public MachinistBatteryGaugeConfig BatteryGauge = new MachinistBatteryGaugeConfig(
|
|
new Vector2(-31, -10),
|
|
new Vector2(192, 20),
|
|
new PluginConfigColor(new Vector4(0, 0, 0, 0))
|
|
);
|
|
|
|
[NestedConfig("Automaton Queen Bar", 45)]
|
|
public ProgressBarConfig AutomatonBar = new ProgressBarConfig(
|
|
new Vector2(97, -10),
|
|
new Vector2(60, 20),
|
|
new PluginConfigColor(new Vector4(153f / 255f, 0f / 255f, 255f / 255f, 100f / 100f))
|
|
);
|
|
|
|
[NestedConfig("Wildfire Bar", 50)]
|
|
public ProgressBarConfig WildfireBar = new ProgressBarConfig(
|
|
new Vector2(0, -76),
|
|
new Vector2(254, 20),
|
|
new PluginConfigColor(new Vector4(255f / 255f, 0f / 255f, 0f / 255f, 100f / 100f)),
|
|
BarDirection.Right,
|
|
new PluginConfigColor(new Vector4(180f / 255f, 180f / 255f, 180f / 255f, 100f / 100f)),
|
|
50
|
|
);
|
|
}
|
|
|
|
[DisableParentSettings("FillColor")]
|
|
[Exportable(false)]
|
|
public class MachinistBatteryGaugeConfig : ProgressBarConfig
|
|
{
|
|
[ColorEdit4("Battery Color", spacing = true)]
|
|
[Order(55)]
|
|
public PluginConfigColor BatteryColor = new(new Vector4(106f / 255f, 255f / 255f, 255f / 255f, 100f / 100f));
|
|
|
|
public MachinistBatteryGaugeConfig(Vector2 position, Vector2 size, PluginConfigColor fillColor) : base(position, size, fillColor)
|
|
{
|
|
}
|
|
}
|
|
|
|
[Exportable(false)]
|
|
public class MachinistOverheatBarConfig : ChunkedBarConfig
|
|
{
|
|
[NestedConfig("Duration Text", 1000)]
|
|
public NumericLabelConfig DurationLabel;
|
|
|
|
public MachinistOverheatBarConfig(Vector2 position, Vector2 size, PluginConfigColor fillColor)
|
|
: base(position, size, fillColor)
|
|
{
|
|
DurationLabel = new NumericLabelConfig(Vector2.Zero, "", DrawAnchor.Center, DrawAnchor.Center);
|
|
DurationLabel.HideIfZero = true;
|
|
}
|
|
}
|
|
} |