From 233916d3595a1e0156a655741d714e0f6cf91c8e Mon Sep 17 00:00:00 2001 From: Crito Date: Wed, 8 Jan 2025 17:35:00 -0600 Subject: [PATCH 1/3] PvP per job logic to handle actions that can ignore invincible states --- RotationSolver.Basic/Configuration/Configs.cs | 3 +++ RotationSolver.Basic/Rotations/CustomRotation_OtherInfo.cs | 6 ++++++ RotationSolver/Updaters/TargetUpdater.cs | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/RotationSolver.Basic/Configuration/Configs.cs b/RotationSolver.Basic/Configuration/Configs.cs index 5b4a2b6a7..f9557b771 100644 --- a/RotationSolver.Basic/Configuration/Configs.cs +++ b/RotationSolver.Basic/Configuration/Configs.cs @@ -104,6 +104,9 @@ public const string [JobConfig, UI("Only used automatically if coded into the rotation", Filter = AutoActionUsage, PvPFilter = JobFilterType.NoJob)] private readonly TinctureUseType _TinctureType = TinctureUseType.Nowhere; + + [JobConfig, UI("Ignore Invincibility for PvP purposes.", Filter = AutoActionUsage)] + public bool IgnorePvPInvincibility { get; set; } = false; [ConditionBool, UI("Automatically use Anti-Knockback role actions (Arms Length, Surecast)", Filter = AutoActionUsage)] private static readonly bool _useKnockback = true; diff --git a/RotationSolver.Basic/Rotations/CustomRotation_OtherInfo.cs b/RotationSolver.Basic/Rotations/CustomRotation_OtherInfo.cs index 9d2aed722..be1ea8533 100644 --- a/RotationSolver.Basic/Rotations/CustomRotation_OtherInfo.cs +++ b/RotationSolver.Basic/Rotations/CustomRotation_OtherInfo.cs @@ -639,6 +639,12 @@ protected static float GCDTime(uint gcdCount = 0, float offset = 0) /// [Description("Health of dying tank")] public static float HealthForDyingTanks => Service.Config.HealthForDyingTanks; + + /// + /// + /// + [Description("Whether or not Invincibility should be ignored for a PvP action.")] + public static bool IgnorePvPInvincibility => Service.Config.IgnorePvPInvincibility; #endregion /// diff --git a/RotationSolver/Updaters/TargetUpdater.cs b/RotationSolver/Updaters/TargetUpdater.cs index 54ac7be68..dd6551af9 100644 --- a/RotationSolver/Updaters/TargetUpdater.cs +++ b/RotationSolver/Updaters/TargetUpdater.cs @@ -145,7 +145,7 @@ private static List GetAllHostileTargets() { if (target == null) continue; if (!target.IsEnemy() || !target.IsTargetable) continue; - if (target.StatusList?.Any(StatusHelper.IsInvincible) == true) continue; + if (target.StatusList?.Any(StatusHelper.IsInvincible) == true && (DataCenter.IsPvP && !Service.Config.IgnorePvPInvincibility || !DataCenter.IsPvP)) continue; if (target.HasStatus(true, StatusID.StrongOfShield) && strongOfShieldPositional != target.FindEnemyPositional()) continue; hostileTargets.Add(target); From 16ceb7408db15c140b05e297858353573097cda4 Mon Sep 17 00:00:00 2001 From: Crito Date: Wed, 8 Jan 2025 20:42:10 -0600 Subject: [PATCH 2/3] Changed up Auto UI and added PvP sub section --- RotationSolver.Basic/Configuration/Configs.cs | 32 ++++++++----- RotationSolver/Data/UiString.cs | 6 +++ RotationSolver/UI/RotationConfigWindow.cs | 10 ++-- .../UI/RotationConfigWindow_Config.cs | 48 +++++++++++-------- 4 files changed, 61 insertions(+), 35 deletions(-) diff --git a/RotationSolver.Basic/Configuration/Configs.cs b/RotationSolver.Basic/Configuration/Configs.cs index f9557b771..375eca895 100644 --- a/RotationSolver.Basic/Configuration/Configs.cs +++ b/RotationSolver.Basic/Configuration/Configs.cs @@ -15,8 +15,8 @@ public const string BasicParams = "BasicParams", UiInformation = "UiInformation", UiWindows = "UiWindows", + PvPSpecificControls = "PvPSpecificControls", AutoActionUsage = "AutoActionUsage", - AutoActionCondition = "AutoActionCondition", HealingActionCondition = "HealingActionCondition", TargetConfig = "TargetConfig", Extra = "Extra", @@ -61,10 +61,6 @@ public const string Filter = BasicAutoSwitch)] private static readonly bool _autoOffWhenDead = true; - [ConditionBool, UI("Auto turn off when dead in PvP.", - Filter = BasicAutoSwitch)] - private static readonly bool _autoOffWhenDeadPvP = true; - [ConditionBool, UI("Auto turn off when duty completed.", Filter = BasicAutoSwitch)] private static readonly bool _autoOffWhenDutyCompleted = true; @@ -104,9 +100,6 @@ public const string [JobConfig, UI("Only used automatically if coded into the rotation", Filter = AutoActionUsage, PvPFilter = JobFilterType.NoJob)] private readonly TinctureUseType _TinctureType = TinctureUseType.Nowhere; - - [JobConfig, UI("Ignore Invincibility for PvP purposes.", Filter = AutoActionUsage)] - public bool IgnorePvPInvincibility { get; set; } = false; [ConditionBool, UI("Automatically use Anti-Knockback role actions (Arms Length, Surecast)", Filter = AutoActionUsage)] private static readonly bool _useKnockback = true; @@ -119,10 +112,6 @@ public const string Filter = AutoActionUsage)] private static readonly bool _useMpPotions = false; - [JobConfig, UI("MP threshold under which to use Lucid Dreaming", Filter = AutoActionUsage)] - [Range(0, 10000, ConfigUnitType.None)] - public int LucidDreamingMpThreshold { get; set; } = 6000; - [ConditionBool, UI("Prioritize mob/object targets with attack markers", Filter = TargetConfig)] private static readonly bool _chooseAttackMark = true; @@ -643,9 +632,26 @@ public const string PvEFilter = JobFilterType.Tank)] [Range(1, 8, ConfigUnitType.None, 0.05f)] public int AutoDefenseNumber { get; set; } = 2; - #endregion + #endregion + + #region PvP + + [JobConfig, UI("Ignore Invincibility for PvP purposes.", Filter = PvPSpecificControls)] + private readonly bool _ignorePvPInvincibility = false; + + [ConditionBool, UI("Auto turn off when dead in PvP.", + Filter = PvPSpecificControls)] + private static readonly bool _autoOffWhenDeadPvP = true; + + #endregion + #region Jobs + + [JobConfig, UI("MP threshold under which to use Lucid Dreaming", Filter = HealingActionCondition)] + [Range(0, 10000, ConfigUnitType.None)] + private readonly int _lucidDreamingMpThreshold = 6000; + [JobConfig, Range(0, 1, ConfigUnitType.Percent)] private readonly float _healthAreaAbilityHot = 0.55f; diff --git a/RotationSolver/Data/UiString.cs b/RotationSolver/Data/UiString.cs index 22ad1987a..654b76ebe 100644 --- a/RotationSolver/Data/UiString.cs +++ b/RotationSolver/Data/UiString.cs @@ -681,6 +681,12 @@ internal enum UiString [Description("Recent Changes:")] WelcomeWindow_Changelog, + + [Description("Reorder AutoStatus Priorities")] + ConfigWindow_Auto_PrioritiesOrganizer, + + [Description("PvP Specific Controls")] + ConfigWindow_Auto_PvPSpecific, } public static class EnumExtensions diff --git a/RotationSolver/UI/RotationConfigWindow.cs b/RotationSolver/UI/RotationConfigWindow.cs index 9fc803460..1b484c72c 100644 --- a/RotationSolver/UI/RotationConfigWindow.cs +++ b/RotationSolver/UI/RotationConfigWindow.cs @@ -800,9 +800,9 @@ private static void DrawAbout() _aboutHeaders.Draw(); } - private void DrawAutoStatusOrderConfig() + private static void DrawAutoStatusOrderConfig() { - ImGui.Text("Reorder AutoStatus Priorities:"); + ImGui.Text(UiString.ConfigWindow_Auto_PrioritiesOrganizer.GetDescription()); ImGui.Spacing(); if (ImGui.Button("Reset to Default")) @@ -2847,7 +2847,11 @@ private static unsafe void DrawTargetData() { var target = Svc.Targets.Target; if (target == null) return; - + + ImGui.Text($"Targetting through invuln:{(target.HasStatus(true, StatusID.Guard) && (DataCenter.IsPvP && !Service.Config.IgnorePvPInvincibility || !DataCenter.IsPvP))}"); + ImGui.Text($"Guarding: {target.HasStatus(true, StatusID.Guard)}"); + ImGui.Text($"IsPvP: {DataCenter.IsPvP}"); + ImGui.Text($"IgnorePvPInvincibility: {Service.Config.IgnorePvPInvincibility}"); ImGui.Text($"Height: {target.Struct()->Height}"); ImGui.Text($"Kind: {target.GetObjectKind()}"); ImGui.Text($"SubKind: {target.GetBattleNPCSubKind()}"); diff --git a/RotationSolver/UI/RotationConfigWindow_Config.cs b/RotationSolver/UI/RotationConfigWindow_Config.cs index 96e6d592e..508525704 100644 --- a/RotationSolver/UI/RotationConfigWindow_Config.cs +++ b/RotationSolver/UI/RotationConfigWindow_Config.cs @@ -33,7 +33,7 @@ private static void DrawBasic() _baseHeader?.Draw(); } - private static readonly CollapsingHeaderGroup _baseHeader = new CollapsingHeaderGroup(new() + private static readonly CollapsingHeaderGroup _baseHeader = new CollapsingHeaderGroup(new Dictionary, Action> { { UiString.ConfigWindow_Basic_Timer.GetDescription, DrawBasicTimer }, { UiString.ConfigWindow_Basic_AutoSwitch.GetDescription, DrawBasicAutoSwitch }, @@ -110,7 +110,7 @@ private static void DrawBasicTimer() _allSearchable.DrawItems(Configs.BasicTimer); } - private static readonly CollapsingHeaderGroup _autoSwitch = new CollapsingHeaderGroup(new() + private static readonly CollapsingHeaderGroup _autoSwitch = new CollapsingHeaderGroup(new Dictionary, Action> { { UiString.ConfigWindow_Basic_SwitchCancelConditionSet.GetDescription, @@ -259,7 +259,7 @@ private static void DrawUI() _UIHeader?.Draw(); } - private static readonly CollapsingHeaderGroup _UIHeader = new CollapsingHeaderGroup(new() + private static readonly CollapsingHeaderGroup _UIHeader = new CollapsingHeaderGroup(new Dictionary, Action> { { UiString.ConfigWindow_UI_Information.GetDescription, @@ -282,27 +282,38 @@ private static void DrawUI() private void DrawAuto() { ImGui.TextWrapped(UiString.ConfigWindow_Auto_Description.GetDescription()); - DrawAutoStatusOrderConfig(); _autoHeader?.Draw(); } - private static readonly CollapsingHeaderGroup _autoHeader = new(new() + private static readonly CollapsingHeaderGroup _autoHeader = new(new Dictionary, Action> { - { UiString.ConfigWindow_Auto_ActionUsage.GetDescription, () => - { - ImGui.TextWrapped(UiString.ConfigWindow_Auto_ActionUsage_Description.GetDescription()); - ImGui.Separator(); - - _allSearchable.DrawItems(Configs.AutoActionUsage); - } - }, + { UiString.ConfigWindow_Auto_PrioritiesOrganizer.GetDescription, DrawAutoStatusOrderConfig }, + { UiString.ConfigWindow_Auto_ActionUsage.GetDescription, DrawActionUsageControl }, { UiString.ConfigWindow_Auto_HealingCondition.GetDescription, DrawHealingActionCondition }, + { UiString.ConfigWindow_Auto_PvPSpecific.GetDescription, DrawPvPSpecificControls }, { UiString.ConfigWindow_Auto_StateCondition.GetDescription, () => _autoState?.Draw() }, }) { HeaderSize = HeaderSize, }; + private static void DrawPvPSpecificControls() + { + ImGui.TextWrapped(UiString.ConfigWindow_Auto_PvPSpecific.GetDescription()); + ImGui.Separator(); + _allSearchable.DrawItems(Configs.PvPSpecificControls); + } + + /// + /// Draws the Action Usage and Control section. + /// + private static void DrawActionUsageControl() + { + ImGui.TextWrapped(UiString.ConfigWindow_Auto_ActionUsage_Description.GetDescription()); + ImGui.Separator(); + _allSearchable.DrawItems(Configs.AutoActionUsage); + } + /// /// Draws the healing action condition section. /// @@ -310,11 +321,10 @@ private static void DrawHealingActionCondition() { ImGui.TextWrapped(UiString.ConfigWindow_Auto_HealingCondition_Description.GetDescription()); ImGui.Separator(); - _allSearchable.DrawItems(Configs.HealingActionCondition); } - private static readonly CollapsingHeaderGroup _autoState = new(new() + private static readonly CollapsingHeaderGroup _autoState = new(new Dictionary, Action> { { UiString.ConfigWindow_Auto_HealAreaConditionSet.GetDescription, @@ -375,8 +385,8 @@ private static void DrawTarget() /// /// Header group for target-related configurations. /// - private static readonly CollapsingHeaderGroup _targetHeader = new(new() -{ + private static readonly CollapsingHeaderGroup _targetHeader = new(new Dictionary, Action> + { { UiString.ConfigWindow_Target_Config.GetDescription, DrawTargetConfig }, { UiString.ConfigWindow_List_Hostile.GetDescription, DrawTargetHostile }, { UiString.ConfigWindow_List_TargetPriority.GetDescription, DrawTargetPriority }, @@ -488,8 +498,8 @@ private static void DrawExtra() _extraHeader?.Draw(); } - private static readonly CollapsingHeaderGroup _extraHeader = new(new() -{ + private static readonly CollapsingHeaderGroup _extraHeader = new(new Dictionary, Action> + { { UiString.ConfigWindow_EventItem.GetDescription, DrawEventTab }, { UiString.ConfigWindow_Extra_Others.GetDescription, From 86c0182e83b6052e53fdab336c2d0613098ae3b0 Mon Sep 17 00:00:00 2001 From: Crito Date: Wed, 8 Jan 2025 20:58:14 -0600 Subject: [PATCH 3/3] I found you, silly attackable logic --- RotationSolver.Basic/Helpers/ObjectHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RotationSolver.Basic/Helpers/ObjectHelper.cs b/RotationSolver.Basic/Helpers/ObjectHelper.cs index 4da1579d1..3c584776a 100644 --- a/RotationSolver.Basic/Helpers/ObjectHelper.cs +++ b/RotationSolver.Basic/Helpers/ObjectHelper.cs @@ -93,7 +93,7 @@ internal static bool IsAttackable(this IBattleChara battleChara) foreach (var status in battleChara.StatusList) { - if (StatusHelper.IsInvincible(status)) return false; + if (StatusHelper.IsInvincible(status) && (DataCenter.IsPvP && !Service.Config.IgnorePvPInvincibility || !DataCenter.IsPvP)) return false; } if (Svc.ClientState == null) return false;