using Dalamud.Game.ClientState.Objects.Types; using HSUI.Config; using HSUI.Enums; using HSUI.Helpers; using HSUI.Interface.GeneralElements; using Dalamud.Bindings.ImGui; using System; using System.Collections.Generic; using System.Numerics; namespace HSUI.Interface.Bars { public class BarHud { private string ID { get; set; } private Rect BackgroundRect { get; set; } = new Rect(); private List ForegroundRects { get; set; } = new List(); private List LabelHuds { get; set; } = new List(); private bool DrawBorder { get; set; } private PluginConfigColor? BorderColor { get; set; } private int BorderThickness { get; set; } private DrawAnchor Anchor { get; set; } private IGameObject? Actor { get; set; } private PluginConfigColor? GlowColor { get; set; } private int GlowSize { get; set; } private float? Current; private float? Max; private ShadowConfig? ShadowConfig { get; set; } private string? BarTextureName { get; set; } private BarTextureDrawMode BarTextureDrawMode { get; set; } public bool NeedsInputs = false; public BarHud( string id, bool drawBorder = true, PluginConfigColor? borderColor = null, int borderThickness = 1, DrawAnchor anchor = DrawAnchor.TopLeft, IGameObject? actor = null, PluginConfigColor? glowColor = null, int? glowSize = 1, float? current = null, float? max = null, ShadowConfig? shadowConfig = null, string? barTextureName = null, BarTextureDrawMode barTextureDrawMode = BarTextureDrawMode.Stretch) { ID = id; DrawBorder = drawBorder; BorderColor = borderColor; BorderThickness = borderThickness; Anchor = anchor; Actor = actor; GlowColor = glowColor; GlowSize = glowSize ?? 1; Current = current; Max = max; ShadowConfig = shadowConfig; BarTextureName = barTextureName; BarTextureDrawMode = barTextureDrawMode; } public BarHud(BarConfig config, IGameObject? actor = null, BarGlowConfig? glowConfig = null, float? current = null, float? max = null) : this(config.ID, config.DrawBorder, config.BorderColor, config.BorderThickness, config.Anchor, actor, glowConfig?.Color, glowConfig?.Size, current, max, null, config.BarTextureName, config.BarTextureDrawMode) { BackgroundRect = new Rect(config.Position, config.Size, config.BackgroundColor); ShadowConfig = config.ShadowConfig; } public BarHud SetBackground(Rect rect) { BackgroundRect = rect; return this; } public BarHud AddForegrounds(params Rect[] rects) { ForegroundRects.AddRange(rects); return this; } public BarHud AddLabels(params LabelConfig[]? labels) { if (labels != null) { foreach (LabelConfig config in labels) { var labelHud = new LabelHud(config); LabelHuds.Add(labelHud); } } return this; } public BarHud SetGlow(PluginConfigColor color, int size = 1) { GlowColor = color; GlowSize = size; return this; } public void Draw(Vector2 origin) { var barPos = Utils.GetAnchoredPosition(origin, BackgroundRect.Size, Anchor); var backgroundPos = barPos + BackgroundRect.Position; DrawRects(barPos, backgroundPos); // labels foreach (LabelHud label in LabelHuds) { label.Draw(backgroundPos, BackgroundRect.Size, Actor, null, (uint?)Current, (uint?)Max); } } public List<(StrataLevel, Action)> GetDrawActions(Vector2 origin, StrataLevel strataLevel) { List<(StrataLevel, Action)> drawActions = new List<(StrataLevel, Action)>(); var barPos = Utils.GetAnchoredPosition(origin, BackgroundRect.Size, Anchor); var backgroundPos = barPos + BackgroundRect.Position; drawActions.Add((strataLevel, () => { DrawRects(barPos, backgroundPos); } )); // labels foreach (LabelHud label in LabelHuds) { drawActions.Add((label.GetConfig().StrataLevel, () => { label.Draw(backgroundPos, BackgroundRect.Size, Actor, null, (uint?)Current, (uint?)Max); } )); } return drawActions; } private void DrawRects(Vector2 barPos, Vector2 backgroundPos) { DrawHelper.DrawInWindow(ID, backgroundPos, BackgroundRect.Size, NeedsInputs, (drawList) => { // Draw background drawList.AddRectFilled(backgroundPos, backgroundPos + BackgroundRect.Size, BackgroundRect.Color.Base); // Draw Shadow if (ShadowConfig != null && ShadowConfig.Enabled) { // Right Side drawList.AddRectFilled(backgroundPos + new Vector2(BackgroundRect.Size.X, ShadowConfig.Offset), backgroundPos + BackgroundRect.Size + new Vector2(ShadowConfig.Offset, ShadowConfig.Offset) + new Vector2(ShadowConfig.Thickness - 1, ShadowConfig.Thickness - 1), ShadowConfig.Color.Base); // Bottom Size drawList.AddRectFilled(backgroundPos + new Vector2(ShadowConfig.Offset, BackgroundRect.Size.Y), backgroundPos + BackgroundRect.Size + new Vector2(ShadowConfig.Offset, ShadowConfig.Offset) + new Vector2(ShadowConfig.Thickness - 1, ShadowConfig.Thickness - 1), ShadowConfig.Color.Base); } // Draw foregrounds foreach (Rect rect in ForegroundRects) { DrawHelper.DrawBarTexture(barPos + rect.Position, rect.Size, rect.Color, BarTextureName, BarTextureDrawMode, drawList); } // Draw Border if (DrawBorder) { drawList.AddRect(backgroundPos, backgroundPos + BackgroundRect.Size, BorderColor?.Base ?? 0xFF000000, 0, ImDrawFlags.None, BorderThickness); } // Draw Glow if (GlowColor != null) { var glowPosition = new Vector2(backgroundPos.X - 1, backgroundPos.Y - 1); var glowSize = new Vector2(BackgroundRect.Size.X + 2, BackgroundRect.Size.Y + 2); drawList.AddRect(glowPosition, glowPosition + glowSize, GlowColor.Base, 0, ImDrawFlags.None, GlowSize); } }); } } }