From 969d9580f5d4d1c0dd178c74cdf502bc7682aea3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E6=B0=B4?= <1123993881@qq.com> Date: Tue, 7 Mar 2023 11:05:32 +0800 Subject: [PATCH] fix: add an offset option for melee or tank using range action. --- RotationSolver/Actions/BaseAction/BaseAction_Target.cs | 4 ++-- RotationSolver/Configuration/PluginConfiguration.cs | 1 + RotationSolver/Helpers/TargetFilter.cs | 7 +++++-- RotationSolver/Localization/Strings_Major.cs | 4 ++++ RotationSolver/Rotations/Basic/DRG_Base.cs | 5 ++++- RotationSolver/Rotations/Basic/DRK_Base.cs | 2 +- RotationSolver/Rotations/Basic/GNB_Base.cs | 5 ++++- RotationSolver/Rotations/Basic/NIN_Base.cs | 5 ++++- RotationSolver/Rotations/Basic/PLD_Base.cs | 2 +- RotationSolver/Rotations/Basic/RPR_Base.cs | 3 ++- RotationSolver/Rotations/Basic/SAM_Base.cs | 5 ++++- RotationSolver/Rotations/Basic/WAR_Base.cs | 2 +- .../Rotations/CustomRotation/CustomRotation_Actions.cs | 2 +- RotationSolver/Windows/RotationConfigWindow_Param.cs | 4 ++++ 14 files changed, 38 insertions(+), 13 deletions(-) diff --git a/RotationSolver/Actions/BaseAction/BaseAction_Target.cs b/RotationSolver/Actions/BaseAction/BaseAction_Target.cs index 7189e3bf5..992eddff0 100644 --- a/RotationSolver/Actions/BaseAction/BaseAction_Target.cs +++ b/RotationSolver/Actions/BaseAction/BaseAction_Target.cs @@ -47,7 +47,7 @@ private get set => _choiceTarget = value; } - internal Func, IEnumerable> FilterForTarget { private get; set; } = null; + internal Func, IEnumerable> FilterForHostiles { private get; set; } = null; public StatusID[] TargetStatus { get; set; } = null; @@ -440,7 +440,7 @@ internal bool CanGetTarget(BattleChara target, BattleChara subTarget) private IEnumerable TargetFilterFuncEot(IEnumerable tars, bool mustUse) { - if (FilterForTarget != null) return FilterForTarget(tars); + if (FilterForHostiles != null) return FilterForHostiles(tars); if (TargetStatus == null || !_isEot) return tars; var dontHave = tars.Where(CheckStatus); diff --git a/RotationSolver/Configuration/PluginConfiguration.cs b/RotationSolver/Configuration/PluginConfiguration.cs index f40e0f2fe..851e6b828 100644 --- a/RotationSolver/Configuration/PluginConfiguration.cs +++ b/RotationSolver/Configuration/PluginConfiguration.cs @@ -79,6 +79,7 @@ public class PluginConfiguration : IPluginConfiguration public bool UseHealWhenNotAHealer = true; public float ObjectMinRadius = 0f; public float HealthDifference = 0.25f; + public float MeleeRangeOffset = 1; public bool TargetFriendly = false; public Dictionary HealingOfTimeSubtractSingles { get; set; } = new Dictionary(); diff --git a/RotationSolver/Helpers/TargetFilter.cs b/RotationSolver/Helpers/TargetFilter.cs index 29034544c..2f0b828de 100644 --- a/RotationSolver/Helpers/TargetFilter.cs +++ b/RotationSolver/Helpers/TargetFilter.cs @@ -14,6 +14,8 @@ namespace RotationSolver.Helpers; internal static class TargetFilter { #region Find one target + internal static IEnumerable MeleeRangeTargetFilter(IEnumerable availableCharas) + => availableCharas.Where(t => t.DistanceToPlayer() >= 3 + Service.Configuration.MeleeRangeOffset); internal static BattleChara DefaultChooseFriend(IEnumerable availableCharas, bool mustUse) { if (availableCharas == null || !availableCharas.Any()) return null; @@ -155,6 +157,9 @@ internal static BattleChara FindAttackedTarget(IEnumerable charas, return attachedT.OrderBy(ObjectHelper.GetHealthRatio).FirstOrDefault(); } + internal static IEnumerable TankRangeTarget(IEnumerable inputCharas) + => ProvokeTarget(MeleeRangeTargetFilter(inputCharas)); + /// /// 挑衅目标 /// @@ -344,8 +349,6 @@ internal static IEnumerable GetObjectInRadius(this IEnumerable objects, return objects.Where(o => o.DistanceToPlayer() <= radius); } - - private static IEnumerable DefaultTargetingType(IEnumerable charas) { switch (RSCommands.TargetingType) diff --git a/RotationSolver/Localization/Strings_Major.cs b/RotationSolver/Localization/Strings_Major.cs index 37ef6d4af..ed0c4192d 100644 --- a/RotationSolver/Localization/Strings_Major.cs +++ b/RotationSolver/Localization/Strings_Major.cs @@ -187,8 +187,12 @@ internal partial class Strings public string Configwindow_Param_HealingOfTimeSubtractArea { get; set; } = "Set the HP threshold reduce with hot effect(AOE)"; public string Configwindow_Param_HealthSingleAbility { get; set; } = "Set the HP threshold for using single healing ability"; public string Configwindow_Param_HealthSingleSpell { get; set; } = "Set the HP threshold for using single healing spell"; + + public string Configwindow_Param_HealingOfTimeSubtractSingle { get; set; } = "Set the HP threshold reduce with hot effect(single)"; public string Configwindow_Param_HealthForDyingTank { get; set; } = "Set the HP threshold for tank to use invincibility"; + + public string Configwindow_Param_MeleeRangeOffset { get; set; } = "Melee Range action using offset"; public string Configwindow_Param_Target { get; set; } = "Target"; public string Configwindow_Param_RightNowTargetToHostileType { get; set; } = "Hostile target filtering condition"; public string Configwindow_Param_TargetToHostileType1 { get; set; } = "All targets can attack"; diff --git a/RotationSolver/Rotations/Basic/DRG_Base.cs b/RotationSolver/Rotations/Basic/DRG_Base.cs index 92eb23068..e87ae0277 100644 --- a/RotationSolver/Rotations/Basic/DRG_Base.cs +++ b/RotationSolver/Rotations/Basic/DRG_Base.cs @@ -68,7 +68,10 @@ internal abstract class DRG_Base : CustomRotation.CustomRotation /// /// �ᴩ�� /// - public static IBaseAction PiercingTalon { get; } = new BaseAction(ActionID.PiercingTalon); + public static IBaseAction PiercingTalon { get; } = new BaseAction(ActionID.PiercingTalon) + { + FilterForHostiles = TargetFilter.MeleeRangeTargetFilter, + }; /// /// ����ǹ diff --git a/RotationSolver/Rotations/Basic/DRK_Base.cs b/RotationSolver/Rotations/Basic/DRK_Base.cs index f04199348..2c1f8b03d 100644 --- a/RotationSolver/Rotations/Basic/DRK_Base.cs +++ b/RotationSolver/Rotations/Basic/DRK_Base.cs @@ -74,7 +74,7 @@ protected static bool DarkSideEndAfterGCD(uint gctCount = 0, uint abilityCount = /// public static IBaseAction Unmend { get; } = new BaseAction(ActionID.Unmend) { - FilterForTarget = b => TargetFilter.ProvokeTarget(b), + FilterForHostiles = TargetFilter.TankRangeTarget, }; /// diff --git a/RotationSolver/Rotations/Basic/GNB_Base.cs b/RotationSolver/Rotations/Basic/GNB_Base.cs index f8072ca0a..86eef11a3 100644 --- a/RotationSolver/Rotations/Basic/GNB_Base.cs +++ b/RotationSolver/Rotations/Basic/GNB_Base.cs @@ -73,7 +73,10 @@ internal abstract class GNB_Base : CustomRotation.CustomRotation /// /// ���׵� /// - public static IBaseAction LightningShot { get; } = new BaseAction(ActionID.LightningShot); + public static IBaseAction LightningShot { get; } = new BaseAction(ActionID.LightningShot) + { + FilterForHostiles = TargetFilter.TankRangeTarget, + }; /// /// Σ������ diff --git a/RotationSolver/Rotations/Basic/NIN_Base.cs b/RotationSolver/Rotations/Basic/NIN_Base.cs index b8493e707..1cada14fc 100644 --- a/RotationSolver/Rotations/Basic/NIN_Base.cs +++ b/RotationSolver/Rotations/Basic/NIN_Base.cs @@ -66,7 +66,10 @@ internal NinAction(ActionID actionID, params IBaseAction[] ninjutsus) /// /// 飞刀 /// - public static IBaseAction ThrowingDagger { get; } = new BaseAction(ActionID.ThrowingDagger); + public static IBaseAction ThrowingDagger { get; } = new BaseAction(ActionID.ThrowingDagger) + { + FilterForHostiles = TargetFilter.MeleeRangeTargetFilter, + }; /// /// 夺取 diff --git a/RotationSolver/Rotations/Basic/PLD_Base.cs b/RotationSolver/Rotations/Basic/PLD_Base.cs index 503f83b0e..cb593c9cd 100644 --- a/RotationSolver/Rotations/Basic/PLD_Base.cs +++ b/RotationSolver/Rotations/Basic/PLD_Base.cs @@ -68,7 +68,7 @@ internal abstract class PLD_Base : CustomRotation.CustomRotation /// public static IBaseAction ShieldLob { get; } = new BaseAction(ActionID.ShieldLob) { - FilterForTarget = b => TargetFilter.ProvokeTarget(b), + FilterForHostiles = TargetFilter.TankRangeTarget, }; /// diff --git a/RotationSolver/Rotations/Basic/RPR_Base.cs b/RotationSolver/Rotations/Basic/RPR_Base.cs index 3f5a3e0ad..29814d177 100644 --- a/RotationSolver/Rotations/Basic/RPR_Base.cs +++ b/RotationSolver/Rotations/Basic/RPR_Base.cs @@ -266,7 +266,8 @@ internal PRPAction(ActionID actionID, bool isFriendly = false, bool shouldEndSpe /// public static IBaseAction Harpe { get; } = new BaseAction(ActionID.Harpe) { - ActionCheck = b => !SoulReaver + ActionCheck = b => !SoulReaver, + FilterForHostiles = TargetFilter.MeleeRangeTargetFilter, }; /// diff --git a/RotationSolver/Rotations/Basic/SAM_Base.cs b/RotationSolver/Rotations/Basic/SAM_Base.cs index c9e780b58..0043729f7 100644 --- a/RotationSolver/Rotations/Basic/SAM_Base.cs +++ b/RotationSolver/Rotations/Basic/SAM_Base.cs @@ -207,7 +207,10 @@ internal abstract class SAM_Base : CustomRotation.CustomRotation /// /// ��� /// - public static IBaseAction Enpi { get; } = new BaseAction(ActionID.Enpi); + public static IBaseAction Enpi { get; } = new BaseAction(ActionID.Enpi) + { + FilterForHostiles = TargetFilter.MeleeRangeTargetFilter, + }; /// /// ����ֹˮ diff --git a/RotationSolver/Rotations/Basic/WAR_Base.cs b/RotationSolver/Rotations/Basic/WAR_Base.cs index a8fe267ed..34f6bfd80 100644 --- a/RotationSolver/Rotations/Basic/WAR_Base.cs +++ b/RotationSolver/Rotations/Basic/WAR_Base.cs @@ -50,7 +50,7 @@ internal abstract class WAR_Base : CustomRotation.CustomRotation /// public static IBaseAction Tomahawk { get; } = new BaseAction(ActionID.Tomahawk) { - FilterForTarget = b => TargetFilter.ProvokeTarget(b), + FilterForHostiles = TargetFilter.TankRangeTarget, }; /// diff --git a/RotationSolver/Rotations/CustomRotation/CustomRotation_Actions.cs b/RotationSolver/Rotations/CustomRotation/CustomRotation_Actions.cs index d6300f873..831e96174 100644 --- a/RotationSolver/Rotations/CustomRotation/CustomRotation_Actions.cs +++ b/RotationSolver/Rotations/CustomRotation/CustomRotation_Actions.cs @@ -127,7 +127,7 @@ internal RoleAction(ActionID actionID, JobRole[] roles, bool isFriendly = false, /// public static IBaseAction Provoke { get; } = new RoleAction(ActionID.Provoke, new JobRole[] { JobRole.Tank }, isTimeline: true) { - FilterForTarget = b => TargetFilter.ProvokeTarget(b), + FilterForHostiles = b => TargetFilter.ProvokeTarget(b), }; /// diff --git a/RotationSolver/Windows/RotationConfigWindow_Param.cs b/RotationSolver/Windows/RotationConfigWindow_Param.cs index ae22b68ba..b138526aa 100644 --- a/RotationSolver/Windows/RotationConfigWindow_Param.cs +++ b/RotationSolver/Windows/RotationConfigWindow_Param.cs @@ -323,6 +323,10 @@ private void DrawParamCondition() ref Service.Configuration.HealOutOfCombat); const float speed = 0.005f; + + DrawFloatNumber(LocalizationManager.RightLang.Configwindow_Param_MeleeRangeOffset, + ref Service.Configuration.MeleeRangeOffset, 5 * speed, max: 5); + DrawFloatNumber(LocalizationManager.RightLang.Configwindow_Param_HealthDifference, ref Service.Configuration.HealthDifference, speed * 2, 0, 0.5f);