From 4654e4cbfbb621a14ae459fd74c00bf359f4b36e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E6=B0=B4?= <1123993881@qq.com> Date: Mon, 28 Aug 2023 09:46:15 +0800 Subject: [PATCH] fix: add integer value into the action sequencer. --- RotationSolver.Basic/DataCenter.cs | 2 ++ .../Rotations/CustomRotation_Actions.cs | 2 +- .../Rotations/CustomRotation_OtherInfo.cs | 16 ++++++++++++- .../Rotations/ICustomRotation.cs | 2 +- .../ActionSequencer/RotationCondition.cs | 24 +++++++++++++++---- .../Localization/EnumTranslations.cs | 3 ++- RotationSolver/Localization/Strings.cs | 3 +++ RotationSolver/Updaters/TargetUpdater.cs | 4 ++++ 8 files changed, 47 insertions(+), 9 deletions(-) diff --git a/RotationSolver.Basic/DataCenter.cs b/RotationSolver.Basic/DataCenter.cs index d4818e9a4..10ede196b 100644 --- a/RotationSolver.Basic/DataCenter.cs +++ b/RotationSolver.Basic/DataCenter.cs @@ -242,6 +242,8 @@ public static void SetSpecialType(SpecialCommandType specialType) public static bool HasHostilesInMaxRange => NumberOfHostilesInMaxRange > 0; public static int NumberOfHostilesInRange { get; internal set; } public static int NumberOfHostilesInMaxRange { get; internal set; } + public static int NumberOfAllHostilesInRange { get; internal set; } + public static int NumberOfAllHostilesInMaxRange { get; internal set; } public static bool MobsTime { get; internal set; } public static float AverageDeadTime { get; internal set; } diff --git a/RotationSolver.Basic/Rotations/CustomRotation_Actions.cs b/RotationSolver.Basic/Rotations/CustomRotation_Actions.cs index 8967394a2..294b728c7 100644 --- a/RotationSolver.Basic/Rotations/CustomRotation_Actions.cs +++ b/RotationSolver.Basic/Rotations/CustomRotation_Actions.cs @@ -298,7 +298,7 @@ public override bool CanUse(out IAction act, CanUseOption option = CanUseOption. public PropertyInfo[] AllBools => _allBools ??= GetType().GetStaticProperties(); PropertyInfo[] _allBytes; - public PropertyInfo[] AllBytes => _allBytes ??= GetType().GetStaticProperties(); + public PropertyInfo[] AllBytesOrInt => _allBytes ??= GetType().GetStaticProperties().Union(GetType().GetStaticProperties()).ToArray(); PropertyInfo[] _allFloats; public PropertyInfo[] AllFloats => _allFloats ??= GetType().GetStaticProperties(); diff --git a/RotationSolver.Basic/Rotations/CustomRotation_OtherInfo.cs b/RotationSolver.Basic/Rotations/CustomRotation_OtherInfo.cs index be4a91bed..5282faadb 100644 --- a/RotationSolver.Basic/Rotations/CustomRotation_OtherInfo.cs +++ b/RotationSolver.Basic/Rotations/CustomRotation_OtherInfo.cs @@ -2,7 +2,6 @@ using Dalamud.Game.ClientState.Conditions; using Dalamud.Game.ClientState.Objects.SubKinds; using ECommons.DalamudServices; -using RotationSolver.Basic.Configuration; namespace RotationSolver.Basic.Rotations; public abstract partial class CustomRotation @@ -159,6 +158,21 @@ public abstract partial class CustomRotation /// protected static IEnumerable HostileTargets => DataCenter.HostileTargets; + /// + /// How many hostile targets in range? 25 for ranged jobs and healer, 3 for melee and tank. This is all can attack. + /// + public static int NumberOfAllHostilesInRange => DataCenter.NumberOfAllHostilesInRange; + + /// + /// How many hostile targets in max range (25 yalms) regardless of job. This is all can attack. + /// + public static int NumberOfAllHostilesInMaxRange => DataCenter.NumberOfAllHostilesInMaxRange; + + /// + /// All hostile Targets. This is all can attack. + /// + protected static IEnumerable AllHostileTargets => DataCenter.AllHostileTargets; + /// /// Average dead time of hostiles. /// diff --git a/RotationSolver.Basic/Rotations/ICustomRotation.cs b/RotationSolver.Basic/Rotations/ICustomRotation.cs index a762fe541..8c850a0d6 100644 --- a/RotationSolver.Basic/Rotations/ICustomRotation.cs +++ b/RotationSolver.Basic/Rotations/ICustomRotation.cs @@ -97,7 +97,7 @@ public interface ICustomRotation : ITexture /// /// All byte properties. /// - PropertyInfo[] AllBytes { get; } + PropertyInfo[] AllBytesOrInt { get; } /// /// All time methods. diff --git a/RotationSolver/ActionSequencer/RotationCondition.cs b/RotationSolver/ActionSequencer/RotationCondition.cs index a763a2db6..267fc9796 100644 --- a/RotationSolver/ActionSequencer/RotationCondition.cs +++ b/RotationSolver/ActionSequencer/RotationCondition.cs @@ -44,9 +44,11 @@ public override bool IsTrueInside(ICustomRotation rotation) } return false; - case ComboConditionType.Byte: + case ComboConditionType.Integer: if (_prop == null) return false; - if (_prop.GetValue(rotation) is byte by) + + var value = _prop.GetValue(rotation); + if (value is byte by) { switch (Condition) { @@ -58,6 +60,18 @@ public override bool IsTrueInside(ICustomRotation rotation) return by == Param1; } } + else if (value is int i) + { + switch (Condition) + { + case 0: + return i > Param1; + case 1: + return i < Param1; + case 2: + return i == Param1; + } + } return false; case ComboConditionType.Float: @@ -125,9 +139,9 @@ public override void DrawInside(ICustomRotation rotation) break; - case ComboConditionType.Byte: + case ComboConditionType.Integer: ImGui.SameLine(); - ConditionHelper.SearchItemsReflection($"##ByteChoice{GetHashCode()}", _prop?.GetMemberName(), ref searchTxt, rotation.AllBytes, i => + ConditionHelper.SearchItemsReflection($"##ByteChoice{GetHashCode()}", _prop?.GetMemberName(), ref searchTxt, rotation.AllBytesOrInt, i => { _prop = i; PropertyName = i.Name; @@ -216,7 +230,7 @@ public override void DrawInside(ICustomRotation rotation) public enum ComboConditionType : byte { Bool, - Byte, + Integer, Float, Last, } diff --git a/RotationSolver/Localization/EnumTranslations.cs b/RotationSolver/Localization/EnumTranslations.cs index 216c6cddd..5ef0c705c 100644 --- a/RotationSolver/Localization/EnumTranslations.cs +++ b/RotationSolver/Localization/EnumTranslations.cs @@ -10,6 +10,7 @@ internal static class EnumTranslations TargetConditionType.HasStatus => LocalizationManager.RightLang.TargetConditionType_HasStatus, TargetConditionType.IsDying => LocalizationManager.RightLang.TargetConditionType_IsDying, TargetConditionType.IsBoss => LocalizationManager.RightLang.TargetConditionType_IsBoss, + TargetConditionType.InCombat => LocalizationManager.RightLang.TargetConditionType_InCombat, TargetConditionType.Distance => LocalizationManager.RightLang.TargetConditionType_Distance, TargetConditionType.StatusEnd => LocalizationManager.RightLang.TargetConditionType_StatusEnd, TargetConditionType.StatusEndGCD => LocalizationManager.RightLang.TargetConditionType_StatusEndGCD, @@ -22,7 +23,7 @@ internal static class EnumTranslations internal static string ToName(this ComboConditionType type) => type switch { ComboConditionType.Bool => LocalizationManager.RightLang.ComboConditionType_Bool, - ComboConditionType.Byte => LocalizationManager.RightLang.ComboConditionType_Byte, + ComboConditionType.Integer => LocalizationManager.RightLang.ComboConditionType_Byte, ComboConditionType.Float => LocalizationManager.RightLang.ComboConditionType_Float, ComboConditionType.Last => LocalizationManager.RightLang.ComboConditionType_Last, _ => string.Empty, diff --git a/RotationSolver/Localization/Strings.cs b/RotationSolver/Localization/Strings.cs index 7183e8e98..9cfda785a 100644 --- a/RotationSolver/Localization/Strings.cs +++ b/RotationSolver/Localization/Strings.cs @@ -371,6 +371,7 @@ internal partial class Strings public string TargetConditionType_HasStatus { get; set; } = "Has Status"; public string TargetConditionType_IsDying { get; set; } = "Is Dying"; public string TargetConditionType_IsBoss { get; set; } = "Is Boss"; + public string TargetConditionType_InCombat { get; set; } = "In Combat"; public string TargetConditionType_Distance { get; set; } = "Distance"; public string TargetConditionType_StatusEnd { get; set; } = "Status End"; public string TargetConditionType_DeadTime { get; set; } = "Dead Time"; @@ -417,6 +418,8 @@ internal partial class Strings { nameof(CustomRotation.HasHostilesInRange), "Has hostiles in Range"}, { nameof(CustomRotation.NumberOfHostilesInRange), "The number of hostiles in Range"}, { nameof(CustomRotation.NumberOfHostilesInMaxRange), "The number of hostiles in max Range"}, + { nameof(CustomRotation.NumberOfAllHostilesInRange), "The number of all hostiles in Range"}, + { nameof(CustomRotation.NumberOfAllHostilesInMaxRange), "The number of all hostiles in max Range"}, { nameof(CustomRotation.InBurst), "In burst."}, { nameof(CustomRotation.CanHealAreaAbility), "Can heal area ability"}, diff --git a/RotationSolver/Updaters/TargetUpdater.cs b/RotationSolver/Updaters/TargetUpdater.cs index 779a066e2..c84692894 100644 --- a/RotationSolver/Updaters/TargetUpdater.cs +++ b/RotationSolver/Updaters/TargetUpdater.cs @@ -126,6 +126,10 @@ private unsafe static void UpdateHostileTargets(IEnumerable allTarg DataCenter.NumberOfHostilesInMaxRange = DataCenter.HostileTargets.Count(o => o.DistanceToPlayer() <= 25); + DataCenter.NumberOfAllHostilesInRange = DataCenter.AllHostileTargets.Count(o => o.DistanceToPlayer() <= JobRange); + + DataCenter.NumberOfAllHostilesInMaxRange = DataCenter.AllHostileTargets.Count(o => o.DistanceToPlayer() <= 25); + DataCenter.MobsTime = DataCenter.HostileTargets.Count(o => o.DistanceToPlayer() <= JobRange && o.CanSee()) >= Service.Config.GetValue(PluginConfigInt.AutoDefenseNumber);