From 484efafc2b06aaabe036c33b1605ea3f45a69991 Mon Sep 17 00:00:00 2001 From: LTS-FFXIV <127939494+LTS-FFXIV@users.noreply.github.com> Date: Sun, 17 Nov 2024 04:37:17 -0600 Subject: [PATCH] Update ECommons submodule and add null checks to prevent bricking due to statuses without names Updated the ECommons submodule commit to `71ee09f7cc2230a73503b945422760da1368405c`. Added `System.Linq` to `using` directives in `DataCenter.cs`. Modified `DispelTarget` property in `DataCenter` class to include null checks for statuses in `StatusList` before calling `StatusHelper` methods (`CanDispel` and `IsDangerous`). Added null checks in `IsPriority`, `IsDangerous`, and `CanDispel` methods in `StatusHelper.cs` to ensure the `status` parameter is not null. --- ECommons | 2 +- RotationSolver.Basic/DataCenter.cs | 7 ++++--- RotationSolver.Basic/Helpers/StatusHelper.cs | 3 +++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/ECommons b/ECommons index b99ba7a86..71ee09f7c 160000 --- a/ECommons +++ b/ECommons @@ -1 +1 @@ -Subproject commit b99ba7a861300164b9b293b2bbbd510af0cda8a2 +Subproject commit 71ee09f7cc2230a73503b945422760da1368405c diff --git a/RotationSolver.Basic/DataCenter.cs b/RotationSolver.Basic/DataCenter.cs index 406f39252..5aa266a9d 100644 --- a/RotationSolver.Basic/DataCenter.cs +++ b/RotationSolver.Basic/DataCenter.cs @@ -12,6 +12,7 @@ using RotationSolver.Basic.Configuration.Conditions; using RotationSolver.Basic.Rotations.Duties; using Svg.FilterEffects; +using System.Linq; using Action = Lumina.Excel.Sheets.Action; using CharacterManager = FFXIVClientStructs.FFXIV.Client.Game.Character.CharacterManager; @@ -471,11 +472,11 @@ public static IBattleChara? DispelTarget get { var weakenPeople = DataCenter.PartyMembers? - .Where(o => o is IBattleChara b && b.StatusList != null && b.StatusList.Any(StatusHelper.CanDispel)) ?? Enumerable.Empty(); + .Where(o => o is IBattleChara b && b.StatusList != null && b.StatusList.Any(status => status != null && StatusHelper.CanDispel(status))) ?? Enumerable.Empty(); var weakenNPC = DataCenter.FriendlyNPCMembers? - .Where(o => o is IBattleChara b && b.StatusList != null && b.StatusList.Any(StatusHelper.CanDispel)) ?? Enumerable.Empty(); + .Where(o => o is IBattleChara b && b.StatusList != null && b.StatusList.Any(status => status != null && StatusHelper.CanDispel(status))) ?? Enumerable.Empty(); var dyingPeople = weakenPeople - .Where(o => o is IBattleChara b && b.StatusList != null && b.StatusList.Any(StatusHelper.IsDangerous)); + .Where(o => o is IBattleChara b && b.StatusList != null && b.StatusList.Any(status => status != null && StatusHelper.IsDangerous(status))); return dyingPeople.OrderBy(ObjectHelper.DistanceToPlayer).FirstOrDefault() ?? weakenPeople.OrderBy(ObjectHelper.DistanceToPlayer).FirstOrDefault() diff --git a/RotationSolver.Basic/Helpers/StatusHelper.cs b/RotationSolver.Basic/Helpers/StatusHelper.cs index af1bc4c28..bb9f21c90 100644 --- a/RotationSolver.Basic/Helpers/StatusHelper.cs +++ b/RotationSolver.Basic/Helpers/StatusHelper.cs @@ -364,6 +364,7 @@ public static bool IsInvincible(this Status status) /// True if the status is a priority, otherwise false. public static bool IsPriority(this Status status) { + if (status == null) return false; return OtherConfiguration.PriorityStatus.Any(id => (uint)id == status.StatusId); } @@ -374,6 +375,7 @@ public static bool IsPriority(this Status status) /// True if the status needs to be dispelled, otherwise false. public static bool IsDangerous(this Status status) { + if (status == null) return false; if (!status.CanDispel()) return false; if (status.StackCount > 2) return true; if (status.RemainingTime > 20) return true; @@ -387,6 +389,7 @@ public static bool IsDangerous(this Status status) /// True if the status can be dispelled, otherwise false. public static bool CanDispel(this Status status) { + if (status == null) return false; return status.GameData.Value.CanDispel && status.RemainingTime > 1 + DataCenter.DefaultGCDRemain; } }