Files
HSUI/Interface/Jobs/PictomancerHud.cs
T

538 lines
18 KiB
C#

using Dalamud.Game.ClientState.JobGauge.Enums;
using Dalamud.Game.ClientState.JobGauge.Types;
using Dalamud.Game.ClientState.Objects.SubKinds;
using Dalamud.Game.ClientState.Statuses;
using HSUI.Config;
using HSUI.Config.Attributes;
using HSUI.Enums;
using HSUI.Helpers;
using HSUI.Interface.Bars;
using HSUI.Interface.GeneralElements;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using System.Text.Json.Serialization;
namespace HSUI.Interface.Jobs
{
public class PictomancerHud : JobHud
{
private new PictomancerConfig Config => (PictomancerConfig)_config;
private static PluginConfigColor EmptyColor => GlobalColors.Instance.EmptyColor;
public PictomancerHud(PictomancerConfig 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.PaletteBar.Enabled)
{
positions.Add(Config.Position + Config.PaletteBar.Position);
sizes.Add(Config.PaletteBar.Size);
}
if (Config.PaintBar.Enabled)
{
positions.Add(Config.Position + Config.PaintBar.Position);
sizes.Add(Config.PaintBar.Size);
}
if (Config.CreatureCanvasBar.Enabled)
{
positions.Add(Config.Position + Config.CreatureCanvasBar.Position);
sizes.Add(Config.CreatureCanvasBar.Size);
}
if (Config.WeaponCanvasBar.Enabled)
{
positions.Add(Config.Position + Config.WeaponCanvasBar.Position);
sizes.Add(Config.WeaponCanvasBar.Size);
}
if (Config.LandscapeCanvasBar.Enabled)
{
positions.Add(Config.Position + Config.LandscapeCanvasBar.Position);
sizes.Add(Config.LandscapeCanvasBar.Size);
}
if (Config.HammerTimeBar.Enabled)
{
positions.Add(Config.Position + Config.HammerTimeBar.Position);
sizes.Add(Config.HammerTimeBar.Size);
}
if (Config.HyperphantasiaBar.Enabled)
{
positions.Add(Config.Position + Config.HyperphantasiaBar.Position);
sizes.Add(Config.HyperphantasiaBar.Size);
}
return (positions, sizes);
}
public override void DrawJobHud(Vector2 origin, IPlayerCharacter player)
{
Vector2 pos = origin + Config.Position;
if (Config.PaletteBar.Enabled)
{
DrawPaletteBar(pos, player);
}
if (Config.PaintBar.Enabled)
{
DrawPaintBar(pos, player);
}
if (Config.CreatureCanvasBar.Enabled)
{
DrawCreatureCanvasBar(pos, player);
}
if (Config.WeaponCanvasBar.Enabled)
{
DrawWeaponCanvasBar(pos, player);
}
if (Config.LandscapeCanvasBar.Enabled)
{
DrawLandscapeCanvasBar(pos, player);
}
if (Config.HammerTimeBar.Enabled)
{
DrawHammerTimeBar(pos, player);
}
if (Config.HyperphantasiaBar.Enabled)
{
DrawHyperphantasiaBar(pos, player);
}
}
protected unsafe void DrawPaletteBar(Vector2 origin, IPlayerCharacter player)
{
PictomancerPaletteBarConfig config = Config.PaletteBar;
PCTGauge gauge = Plugin.JobGauges.Get<PCTGauge>();
if (config.HideWhenInactive && gauge.PalleteGauge == 0)
{
return;
}
bool isSubstractive = Utils.StatusListForBattleChara(player).FirstOrDefault(o => o.StatusId is 3674) != null;
config.Label = config.PaletteLabel;
config.PaletteLabel.SubtractiveMode = isSubstractive;
config.Label.SetValue(gauge.PalleteGauge);
PluginConfigColor fillColor = isSubstractive ? config.SubtractiveColor : config.FillColor;
BarHud[] bars = BarUtilities.GetChunkedProgressBars(
config,
2,
gauge.PalleteGauge,
100,
0,
player,
fillColor: fillColor
);
foreach (BarHud bar in bars)
{
AddDrawActions(bar.GetDrawActions(origin, config.StrataLevel));
}
}
private unsafe void DrawPaintBar(Vector2 origin, IPlayerCharacter player)
{
PictomancerPaintBarConfig config = Config.PaintBar;
PCTGauge gauge = Plugin.JobGauges.Get<PCTGauge>();
if (config.HideWhenInactive && gauge.Paint == 0)
{
return;
}
bool hasBlackPaint = Utils.StatusListForBattleChara(player).FirstOrDefault(o => o.StatusId is 3691) != null;
Tuple<PluginConfigColor, float, LabelConfig?>[] chunks = new Tuple<PluginConfigColor, float, LabelConfig?>[5];
for (int i = 0; i < 5; i++)
{
PluginConfigColor color = PluginConfigColor.Empty;
if (i < gauge.Paint)
{
color = i == gauge.Paint - 1 && hasBlackPaint ? config.BlackPaintColor : config.WhitePaintColor;
}
chunks[i] = new(color, 1, null);
}
BarHud[] bars = BarUtilities.GetChunkedBars(config, chunks, player);
foreach (BarHud bar in bars)
{
AddDrawActions(bar.GetDrawActions(origin, config.StrataLevel));
}
}
private unsafe void DrawCreatureCanvasBar(Vector2 origin, IPlayerCharacter player)
{
PictomancerCreatureCanvasBarConfig config = Config.CreatureCanvasBar;
PCTGauge gauge = Plugin.JobGauges.Get<PCTGauge>();
if (config.HideWhenInactive && !gauge.CreatureMotifDrawn && gauge.CreatureFlags != 0)
{
return;
}
// canvas
PluginConfigColor? canvasColor = null;
if (gauge.CanvasFlags.HasFlag(CanvasFlags.Maw))
{
canvasColor = config.FangsColor;
}
else if (gauge.CanvasFlags.HasFlag(CanvasFlags.Claw))
{
canvasColor = config.ClawColor;
}
else if (gauge.CanvasFlags.HasFlag(CanvasFlags.Wing))
{
canvasColor = config.WingsColor;
}
else if(gauge.CanvasFlags.HasFlag(CanvasFlags.Pom))
{
canvasColor = config.PomColor;
}
Tuple<PluginConfigColor, float, LabelConfig?> canvas = new(
canvasColor ?? PluginConfigColor.Empty,
canvasColor != null ? 1 : 0,
null
);
// part drawing
PluginConfigColor? drawingColor = null;
if (gauge.CreatureFlags.HasFlag(CreatureFlags.Claw))
{
drawingColor = config.ClawColor;
}
else if (config.ShowEmptyPomWings &&
gauge.CreatureFlags.HasFlag(CreatureFlags.Pom) &&
gauge.CreatureFlags.HasFlag(CreatureFlags.Wings))
{
drawingColor = PluginConfigColor.Empty;
}
else if (gauge.CreatureFlags.HasFlag(CreatureFlags.Wings))
{
drawingColor = config.WingsColor;
}
else if(gauge.CreatureFlags.HasFlag(CreatureFlags.Pom))
{
drawingColor = config.PomColor;
}
Tuple<PluginConfigColor, float, LabelConfig?> drawing = new(
drawingColor ?? PluginConfigColor.Empty,
drawingColor != null ? 1 : 0,
null
);
// portrait
PluginConfigColor? portraitColor = null;
if (gauge.CreatureFlags.HasFlag(CreatureFlags.MooglePortait))
{
portraitColor = config.MoogleColor;
}
else if (gauge.CreatureFlags.HasFlag(CreatureFlags.MadeenPortrait))
{
portraitColor = config.MadeenColor;
}
Tuple<PluginConfigColor, float, LabelConfig?> portrait = new(
portraitColor ?? PluginConfigColor.Empty,
portraitColor != null ? 1 : 0,
null
);
var chunks = new List<Tuple<PluginConfigColor, float, LabelConfig?>>();
chunks.Add(canvas);
if (!config.DontShowDrawing)
{
chunks.Add(drawing);
}
chunks.Add(portrait);
BarHud[] bars = BarUtilities.GetChunkedBars(config, chunks.ToArray(), player);
foreach (BarHud bar in bars)
{
AddDrawActions(bar.GetDrawActions(origin, config.StrataLevel));
}
}
private unsafe void DrawWeaponCanvasBar(Vector2 origin, IPlayerCharacter player)
{
ChunkedBarConfig config = Config.WeaponCanvasBar;
PCTGauge gauge = Plugin.JobGauges.Get<PCTGauge>();
bool active = gauge.CanvasFlags.HasFlag(CanvasFlags.Weapon);
if (config.HideWhenInactive && !active)
{
return;
}
BarHud[] bars = BarUtilities.GetChunkedBars(config, 1, active ? 1 : 0, 1, 0, player);
foreach (BarHud bar in bars)
{
AddDrawActions(bar.GetDrawActions(origin, config.StrataLevel));
}
}
private unsafe void DrawLandscapeCanvasBar(Vector2 origin, IPlayerCharacter player)
{
ChunkedBarConfig config = Config.LandscapeCanvasBar;
PCTGauge gauge = Plugin.JobGauges.Get<PCTGauge>();
bool active = gauge.CanvasFlags.HasFlag(CanvasFlags.Landscape);
if (config.HideWhenInactive && !active)
{
return;
}
BarHud[] bars = BarUtilities.GetChunkedBars(config, 1, active ? 1 : 0, 1, 0, player);
foreach (BarHud bar in bars)
{
AddDrawActions(bar.GetDrawActions(origin, config.StrataLevel));
}
}
private unsafe void DrawHammerTimeBar(Vector2 origin, IPlayerCharacter player)
{
StacksWithDurationBarConfig config = Config.HammerTimeBar;
IStatus? status = Utils.StatusListForBattleChara(player).FirstOrDefault(o => o.StatusId is 3680);
int stacks = status?.Param ?? 0;
float time = Math.Abs(status?.RemainingTime ?? 0f);
if (config.HideWhenInactive && stacks == 0)
{
return;
}
config.Label.SetValue(time);
BarHud[] bars = BarUtilities.GetChunkedProgressBars(config, 3, stacks, 3, 0, player, forceLabelIndex: 1);
foreach (BarHud bar in bars)
{
AddDrawActions(bar.GetDrawActions(origin, config.StrataLevel));
}
}
private unsafe void DrawHyperphantasiaBar(Vector2 origin, IPlayerCharacter player)
{
StacksWithDurationBarConfig config = Config.HyperphantasiaBar;
IStatus? status = Utils.StatusListForBattleChara(player).FirstOrDefault(o => o.StatusId is 3688);
int stacks = status?.Param ?? 0;
float time = Math.Abs(status?.RemainingTime ?? 0f);
if (config.HideWhenInactive && stacks == 0)
{
return;
}
config.Label.SetValue(time);
BarHud[] bars = BarUtilities.GetChunkedProgressBars(config, 5, stacks, 5, 0, player, forceLabelIndex: 2);
foreach (BarHud bar in bars)
{
AddDrawActions(bar.GetDrawActions(origin, config.StrataLevel));
}
}
}
[Section("Job Specific Bars")]
[SubSection("Caster", 0)]
[SubSection("Pictomancer", 1)]
public class PictomancerConfig : JobConfig
{
[JsonIgnore] public override uint JobId => JobIDs.PCT;
public new static PictomancerConfig DefaultConfig()
{
var config = new PictomancerConfig();
config.PaletteBar.UseChunks = false;
config.PaletteBar.Label.Enabled = true;
return config;
}
[NestedConfig("Palette Bar", 30)]
public PictomancerPaletteBarConfig PaletteBar = new PictomancerPaletteBarConfig(
new Vector2(0, -10),
new Vector2(152, 18),
PluginConfigColor.FromHex(0xFFC8C89F)
);
[NestedConfig("Paint Bar", 35)]
public PictomancerPaintBarConfig PaintBar = new PictomancerPaintBarConfig(
new(0, -26),
new(254, 10)
);
[NestedConfig("Creature Canvas Bar", 40)]
public PictomancerCreatureCanvasBarConfig CreatureCanvasBar = new PictomancerCreatureCanvasBarConfig(
new(0, -38),
new(254, 10)
);
[NestedConfig("Weapon Canvas Bar", 40)]
public ChunkedBarConfig WeaponCanvasBar = new ChunkedBarConfig(
new(-102.5f, -10),
new(49, 18),
PluginConfigColor.FromHex(0xFFC5616C)
);
[NestedConfig("Landscape Canvas Bar", 40)]
public ChunkedBarConfig LandscapeCanvasBar = new ChunkedBarConfig(
new(102.5f, -10),
new(49, 18),
PluginConfigColor.FromHex(0xFF8690E5)
);
[NestedConfig("Hammer Time Bar", 40)]
public StacksWithDurationBarConfig HammerTimeBar = new StacksWithDurationBarConfig(
new(0, -50),
new(254, 10),
PluginConfigColor.FromHex(0xFFFFFFFF)
);
[NestedConfig("Hyperphantasia Bar", 45)]
public StacksWithDurationBarConfig HyperphantasiaBar = new StacksWithDurationBarConfig(
new(0, -50),
new(254, 10),
PluginConfigColor.FromHex(0xFFFFFFFF)
);
}
[DisableParentSettings("Label")]
[Exportable(false)]
public class PictomancerPaletteBarConfig : ChunkedProgressBarConfig
{
[ColorEdit4("Subtractive Fill Color")]
[Order(27)]
public PluginConfigColor SubtractiveColor = PluginConfigColor.FromHex(0xFFAF6BAE);
[NestedConfig("Bar Text", 1001, separator = false, spacing = true)]
public PictomancerPaletteLabelConfig PaletteLabel = new PictomancerPaletteLabelConfig(Vector2.Zero, "", DrawAnchor.Center, DrawAnchor.Center);
public PictomancerPaletteBarConfig(Vector2 position, Vector2 size, PluginConfigColor fillColor)
: base(position, size, fillColor)
{
Label = PaletteLabel;
}
}
[Exportable(false)]
public class PictomancerPaletteLabelConfig : NumericLabelConfig
{
[ColorEdit4("Subtractive Color")]
[Order(31)]
public PluginConfigColor SubtractiveColor = new PluginConfigColor(Vector4.UnitW);
[ColorEdit4("Subtractive Color ##Outline")]
[Order(41, collapseWith = nameof(ShowOutline))]
public PluginConfigColor SubtractiveOutlineColor = new PluginConfigColor(Vector4.One);
public PictomancerPaletteLabelConfig(Vector2 position, string text, DrawAnchor frameAnchor, DrawAnchor textAnchor)
: base(position, text, frameAnchor, textAnchor)
{
}
[JsonIgnore] public bool SubtractiveMode = false;
public override PluginConfigColor GetColor() => SubtractiveMode ? SubtractiveColor : Color;
public override PluginConfigColor GetOutlineColor() => SubtractiveMode ? SubtractiveOutlineColor : OutlineColor;
public override PictomancerPaletteLabelConfig Clone(int index) =>
new PictomancerPaletteLabelConfig(Position, _text, FrameAnchor, TextAnchor)
{
Color = Color,
SubtractiveColor = SubtractiveColor,
OutlineColor = OutlineColor,
SubtractiveOutlineColor = SubtractiveOutlineColor,
ShadowConfig = ShadowConfig,
ShowOutline = ShowOutline,
FontID = FontID,
UseJobColor = UseJobColor,
Enabled = Enabled,
HideIfZero = HideIfZero,
ID = ID + "_{index}"
};
}
[DisableParentSettings("FillColor")]
[Exportable(false)]
public class PictomancerPaintBarConfig : ChunkedBarConfig
{
[ColorEdit4("White Paint Color")]
[Order(26)]
public PluginConfigColor WhitePaintColor = PluginConfigColor.FromHex(0xFF00FFFF);
[ColorEdit4("Black Paint Color")]
[Order(27)]
public PluginConfigColor BlackPaintColor = PluginConfigColor.FromHex(0xFFDB57DB);
public PictomancerPaintBarConfig(Vector2 position, Vector2 size)
: base(position, size, PluginConfigColor.Empty)
{
}
}
[DisableParentSettings("FillColor")]
[Exportable(false)]
public class PictomancerCreatureCanvasBarConfig : ChunkedBarConfig
{
[ColorEdit4("Pom Color")]
[Order(17)]
public PluginConfigColor PomColor = PluginConfigColor.FromHex(0xFFE69378);
[ColorEdit4("Wings Color")]
[Order(18)]
public PluginConfigColor WingsColor = PluginConfigColor.FromHex(0xFFD38BE4);
[ColorEdit4("Claw Color")]
[Order(19)]
public PluginConfigColor ClawColor = PluginConfigColor.FromHex(0xFFA16854);
[ColorEdit4("Fangs Color")]
[Order(20)]
public PluginConfigColor FangsColor = PluginConfigColor.FromHex(0xFF80BFBD);
[ColorEdit4("Moogle Color")]
[Order(21)]
public PluginConfigColor MoogleColor = PluginConfigColor.FromHex(0xFFA745C7);
[ColorEdit4("Madeen Color")]
[Order(22)]
public PluginConfigColor MadeenColor = PluginConfigColor.FromHex(0xFF93Cf7D);
[Checkbox("Don't Show Drawing", spacing = true, help = "When enabled, this hides the middle chunk that shows which creature parts were already drawn.")]
[Order(50)]
public bool DontShowDrawing = false;
[Checkbox("Show Empty Drawing for Pom + Wings")]
[Order(51)]
public bool ShowEmptyPomWings = false;
public PictomancerCreatureCanvasBarConfig(Vector2 position, Vector2 size)
: base(position, size, PluginConfigColor.Empty)
{
}
}
}