using HSUI.Config; using HSUI.Config.Attributes; using HSUI.Enums; using HSUI.Helpers; using HSUI.Interface.Bars; using System.Numerics; namespace HSUI.Interface.GeneralElements { [DisableParentSettings("HideWhenInactive", "HideHealthIfPossible", "RangeConfig", "EnemyRangeConfig")] [Section("Unit Frames")] [SubSection("Player", 0)] public class PlayerUnitFrameConfig : UnitFrameConfig { [NestedConfig("Tank Stance Indicator", 122, spacing = true)] public TankStanceIndicatorConfig TankStanceIndicatorConfig = new TankStanceIndicatorConfig(); public PlayerUnitFrameConfig(Vector2 position, Vector2 size, EditableLabelConfig leftLabelConfig, EditableLabelConfig rightLabelConfig, EditableLabelConfig optionalLabelConfig) : base(position, size, leftLabelConfig, rightLabelConfig, optionalLabelConfig) { } public new static PlayerUnitFrameConfig DefaultConfig() { var size = HUDConstants.DefaultBigUnitFrameSize; var pos = new Vector2(-HUDConstants.UnitFramesOffsetX - size.X / 2f, HUDConstants.BaseHUDOffsetY); var leftLabelConfig = new EditableLabelConfig(new Vector2(5, 0), "[name]", DrawAnchor.TopLeft, DrawAnchor.BottomLeft); var rightLabelConfig = new EditableLabelConfig(new Vector2(-5, 0), "[health:current-short] | [health:percent]", DrawAnchor.TopRight, DrawAnchor.BottomRight); var optionalLabelConfig = new EditableLabelConfig(new Vector2(0, 0), "", DrawAnchor.Center, DrawAnchor.Center); var config = new PlayerUnitFrameConfig(pos, size, leftLabelConfig, rightLabelConfig, optionalLabelConfig); return config; } } public enum TankStanceCorner { TopLeft = 0, TopRight, BottomLeft, BottomRight } [Exportable(false)] public class TankStanceIndicatorConfig : PluginConfigObject { [Combo("Corner", "Top Left", "Top Right", "Bottom Left", "Bottom Right")] [Order(5)] public TankStanceCorner Corner = TankStanceCorner.BottomLeft; [DragFloat2("Size", min = 1, max = 500)] [Order(10)] public Vector2 Size = new Vector2(HUDConstants.DefaultBigUnitFrameSize.Y - 20, HUDConstants.DefaultBigUnitFrameSize.Y - 20); [DragInt("Thickness", min = 2, max = 20)] [Order(15)] public int Thickess = 4; [ColorEdit4("Active Color")] [Order(20)] public PluginConfigColor ActiveColor = new PluginConfigColor(new Vector4(0f / 255f, 255f / 255f, 255f / 255f, 100f / 100f)); [ColorEdit4("Inactive Color")] [Order(25)] public PluginConfigColor InactiveColor = new PluginConfigColor(new Vector4(255f / 255f, 0f / 255f, 0f / 255f, 100f / 100f)); } [DisableParentSettings("HideWhenInactive")] [Section("Unit Frames")] [SubSection("Target", 0)] public class TargetUnitFrameConfig : UnitFrameConfig { public TargetUnitFrameConfig(Vector2 position, Vector2 size, EditableLabelConfig leftLabelConfig, EditableLabelConfig rightLabelConfig, EditableLabelConfig optionalLabelConfig) : base(position, size, leftLabelConfig, rightLabelConfig, optionalLabelConfig) { } public new static TargetUnitFrameConfig DefaultConfig() { var size = HUDConstants.DefaultBigUnitFrameSize; var pos = new Vector2(HUDConstants.UnitFramesOffsetX + size.X / 2f, HUDConstants.BaseHUDOffsetY); var leftLabelConfig = new EditableLabelConfig(new Vector2(5, 0), "[health:current-short] | [health:percent]", DrawAnchor.TopLeft, DrawAnchor.BottomLeft); var rightLabelConfig = new EditableLabelConfig(new Vector2(-5, 0), "[name]", DrawAnchor.TopRight, DrawAnchor.BottomRight); var optionalLabelConfig = new EditableLabelConfig(new Vector2(0, 0), "", DrawAnchor.Center, DrawAnchor.Center); return new TargetUnitFrameConfig(pos, size, leftLabelConfig, rightLabelConfig, optionalLabelConfig); } } [DisableParentSettings("HideWhenInactive")] [Section("Unit Frames")] [SubSection("Target of Target", 0)] public class TargetOfTargetUnitFrameConfig : UnitFrameConfig { public TargetOfTargetUnitFrameConfig(Vector2 position, Vector2 size, EditableLabelConfig leftLabelConfig, EditableLabelConfig rightLabelConfig, EditableLabelConfig optionalLabelConfig) : base(position, size, leftLabelConfig, rightLabelConfig, optionalLabelConfig) { } public new static TargetOfTargetUnitFrameConfig DefaultConfig() { var size = HUDConstants.DefaultSmallUnitFrameSize; var pos = new Vector2( HUDConstants.UnitFramesOffsetX + HUDConstants.DefaultBigUnitFrameSize.X + 6 + size.X / 2f, HUDConstants.BaseHUDOffsetY - 15 ); var leftLabelConfig = new EditableLabelConfig(new Vector2(0, 0), "[name]", DrawAnchor.Top, DrawAnchor.Bottom); var rightLabelConfig = new EditableLabelConfig(new Vector2(0, 0), "", DrawAnchor.Center, DrawAnchor.TopLeft); var optionalLabelConfig = new EditableLabelConfig(new Vector2(0, 0), "", DrawAnchor.Center, DrawAnchor.BottomLeft); return new TargetOfTargetUnitFrameConfig(pos, size, leftLabelConfig, rightLabelConfig, optionalLabelConfig); } } [DisableParentSettings("HideWhenInactive")] [Section("Unit Frames")] [SubSection("Focus Target", 0)] public class FocusTargetUnitFrameConfig : UnitFrameConfig { public FocusTargetUnitFrameConfig(Vector2 position, Vector2 size, EditableLabelConfig leftLabelConfig, EditableLabelConfig rightLabelConfig, EditableLabelConfig optionalLabelConfig) : base(position, size, leftLabelConfig, rightLabelConfig, optionalLabelConfig) { } public new static FocusTargetUnitFrameConfig DefaultConfig() { var size = HUDConstants.DefaultSmallUnitFrameSize; var pos = new Vector2( -HUDConstants.UnitFramesOffsetX - HUDConstants.DefaultBigUnitFrameSize.X - 6 - size.X / 2f, HUDConstants.BaseHUDOffsetY - 15 ); var leftLabelConfig = new EditableLabelConfig(new Vector2(0, 0), "[name]", DrawAnchor.Top, DrawAnchor.Bottom); var rightLabelConfig = new EditableLabelConfig(new Vector2(0, 0), "", DrawAnchor.Center, DrawAnchor.Center); var optionalLabelConfig = new EditableLabelConfig(new Vector2(0, 0), "", DrawAnchor.Bottom, DrawAnchor.Bottom); return new FocusTargetUnitFrameConfig(pos, size, leftLabelConfig, rightLabelConfig, optionalLabelConfig); } } [DisableParentSettings("HideWhenInactive")] public class UnitFrameConfig : BarConfig { [Checkbox("Use Job Color", spacing = true)] [Order(45)] public bool UseJobColor = true; [Checkbox("Use Role Color")] [Order(46)] public bool UseRoleColor = false; [NestedConfig("Color Based On Health Value", 50, collapsingHeader = false)] public ColorByHealthValueConfig ColorByHealth = new ColorByHealthValueConfig(); [Checkbox("Job Color As Background Color", spacing = true)] [Order(50)] public bool UseJobColorAsBackgroundColor = false; [Checkbox("Role Color As Background Color")] [Order(51)] public bool UseRoleColorAsBackgroundColor = false; [Checkbox("Missing Health Color")] [Order(55)] public bool UseMissingHealthBar = false; [Checkbox("Job Color As Missing Health Color")] [Order(56, collapseWith = nameof(UseMissingHealthBar))] public bool UseJobColorAsMissingHealthColor = false; [Checkbox("Role Color As Missing Health Color")] [Order(57, collapseWith = nameof(UseMissingHealthBar))] public bool UseRoleColorAsMissingHealthColor = false; [ColorEdit4("Color" + "##MissingHealth")] [Order(60, collapseWith = nameof(UseMissingHealthBar))] public PluginConfigColor HealthMissingColor = new PluginConfigColor(new Vector4(255f / 255f, 0f / 255f, 0f / 255f, 100f / 100f)); [Checkbox("Death Indicator Background Color", spacing = true)] [Order(61)] public bool UseDeathIndicatorBackgroundColor = false; [ColorEdit4("Color" + "##DeathIndicator")] [Order(62, collapseWith = nameof(UseDeathIndicatorBackgroundColor))] public PluginConfigColor DeathIndicatorBackgroundColor = new PluginConfigColor(new Vector4(204f / 255f, 3f / 255f, 3f / 255f, 50f / 100f)); [Checkbox("Tank Invulnerability", spacing = true)] [Order(95)] public bool ShowTankInvulnerability = true; [Checkbox("Tank Invulnerability Custom Color")] [Order(100, collapseWith = nameof(ShowTankInvulnerability))] public bool UseCustomInvulnerabilityColor = true; [ColorEdit4("Tank Invulnerability Color ##TankInvulnerabilityCustom")] [Order(105, collapseWith = nameof(UseCustomInvulnerabilityColor))] public PluginConfigColor CustomInvulnerabilityColor = new PluginConfigColor(new Vector4(211f / 255f, 235f / 255f, 215f / 245f, 50f / 100f)); [Checkbox("Walking Dead Custom Color")] [Order(110, collapseWith = nameof(ShowTankInvulnerability))] public bool UseCustomWalkingDeadColor = true; [ColorEdit4("Walking Dead Color ##TankWalkingDeadCustom")] [Order(115, collapseWith = nameof(UseCustomWalkingDeadColor))] public PluginConfigColor CustomWalkingDeadColor = new PluginConfigColor(new Vector4(158f / 255f, 158f / 255f, 158f / 255f, 50f / 100f)); [NestedConfig("Use Smooth Transitions", 120, collapsingHeader = false)] public SmoothHealthConfig SmoothHealthConfig = new SmoothHealthConfig(); [Checkbox("Hide Health if Possible", spacing = true, help = "This will hide any label that has a health tag if the character doesn't have health (ie minions, friendly npcs, etc)")] [Order(121)] public bool HideHealthIfPossible = true; [NestedConfig("Left Text", 125)] public EditableLabelConfig LeftLabelConfig = null!; [NestedConfig("Right Text", 130)] public EditableLabelConfig RightLabelConfig = null!; [NestedConfig("Optional Text", 131)] public EditableLabelConfig OptionalLabelConfig = null!; [NestedConfig("Role/Job Icon", 135)] public RoleJobIconConfig RoleIconConfig = new RoleJobIconConfig( new Vector2(5, 0), new Vector2(30, 30), DrawAnchor.Left, DrawAnchor.Left ); [NestedConfig("Sign Icon", 136)] public SignIconConfig SignIconConfig = new SignIconConfig( new Vector2(0, 0), new Vector2(30, 30), DrawAnchor.Center, DrawAnchor.Top ); [NestedConfig("Shields", 140)] public ShieldConfig ShieldConfig = new ShieldConfig(); [NestedConfig("Change Friendly Alpha Based on Range", 145)] public UnitFramesRangeConfig RangeConfig = new(); [NestedConfig("Change Enemy Alpha Based on Range", 146)] public UnitFramesRangeConfig EnemyRangeConfig = new(); [NestedConfig("Custom Mouseover Area", 150)] public MouseoverAreaConfig MouseoverAreaConfig = new MouseoverAreaConfig(); [NestedConfig("Visibility", 200)] public VisibilityConfig VisibilityConfig = new VisibilityConfig(); public UnitFrameConfig(Vector2 position, Vector2 size, EditableLabelConfig leftLabelConfig, EditableLabelConfig rightLabelConfig, EditableLabelConfig optionalLabelConfig) : base(position, size, new PluginConfigColor(new(40f / 255f, 40f / 255f, 40f / 255f, 100f / 100f))) { Position = position; Size = size; LeftLabelConfig = leftLabelConfig; RightLabelConfig = rightLabelConfig; OptionalLabelConfig = optionalLabelConfig; BackgroundColor = new PluginConfigColor(new(0f / 255f, 0f / 255f, 0f / 255f, 100f / 100f)); RoleIconConfig.Enabled = false; SignIconConfig.Enabled = false; ColorByHealth.Enabled = false; MouseoverAreaConfig.Enabled = false; } public UnitFrameConfig() : base(Vector2.Zero, Vector2.Zero, PluginConfigColor.Empty) { } // don't remove } [Exportable(false)] public class ShieldConfig : PluginConfigObject { [DragInt("Thickness")] [Order(5)] public int Height = 26; // Should be 'Size' instead of 'Height' but leaving as is to avoid breaking configs [Checkbox("Thickness in Pixels")] [Order(10)] public bool HeightInPixels = false; [Checkbox("Fill Health First")] [Order(15)] public bool FillHealthFirst = true; [ColorEdit4("Color ##Shields")] [Order(20)] public PluginConfigColor Color = new PluginConfigColor(new Vector4(198f / 255f, 210f / 255f, 255f / 255f, 70f / 100f)); } [Exportable(false)] public class SmoothHealthConfig : PluginConfigObject { [DragFloat("Velocity", min = 1f, max = 100f)] [Order(5)] public float Velocity = 25f; } [Exportable(false)] public class MouseoverAreaConfig : PluginConfigObject { [Checkbox("Preview")] [Order(5)] public bool Preview = false; [Checkbox("Ignore Mouseover", help = "Enabling this will make it so this element is ignored by mouseover completely.\nThe area can still be defined for left and right clicks.")] [Order(6)] public bool Ignore = false; [DragInt2("Top Left Offset", min = -500, max = 500)] [Order(10)] public Vector2 TopLeftOffset = Vector2.Zero; [DragInt2("Bottom Right Offset", min = -500, max = 500)] [Order(11)] public Vector2 BottomRightOffset = Vector2.Zero; public MouseoverAreaConfig() { Enabled = false; } public (Vector2, Vector2) GetArea(Vector2 pos, Vector2 size) { if (!Enabled) { return (pos, pos + size); } Vector2 start = pos + TopLeftOffset; Vector2 end = pos + size + BottomRightOffset; return (start, end); } public BarHud? GetBar(Vector2 pos, Vector2 size, string id, DrawAnchor anchor = DrawAnchor.TopLeft) { if (!Enabled || !Preview) { return null; } BarHud bar = new BarHud( id, true, new(Vector4.One), 2 ); var barPos = Utils.GetAnchoredPosition(Vector2.Zero, size, anchor); var (start, end) = GetArea(barPos + pos, size); Rect background = new Rect(start, end - start, new(new(1, 1, 1, 0.5f))); bar.SetBackground(background); return bar; } } [Exportable(false)] public class UnitFramesRangeConfig : PluginConfigObject { [DragInt("Range (yalms)", min = 1, max = 500)] [Order(5)] public int Range = 30; [DragFloat("Alpha", min = 1, max = 100)] [Order(10)] public float Alpha = 24; [Checkbox("Use Additional Range Check")] [Order(15)] public bool UseAdditionalRangeCheck = false; [DragInt("Additional Range (yalms)", min = 1, max = 500)] [Order(20, collapseWith = nameof(UseAdditionalRangeCheck))] public int AdditionalRange = 15; [DragFloat("Additional Alpha", min = 1, max = 100)] [Order(25, collapseWith = nameof(UseAdditionalRangeCheck))] public float AdditionalAlpha = 60; public float AlphaForDistance(int distance, float alpha = 100f) { if (!Enabled) { return 100f; } if (!UseAdditionalRangeCheck) { return distance > Range ? Alpha : alpha; } if (Range > AdditionalRange) { return distance > Range ? Alpha : (distance > AdditionalRange ? AdditionalAlpha : alpha); } return distance > AdditionalRange ? AdditionalAlpha : (distance > Range ? Alpha : alpha); } } }