f37369cdda
Co-authored-by: Cursor <cursoragent@cursor.com>
402 lines
16 KiB
C#
402 lines
16 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|